Безопасный, универсальный способ использования addEventHandler в Javascript? - PullRequest
6 голосов
/ 21 октября 2008

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 21 октября 2008

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

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

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

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

1 голос
/ 21 октября 2008

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

...