#javascript #cross-browser #prototypejs #dom-events
#javascript #кроссбраузерность #prototypejs #dom-события
Вопрос:
Я использую prototype.js для моего веб-приложения, и у меня все запущено в Chrome, Safari и Firefox. Сейчас я работаю над совместимостью с IE8.
Во время отладки в IE я заметил, что есть события Javascript, для которых я ранее установил наблюдателя в окне, например
Event.observe(window, eventType, function () {...});
(где eventType
может быть "dom:loaded"
, "keypress"
и т.д.) И это отлично работает в Chrome / Safari / Firefox. Однако в IE наблюдатель никогда не срабатывает.
По крайней мере, в некоторых случаях я мог бы заставить это работать в IE, вместо этого поместив observer на что-то другое, чем window
, например document
(в случае "dom:loaded"
) или document.body
(в случае "keypress"
). Однако это все методом проб и ошибок.
Есть ли какой-либо более систематический способ определить, где разместить этих наблюдателей, чтобы результаты были совместимы с кроссбраузерностью?
Ответ №1:
(Это не очень всеобъемлющий ответ, но, похоже, он работает эмпирически — так что, надеюсь, эти эмпирические правила будут полезны другим.)
-
В общем, регистрируйте события в
document
, а неwindow
. Браузеры Webkit и mozilla, похоже, довольны и тем, и другим, но IE не реагирует на большинство событий, зарегистрированных в окне, поэтому вам нужно использоватьdocument
для работы с IE -
Исключение:
resize
и события, связанные с загрузкой, выгрузкой и открытием / закрытием, должны быть установлены в окне. -
Исключение из первого исключения:
dom:loaded
должно быть включеноdocument
в IE. -
Еще одно исключение: при обнаружении нажатий клавиш в Mozilla с включенной функцией поиска по мере ввода установите наблюдатели ключевых событий на
window
, а не наdocument
. Если вы сделаете последнее, функция поиска по мере ввода, похоже, заблокирует событие.
Комментарии:
1. Есть ли какие-либо обновления по этому вопросу случайно?
2. Обратите внимание, что в Firefox Quantum, если вы включите опцию «Поиск текста при начале ввода»,
window.addEventListener('keyup', handler)
также НЕ будет работать.
Ответ №2:
Документация объекта различных браузеров (например, window
в MSDN, document
в MDC) определяет, какие события поддерживаются в объекте. Вы могли бы начать с этого.
Комментарии:
1. Документы не особенно хорошо объясняют это.
2. Это действительно кажется хорошим местом для поиска, но, насколько я могу судить, MSDN не являются исчерпывающими. Например, можно зарегистрировать
onresize
событие вwindow
, но на самом деле я не вижу его в списке там.3. Это потому, что
onresize
отображаетсяwindow.prototype
в IE. Это в документе.4. Ах-ха!
window.prototype
Спасибо Alsciende.