Делегирование события
Приветсвую всех, уважаемые пользователи форума! :)
Написал такой скрипт для делегирования событий:
(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, время: 01:50. |