Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.04.2014, 00:39
Новичок на форуме
Отправить личное сообщение для brokenwind Посмотреть профиль Найти все сообщения от brokenwind
 
Регистрация: 14.04.2014
Сообщений: 6

Правильное всплытие события (делегирование)
здравствуйте, дорогие форумчане!

есть вопрос. не могу "добраться" до div'a по клику.
когда data-property установлен на ul, все работает хорошо.
а когда вешаю атрибут на div:
<div data-property='yes'>
<ul>#event
 <li>"new"</li>
 <li>"fuck"</li>
 <li>"there"</li>
 <li>"death"</li>
 <li>"new"</li>
 <li>"new"</li>
 <li>"oo"</li>
</ul>
</div>


не получается ничего. через console.log(target) вижу в только ul и li, которые расположены внутри div, то есть "сверху".

как заставить JS target'ом захватить div

искать по всем родительским узлам пока не найдется data-property не хочется. есть ли более элегантное решение?

код JS такой:

(function() {
   
    var app = {
         
        initialise: function () {          
            this.modules();
            this.setUpListeners();
        },
 
        modules: function () {
 
        },
 
        setUpListeners: function () {
			document.addEventListener('click', this.firstAction, false);
        },
 
        firstAction: function (e) {   
		//event.preventDefault(event);
			e = e || window.e;
			var target = e.target || e.srcElement;
			var yourData = target.getAttribute('data-property'); 
			if (yourData) alert('yes, baby, yes');
		}
	};      
         
    app.initialise();
 
}());


спасибо!

Последний раз редактировалось brokenwind, 14.04.2014 в 00:55.
Ответить с цитированием
  #2 (permalink)  
Старый 14.04.2014, 09:38
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от brokenwind
как заставить JS target'ом захватить div
Как вариант...

<!DOCTYPE html>
<html>
<head>
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
ul {
	padding: 10px;
	border: 1px solid;
}
li {
	margin: 10px;
	border: 1px solid;
}
</style>
<script type='text/javascript'>
window.onload=function (){
	document.addEventListener('click', function (e) {
		e = e || window.e;
		var target = e.target || e.srcElement;
		var data;
		if (target.className=='one') {data=target.parentNode};
		if (target.className=='two') {data=target.parentNode.parentNode};
		if (data) {
			alert(data.getAttribute('data-property'));
		};
	}, false);
};
</script>
</head>
<body>
<div id='test' data-property='yes'>
	<ul class='one'>
		<li class='two'>"new"</li>
		<li class='two'>"fuck"</li>
		<li class='two'>"there"</li>
		<li class='two'>"death"</li>
		<li class='two'>"new"</li>
		<li class='two'>"new"</li>
		<li class='two'>"oo"</li>
	</ul>
</div>
</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 15.04.2014, 03:06
Новичок на форуме
Отправить личное сообщение для brokenwind Посмотреть профиль Найти все сообщения от brokenwind
 
Регистрация: 14.04.2014
Сообщений: 6

ksa, спасибо за вариант, но, фактически, это и есть старый добрый перебор родителей вверх по дереву.

anyway, спасибо за совет )
Ответить с цитированием
  #4 (permalink)  
Старый 15.04.2014, 03:35
Новичок на форуме
Отправить личное сообщение для brokenwind Посмотреть профиль Найти все сообщения от brokenwind
 
Регистрация: 14.04.2014
Сообщений: 6

вобщем, пришлось дедовским способом делать - через логическое или.

(function() {

var targeter = function (e) {
	e = e || window.e;
	var target = e.target || e.srcElement;
	if (target.nodeName === 'HTML') return false; // aviod error 
	var data = target.getAttribute('data-property') || target.parentNode.getAttribute('data-property') || target.parentNode.parentNode.getAttribute('data-property'); 
	if (data) console.log('yes, baby, yes');
	}
		
	document.addEventListener('click', targeter, false);
}());
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Делегирование события ruslan_mart Общие вопросы Javascript 29 11.01.2014 16:05
Запрет события Click на дочернем элементе, кот. находится за рамками родителя Smokvin Events/DOM/Window 11 10.11.2013 01:53
Алгоритм работы обработчика события salikoff Events/DOM/Window 1 20.09.2012 23:46
Дебаг js, или как найти обработчик события для тега jimm88 Events/DOM/Window 1 18.04.2012 15:11
Передача параметров в колбэки и дальнейшее их вешанье на события. Gremlin Общие вопросы Javascript 17 13.08.2011 08:54