Как я могу проверить, был ли установлен 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';
}