Делегирование события
Приветсвую всех, уважаемые пользователи форума! :)
Написал такой скрипт для делегирования событий: (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. Кто-нибудь знает, как более грамотно так сделать? Спасибо. |
Цитата:
|
while (e != this) { //работаем e = e.parentNode; } BallsShaped, правильно ответил |
К слову в черновик метод попал под именем matches(), так что исправь. Пока что все браузеры используют старые префикснутые matchesSelector()
Вобще странно. Тогда и document.querySelector() надо было переименовать в document.query() |
(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); } })(); Вот так пока сделал, но думаю, что сделаю по другому как время будет. :) |
Poznakomlus, спасибо, суть уловил. :)
|
Цитата:
|
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); } })(); |
Ruslan_xDD, хотя фиг его знает)) Мож до релиза еще раз пять сменят название ))
|
danik.js, только вот хрен знает как будет работать, если браузер вообще не поддерживает matches. :) Может как-нибудь через querySelector запилить?
|
Часовой пояс GMT +3, время: 11:58. |