Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   события и вложенные элементы (https://javascript.ru/forum/events/10389-sobytiya-i-vlozhennye-ehlementy.html)

KOLANICH 02.07.2010 00:19

события и вложенные элементы
 
<div id="main">
<div class="qwerty"><span>qwerrtt</span><div>тут куча элементов</div>
<div class="qwerty"><span>qwert</span><div>тут куча элементов</div>
<div class="qwerty"><span>dfdfdfd</span><div>тут куча элементов</div>
...
</div>


<div>

вешаю обработчик события onmouseover на div который main
надо получить див, который вложен (class="qwerty") и внутри которого курсор мыши
дивов много, так что вешание индивидуального обработчика на каждый-бессмысленный расход памяти

exec 02.07.2010 13:41

target/srcElement

KOLANICH 02.07.2010 20:56

target указывает на непоследственного адресата события
srcElement -аналог для эксплорера

Octane 03.07.2010 00:04

Читайте внимательно статью, там все написано.

KOLANICH 03.07.2010 00:29

повторяю, вешать на всё свою слушалку нельзя - элементов очень много

Octane 03.07.2010 01:00

<div class="qwerty"> забыли закрыть или они вложенные?

<div id="main">
	<div class="qwerty">
		<span>qwerrtt</span>
		<div>тут куча элементов</div>
	</div>
	<div class="qwerty">
		<span>qwert</span>
		<div>тут куча элементов</div>
	</div>
	<div class="qwerty">
		<span>dfdfdfd</span>
		<div>тут куча элементов</div>
	</div>
</div>
<script type="text/javascript">
document.getElementById("main").onclick = function (event) {
	event = event || window.event;
	var target = event.target || event.srcElement;
	while ((" " + target.className + " ").indexOf(" qwerty ") == -1) {
		if (target == this) {
			return;
		}
		target = target.parentNode;
	}
	target.style.backgroundColor = "#f00";
};
</script>

KOLANICH 04.07.2010 20:32

кажется забыл закрыть...
спс, щас опробую

KOLANICH 04.07.2010 21:14

а зачем (" " + target.className + " ")
почему нельзя просто target.className ???

и зачем нужно условие target==this ?
как target может быть равен объекту, создаваемому функцией?

Octane 04.07.2010 21:18

Потому что у элемента может быть много CSS-классов.
<… class="someclass1 someclass2 …">

CSS-классы отделяются пробельными символа, поэтому по хорошему нужно использовать регулярное выражение, но в простейшем варианте достаточно
(" " + element.className + " ").indexOf(" " + CSSClassName + " ")

KOLANICH 04.07.2010 21:35

спасибо
а 2й вопрос?

Octane 04.07.2010 21:42

Цитата:

Сообщение от KOLANICH
и зачем нужно условие target==this ?
как target может быть равен объекту, создаваемому функцией?

Что такое объект, создаваемый функцией?

this — контекст вызова функции. Функции-обработчики событий вызываются в контексте DOM-элемента (исключение attachEvent в IE). Не ленитесь, читайте статьи о событиях на этом сайте.

KOLANICH 04.07.2010 23:15

ясно,то есть target==this когда объектом является тот элемент,к которому приделано событие
спс

KOLANICH 04.07.2010 23:37

не особо работает
по непонятной причине проходит до document, а дальше до null
нашёл причину this оказался window

Octane 04.07.2010 23:41

Как вы назначаете обработчик события?

KOLANICH 04.07.2010 23:44

rxq.results["types"][0].parentNode.addEventListener

где rxq.results["types"][0] - элемент, вложенный в "наш корневой див"
в примере это <div id="main">
у меня браузер файрфокс

Octane 04.07.2010 23:47

Этого кода не достаточно, покажите вместе с обработчиком событий

KOLANICH 05.07.2010 10:57

разобрался, в чём проблема

ещё вопрос
почему не работает
rxq.results["products"][0].parentNode.addEventListener('click',function(evt){
							
							addToList(el,txtel);
							evt.stopPropagation();
							evt.preventDefault();
							
						},true);

действие по умолчанию всё равно срабатывает

Riim 05.07.2010 11:47

evt || (evt = window.event);

KOLANICH 05.07.2010 13:25

разобрался уже - в скрипте была ошибка

KOLANICH 05.07.2010 13:26

всем спасибо


Часовой пояс GMT +3, время: 20:50.