В настоящее время существует три различных метода определения обработчиков событий (функция, которая запускается при обнаружении определенного события): традиционный метод, метод W3C и метод Microsoft.
Традиционный метод
В традиционном методе обработчики событий определяются установкой свойства on event элемента в Javascript (как вы делаете в своем примере кода) или установкой события on атрибут в теге HTML (например, <select onchange="...">
). Несмотря на то, что это самый простой метод, его использование обычно не одобряется, поскольку, как вы обнаружили, он довольно жесткий - нелегко добавлять и удалять обработчики событий для элемента, к которому уже подключен обработчик событий. Кроме того, больше не считается правильной практикой смешивать JavaScript с HTML, но вместо этого он должен содержаться внутри или загружаться с помощью тега <script>
.
W3C / методы Microsoft
W3C (World Wide Web Consortium) и Microsoft определяют свои собственные модели событий. Две модели работают по существу одинаково, но используют разные синтаксисы. Модель Microsoft используется в Internet Explorer, а модель W3C используется в других браузерах (Firefox, Opera, Safari, Chrome и т. Д.). В обеих этих моделях предусмотрены функции для добавления обработчиков событий (addEventListener для W3C, attachEvent для Microsoft) и удаления обработчиков событий (removeEventListener / detachEvent). Это позволяет вам динамически добавлять и удалять определенные обработчики для элемента; в вашем случае вы можете добавить первый обработчик на основе первого условия, а второй - на основе второго условия. «Проблема» в этих методах заключается в том, что их два, и поэтому необходимо использовать оба метода, чтобы гарантировать, что ваш обработчик событий будет зарегистрирован во всех браузерах (между этими двумя моделями также есть несколько тонких различий, но эти различия не важны для объема этого вопроса). На самом деле, если вы посмотрите, вы найдете большое количество функций «addEvent», которые используют оба метода по мере необходимости (и, как правило, прибегают к традиционному методу для старых браузеров). Например, в 2005 году в блоге QuirksMode был проведен конкурс на создание лучшей функции «addEvent», в результате которой (наряду с функцией-победителем) вы можете увидеть здесь .
Также, если вы используете библиотеку javascript, такую как Prototype или jQuery, они поставляются со встроенными функциями обработки событий, которые позаботятся о вышеупомянутом.