JQuery;проверка событий, зарегистрированных для данного объекта с помощью .live () - PullRequest
2 голосов
/ 14 сентября 2011

Я попробовал ответ, предложенный здесь , который следует почти за всеми ответами на подобные / повторяющиеся вопросы. Проверка .data('events') просто не работает, возвращая undefined для объектов, которые я ранее ( немедленно при этом ) зарегистрировал событие для.

Теперь, предостережение в том, что я на самом деле регистрирую указанные события с помощью .live(), а не .bind() или методов псевдонимов.


Я только что прочитал ( до того, как я даже опубликовал вопрос ) из jQuery на .live() следующее:

Метод .live() способен воздействовать на элементы, которые еще не были добавлены в DOM, с помощью делегирования событий: обработчик, связанный с элементом-предком, отвечает за события, которые запускаются на его потомках. Обработчик, переданный в .live(), никогда не привязывается к элементу; вместо этого .live() связывает специальный обработчик с корнем дерева DOM . В приведенном выше примере при нажатии нового элемента ...

Учитывая эту информацию, что бы я сделал (, если это вообще возможно ), чтобы проверить, "зарегистрировано" ли событие для данного объекта с .live()? С этой недавно найденной информацией, я предполагаю, что она начнется с объекта window или document ...


Обновление идеи: Если есть способ задействовать возможности мониторинга DOM .live(), возможно, я мог бы просто перепривязывать события через .bind() всякий раз, когда происходит изменение ( идентично до .live(), однако с поддержкой проверки .data('events'), поскольку события непосредственно связаны. )

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Я недавно обновил jQuery до последней версии (1.7.1) и понял, что не могу использовать

var liveEvents = $.data(document, "events").live;

, потому что live больше нет.Вместо этого вы проверяете наличие кликов, изменений и т. Д. Вот обновленная версия кода, который я выложил на SO ранее (в более старых версиях jQuery используйте другую, размещенную на этой странице):

(function ($) {
    $.fn.eventRegistered = function (eventName, includeLiveEvents) {
        if (includeLiveEvents != true)
            includeLiveEvents = false;

        if (this == null || this.length == 0)
            return false;

        for (var i = 0; i < this.length; ++i) {
            var events = $(this[0]).data("events");

            if (events == null)
                continue;

            if (events[eventName] != null)
                return true;
        }

        if (includeLiveEvents) {
            return this.eventRegisteredLive(eventName);
        }

        return false;
    };
})(jQuery);

(function ($) {
    $.fn.eventRegisteredLive = function (eventName) {
        var liveEvents = $.data(document, "events")[eventName];

        if (!liveEvents)
        {
            return false;
        }

        for (var i = 0; i < liveEvents.length; ++i) {
            if (liveEvents[i].selector == this.selector)
                return true;
        }
        return false;
    };
})(jQuery);
1 голос
/ 14 сентября 2011

Я думаю, что вы на правильном пути ... вы можете найти обработчики, связанные вызовами к live() в объекте данных документа: $.data(document, "events").live

Что-то подобное должно быть хорошей отправной точкойчтобы выполнить то, что вы хотите:

function isRegisteredByLive(selector, eventType)
{
    var isRegistered = false;

    // iterate through all "live"  event handlers and check whether the
    // handler applies to the specified selector and event type
    $.each($.data(document, "events").live, function(idx, obj) {
        if (obj.selector === selector && obj.origType === eventType)
        {
            isRegistered = true;
            return false; // break
        } 
    });

    return isRegistered;
}

$('a').live('click', function() { alert('test'); });

isRegisteredByLive('a', 'click'); // returns true

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

function getLiveEvents(el)
{
    $.each($.data(document, "events").live, function(idx, obj) {
        if ($(el).closest(obj.selector).length > 0)
        {
            console.log(obj.handler);
        } 
    });
}
0 голосов
/ 30 ноября 2011

Я написал функцию jQuery, которая проверяет, зарегистрированы ли события для элемента (для элемента и, если необходимо, в режиме реального времени)

Код:

(function ($) {
    $.fn.eventRegistered = function (eventName, includeLiveEvents) {
        if (includeLiveEvents != true)
            includeLiveEvents = false;

        if (this == null || this.length == 0)
            return false;

        for (var i = 0; i < this.length; ++i) {
            var events = $(this[0]).data("events");

            if (events == null)
                continue;

            if (events[eventName] != null)
                return true;
        }

        if (includeLiveEvents) {
            var liveEvents = $.data(document, "events").live;

            for (var i = 0; i < liveEvents.length; ++i) {
                if (liveEvents[i].selector == this.selector && liveEvents[i].origType == eventName)
                    return true;
            }
        }

        return false;
    };
})(jQuery);

Пример использования: var isRegistered = $ ('. className'). eventRegistered ("click"); // вернет true, если click зарегистрирован хотя бы на одном элементе с классом className

var isRegistered = $('.className').eventRegistered("change", true); // will return true if change is registered on at least one element that has a class className or using live function

Будь осторожен. Эта функция разрывает цепочку, поэтому вы не можете использовать ее следующим образом:

$('.className').eventRegistered("change").change(function() {
    // ...
});
...