Как проверить, установлен ли JavaScript-Eventhandler?

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

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

Ответы

Ответ 1

Проверьте, например:

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

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

Ответ 2

Должна быть доступна возможность обнаружения обработчиков событий с помощью <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 может быть построена аналогично.

Ответ 3

<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>

Ответ 4

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

if(!elem.class.match('hasEvent'))
{
  elem.addEventListener(event, function(){});
  elem.className = elem.className + ' hasEvent';
}