attachEvent или addEventListener - хранится где? - PullRequest
3 голосов
/ 31 июля 2011

В JQuery, если я сделаю это ...

$('a').click(function(){
    // Do something 
});

... событие клика хранится в $('a').data('events'), и я могу получить его так:

jQuery.each($('a').data('events'), function(i, event){  
    jQuery.each(event, function(i, handler){
        if(handler.type.toString() == 'click')
        {
            // do something
        }
    });
});

Событие, которое прикреплено через attachEvent или addEventListener, очевидно, не появится в $('a').data('events'). Есть ли что-нибудь, что я могу повторить на своем месте? Я предполагаю, что они где-то стоят в очереди, но я не могу найти документацию, которая укажет мне правильное направление.

Ответы [ 3 ]

4 голосов
/ 31 июля 2011

С quirksmode :

Одна из проблем текущей реализации модели регистрации событий W3C состоит в том, что вы не можете узнать, зарегистрированы ли какие-либо обработчики событий для элемента,В традиционной модели вы можете сделать:

alert(element.onclick)

и вы увидите функцию, которая зарегистрирована в ней, или не определена, если ничего не зарегистрировано.Только в самых последних событиях уровня 3 DOM W3C добавляет eventListenerList для хранения списка обработчиков событий, которые в настоящее время зарегистрированы в элементе.Эта функциональность еще не поддерживается ни одним браузером, она слишком новая.Тем не менее, проблема была решена.

2 голосов
/ 31 июля 2011

Если вы можете получить код, установленный в начале страницы, вы можете записать всех последующих слушателей в свою собственную структуру данных с помощью такого рода хуков: Почему Google +1 записывает мои движения мыши? .

Я не знаю способа доступа к существующим слушателям.

1 голос
/ 31 июля 2011
// Introduced in DOM Level 2:
interface EventTarget {
  void               addEventListener(in DOMString type, 
                                      in EventListener listener, 
                                      in boolean useCapture);
  void               removeEventListener(in DOMString type, 
                                         in EventListener listener, 
                                         in boolean useCapture);
  boolean            dispatchEvent(in Event evt)
                                        raises(EventException);
  // Introduced in DOM Level 3:
  readonly attribute EventListenerList  eventListeners;
};

Таким образом, el.eventListeners содержит все прослушиватели событий, подключенные к el с использованием el.addEventListener.

. Вам потребуется использовать шайбу для поддержки браузера.В настоящее время Chrome 12 и Firefox 5 не поддерживают это

...