Прагматически проверяйте, привязан ли конкретный обработчик события (функция) к объекту, используя jQuery

Я искал метод, специально проверяющий, был ли определенный обработчик (функция) привязан к определенному объекту на конкретном событии.

Проблема, которую я пытаюсь решить, - это привязать обработчик к событию выгрузки объектов, но мне нужен способ проверить, был ли он уже связан, поэтому я не связывал его дважды.

Ответ 1

Вот решение, которое сработало для меня. Я использовал этот ответ stackoverflow (fooobar.com/info/15138/...), чтобы создать следующую функцию, чтобы проверить, имеет ли объект определенный обработчик, привязанный к определенному событию.

Эта функция принимает имя функции, имя события и имя обработчика в качестве входных параметров и возвращает true/false, если функция привязана к событию на переданном объекте.

function testHandler(obj, sEvent, sHandlerName)
{
    var retVal = false;

    // Get all events bound to object
    var windowEvents = jQ._data(obj, "events");

    // Get all handlers for a specific event
    var handlers = windowEvents[sEvent];

    jQ(handlers).each(function() {
        // Using passed name to see if there is a match
        if(this.handler.name === sHandlerName)
        {
            retVal = true;
            return;
        }
    });

    return retVal;
}

Затем вызовите функцию следующим образом.

// Test if there is a beforeclose() handler bound to the window objects
// "beforeunload" event

testHandler(window, "beforeunload", "beforeclose");

Вы даже можете проверить, есть ли анонимный обработчик, прикрепленный к событию. В приведенном ниже вызове "this" ссылается на кнопку, и мы проверяем, есть ли анонимный hanlder, прикрепленный к кнопкам click event

testHandler(this, "click", "anonymous");