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

У меня есть JavaScript-функция, которая устанавливает событие onclick для некоторых узлов HTML, даже если это событие onclick было установлено ранее.

Как я могу проверить, было ли это событие уже установлено, чтобы я мог расширить свою функцию, чтобы установить событие только на HTML-узлах, где оно еще не было установлено?

4 ответа

Решение

Проверьте, как это:

if(typeof someNode.onclick == "function") {
   // someNode has an event handler already set for the onclick event...
}

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

Должна быть возможность обнаруживать обработчики событий, подключенные с использованием <element>.addEventListener() перехватывая вызовы функции:

var myListOfAddedEvents = [];

var realAddEventListener = HTMLElement.prototype.addEventListener;

HTMLElement.prototype.addEventListener = function(evtType,fn,cap) {
    myListOfAddedEvents.push(
        {on: this, type: evtType, handler: fn, capture: cap}
    );

    return realAddEventListener.apply(this, arguments);
};

Примечание. Это непроверенный код, который может потребовать некоторой работы. Я надеюсь, что эта же функция будет использоваться всеми типами элементов, но я могу ошибаться. Также это будет работать только в том случае, если вы сможете запустить этот бит кода, прежде чем они начнут добавлять события. Копия для attachEvent может быть создана аналогично.

<input type="button" id="foo" name="foo" value="bar" />

<script type="text/javascript">
    alert(document.getElementById('foo').onclick); //undefined
</script>

Так что вы хотите сделать что-то вроде этого:

<script type="text/javascript">
    if (undefined == document.getElementById('foo').onclick)
    {
        // Add event handler
    }
</script>

Другая альтернатива, добавление класса к элементу

if(!elem.class.match('hasEvent'))
{
  elem.addEventListener(event, function(){});
  elem.className = elem.className + ' hasEvent';
}
Другие вопросы по тегам