Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Делегирование события (https://javascript.ru/forum/misc/44119-delegirovanie-sobytiya.html)

ruslan_mart 07.01.2014 17:53

Делегирование события
 
Приветсвую всех, уважаемые пользователи форума! :)

Написал такой скрипт для делегирования событий:

(function() {
	var d = document.documentElement,
		m = d.matchesSelector || d.webkitMatchesSelector || d.oMatchesSelector || d.mozMatchesSelector || d.msMatchesSelector;
	
	Element.prototype.addEventDelegate = function(type, selector, fn) {
		this.addEventListener(type, function(e) {
			e = e && e.target || window.event.srcElement;
			if(m.call(e, selector)) {
				fn.call(e);
			}
		}, false);
	}
})();


window.onload = function() {
	document.body.addEventDelegate('click', 'p', function() {
		alert('Вы кликнули по тэгу "p"!');
	});
}


Всё работает, но... когда кликаешь по более вложенному элементу, то событие для родительского элемента не срабатывает. Нужно, чтобы всё работало как в jQuery. Кто-нибудь знает, как более грамотно так сделать?
Спасибо.

BallsShaped 07.01.2014 18:35

Цитата:

Сообщение от Ruslan_xDD
когда кликаешь по более вложенному элементу, то событие для родительского элемента не срабатывает.

Странный вывод. Не важно, насколько вложен элемент. Проверяешь на соотв-ие селектору ты только элемент, по которому кликнули. Очевидно, нужно проверять все элементы от e.target до this.

Vlasenko Fedor 07.01.2014 22:29

while (e != this) {
            //работаем
            e = e.parentNode;
}

BallsShaped,
правильно ответил

danik.js 07.01.2014 22:46

К слову в черновик метод попал под именем matches(), так что исправь. Пока что все браузеры используют старые префикснутые matchesSelector()

Вобще странно. Тогда и document.querySelector() надо было переименовать в document.query()

ruslan_mart 09.01.2014 13:26

(function() {
	var d = document.documentElement,
		m = d.matchesSelector || d.webkitMatchesSelector || d.oMatchesSelector || d.mozMatchesSelector || d.msMatchesSelector || d.matches;
	
	Element.prototype.addEventDelegate = function(type, selector, fn) {
		this.addEventListener(type, function(e) {
			e = e && e.target || window.event.srcElement;
			if(m.call(e, selector + ', ' + selector + ' *')) {
				fn.call(e);
			}
		}, false);
	}
})();


Вот так пока сделал, но думаю, что сделаю по другому как время будет. :)

ruslan_mart 09.01.2014 13:28

Poznakomlus, спасибо, суть уловил. :)

danik.js 09.01.2014 14:58

Цитата:

Сообщение от Ruslan_xDD
d.matchesSelector

Нет такого свойства. И не будет никогда. Читай мой коммент.

ruslan_mart 09.01.2014 15:13

danik.js, понял. :)

Доделал. :)
(function() {
	var d = document.documentElement,
		m = d.matches || d.webkitMatchesSelector || d.oMatchesSelector || d.mozMatchesSelector || d.msMatchesSelector;
	
	Element.prototype.addEventDelegate = function(type, selector, fn) {
		this.addEventListener(type, function(e) {
			var t = e && e.target || window.event.srcElement;
			while(t != this) {
				if(m.call(t, selector)) {
					fn.call(t, e);
					break;
				}
				t = t.parentNode;
			}
		}, false);
	}
})();

danik.js 09.01.2014 15:31

Ruslan_xDD, хотя фиг его знает)) Мож до релиза еще раз пять сменят название ))

ruslan_mart 09.01.2014 15:38

danik.js, только вот хрен знает как будет работать, если браузер вообще не поддерживает matches. :) Может как-нибудь через querySelector запилить?


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