event.currentTarget в IE6 - PullRequest
       1

event.currentTarget в IE6

2 голосов
/ 08 августа 2011

У меня есть обработчик событий, который я присоединяю к элементу, чтобы перехватить всплывающее событие щелчка. Мне нужен надежный способ получения элемента, который перехватил события, а не элемента, который его вызвал. Количество уровней этого конкретного элемента выше srcElement / target является произвольным, поэтому используется parentNode или что-либо другое, что не является жизнеспособным решением. Это особенно необходимо для работы в IE6. Хотя я немного фанат платформы jQuery, я не буду использовать в этом jQuery, поэтому любые предложения jQuery будут считаться бесполезными.

tl; dr: мне нужен надежный event.currentTarget в IE6, без jQuery.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Обновление: attachEvent действительно создает проблему здесь. С quirksmode.org :

В следующих случаях это относится к окну:

element.onclick = function () {doSomething()}
element.attachEvent('onclick',doSomething)
<element onclick="doSomething()">

Обратите внимание на наличие attachEvent().Основной недостаток модели регистрации событий Microsoft заключается в том, что attachEvent() создает ссылку на функцию и не копирует ее.Поэтому иногда невозможно узнать, какой HTML в настоящее время обрабатывает событие.

Единственный способ, которым вы могли бы решить эту проблему, заключается в создании оболочки, что-то вроде:

var addListener = (function() {
    if(document.attachEvent) {
        return function(element, event, handler) {
            element.attachEvent('on' + event, function() {
                var event = window.event;
                event.currentTarget = element;
                event.target = event.srcElement;
                handler.call(element, event);
            });
        };
     }
     else {
        return function(element, event, handler) {
            element.addEventListener(event, handler, false);
        };
     }
}());

Тогда this будет ссылаться на элемент, как и event.currentTarget, и вы передадите event в качестве первого аргумента.

Использование:

addListener(element, 'click', function(e) {
    // this refers to element
    // e.currentTarget refers to element
    // e.target refers to the element that triggered the event
}); 

Старый ответ: (который работает для встроенных и традиционных обработчиков событий, а также addEventListener (но не attachEvent))

Insideобработчик события, this относится к элементу, к которому прикреплен обработчик события.

0 голосов
/ 08 августа 2011

Согласно этой статье IE просто не имеет эквивалента currentTarget. Поэтому, если вы не можете найти способ связать события так, чтобы вы получили правильный элемент в target / srcElement, вы можете попробовать добавить класс к элементу, который вы хотите перехватить событие, и обойти дерево DOM до этого элемент.

<div class="eventCatcher">
    <div id="eventTrigger>More HTML</div>
</div>

<script>
    function catchEvent(event)
    {
        event = event || window.event;
        target = event.target || event.srcElement;

        while (!target.getAttribute('class').indexOf('eventCatcher') >= 0)
            target = target.parentElement;
    }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...