JavaScript / jQuery: прослушивание новых зарегистрированных обработчиков событий - PullRequest
5 голосов
/ 07 февраля 2012

В настоящее время я работаю над проектом для моего университета. Там нужно синхронизировать все зарегистрированные обработчики событий javascript с сервером. То есть Мне нужно знать, какие элементы имеют определенный обработчик событий.

Я уже использую VisualEvent , чтобы выяснить, у каких элементов есть обработчики событий, и это прекрасно работает.

Но мне нужно иметь прослушиватель событий, который вызывается каждый раз, когда обработчик событий регистрируется для элемента DOM.

Так что в основном каждый раз, когда вызывается что-то вроде $("#foo").click(...) или $("#foo").bind(...), мне нужно получить информацию о том, что для этого элемента зарегистрирован новый обработчик событий.

И наоборот, мне нужен слушатель, когда обработчик событий удаляется из элемента DOM, но это не обязательно для первого прототипа.

Есть ли способ, которым я могу глобально прикрепить обработчик ко всем регистрациям обработчиков событий?

Если вам нужна дополнительная информация, не стесняйтесь комментировать.

Заранее спасибо за любую помощь!

С наилучшими пожеланиями, Роберт

1 Ответ

8 голосов
/ 07 февраля 2012

Если вы используете jQuery 1.7+, все методы для прикрепления событий проходят через jQuery.fn.on, так что это простой случай переопределения этой функции и смещения;

(function () {

    var old = jQuery.fn.on;

    jQuery.fn.on = function (events, selector, data, handler) {
        // Ensure you still attach the events
        var result = old.apply(this, arguments); 

        // Now do your own thing

        // Inside here, `this` refers to the jQuery object on which `on` was invoked;
        // it's not a specific element like it normally is within jQuery. You then
        // therefore use something like `this.each(function () { /* this */ }); to 
        // target each element in the set.

        // You might want to normalize the variables, as selector and data are optional,
        // and events can be an object or string
        jQuery.post('/spy.php', {
            events: events,
            selector: selector,
            data: data
        }, jQuery.noop);

        return result; // keep the signature of `on`, and return the value `on()` *would* have done.
    };

}());

Если вы используете jQuery <1.7 и не можете выполнить обновление, вы можете сделать что-то похожее на описанное выше, но вам придется переопределить <code>bind(), live(), delegate() и т. Д.

...