Безопасный, универсальный способ использования addEventHandler в Javascript?

Прежде чем я углублюсь в детали этой проблемы, я хотел бы прояснить ситуацию. Наша компания веб-аналитики работает в качестве консультанта для крупных сайтов, и (кроме добавления одного тега SCRIPT) мы не можем контролировать сами страницы.

Наш существующий скрипт устанавливает обработчики, используя "старый" способ (причудливая версия element.onclick = blah; он также выполняет оригинальный обработчик), который полностью не знает о "новых" (addEventListener или attachEvent) обработчиках на странице. Мы хотели бы исправить это, чтобы наш скрипт мог запускаться на большем количестве сайтов, не требуя столько специальной разработки.

Первоначально предполагалось, что наш собственный скрипт использует addEventListener/attachEvent, но это представляет проблему: на сайте клиента устанавливается обработчик, использующий "старый" способ, он уничтожит обработчик, который мы установили "новым" способом. Быстрое и грязное тестирование показывает, что это происходит как в IE7, так и в FF3, хотя я не тестировал весь диапазон браузеров. Существует также риск того, что если мы используем "новый" способ после того, как обработчики событий страницы уже установлены, мы можем стереть их обработчики.

Поэтому мой вопрос: какую безопасную технику я могу использовать для добавления обработчика событий в Javascript с помощью addEventListener/attachEvent, который работает независимо от того, как установлены другие обработчики событий на странице?

Пожалуйста, помните: у нас нет возможности изменить сайт, на котором установлен наш скрипт. (Я должен подчеркнуть, что, поскольку ответ по умолчанию на подобные вопросы всегда таков: "просто переписать страницу, чтобы сделать все одинаково".)

2 ответа

Решение

Можете ли вы попробовать свои быстрые и грязные тесты снова? Это не происходит для меня в FF3.

elem.onclick = function() { alert("foo"); };
elem.addEventListener("click", function() { alert("bar"); }, false);

Оба обработчика запускаются для меня, когда я нажимаю на элемент.

Я предполагаю, что вы забыли последний логический аргумент в addEventListener (использовать ли фазу захвата). Я также предполагаю, что вы забыли, что IE attachEvent потребности onclickне click,

addEventListener/attachEvent безопасен в том смысле, который вы просите. Они добавляют новый обработчик событий в узел без изменения каких-либо ранее добавленных обработчиков (даже однажды назначенных через свойство onxxx). Для компании, которая выводит некоторые на чужую страницу с использованием addEventListener/attachEvent, это должно быть единственной практикой. Назначение обработчика onxxx через свойства действительно нарушило бы настройки страниц хоста (которые ранее были назначены таким же образом)

Другие вопросы по тегам