Всплытие событий
Пишу обработчик событий, использующий делигирование. Но возникла проблема.
Вот функция: function click(selector, callback) { var temp = function(e) { e = e || window.event; var target = e.target || e.srcElement; if(target.matches(selector)) callback(); } document.addEventListener("click", temp, false); } При этом, я хочу, чтобы срабатывание шло от самого "глубокого" элемента DOM. Т.е. если я поставлю обработчики и на div, и на body, то обработчик div должен сработать первым, несмотря на место в коде. У меня же выходит, что место в коде отыгрывает наибольшую роль. Как же быть? Как это реализирует jQuery, к примеру? Берет огромный массив обработчиков и положения объектов? |
Valdemor, не совсем понятно, что не так, всплытие идет от элемента на котором произошло событие и html (или body не помню)
<!DOCTYPE HTML> <html> <head> </head> <body> <div id='t1'> <div id='t2'> <div id='t3'>click me</div> </div> </div> <script> var one = document.getElementById('t1'); one.onclick = function () { alert(1) }; var two = document.getElementById('t2'); two.onclick = function () { alert(2) }; var three = document.getElementById('t3'); three.onclick = function () { alert(3) }; document.body.onclick = function () { alert('body') }; </script> </body> </html> |
Мне нужно использовать именно addEventListener.
|
Valdemor, а , ну так target не будет меняться в нем будет элемент по которому кликнули, что бы получить текущий элемент на котором сработало событие используйте this
<!DOCTYPE HTML> <html> <head> </head> <body> <div id='t1'> <div id='t2'> <div id='t3'>click me</div> </div> </div> <script> var one = document.getElementById('t1'); var two = document.getElementById('t2'); var three = document.getElementById('t3'); one.addEventListener('click', divDelegation); two.addEventListener('click', divDelegation); three.addEventListener('click', divDelegation); function divDelegation(e){ alert(this.id); } document.body.addEventListener('click', function () { alert('body'); }); </script> </body> </html> |
Точно! Не по target, а по this! Спасибо!
|
Часовой пояс GMT +3, время: 19:20. |