Я использую prototype.js для своего веб-приложения, и у меня есть все работающее на Chrome, Safari и Firefox. Я теперь работаю над совместимостью IE8.
Поскольку я отлаживал в IE, я заметил, что существуют события JavaScript, для которых я ранее установил наблюдателя на окне, например.
Event.observe(window, eventType, function () {...});
(где eventType
мог бы быть "dom:loaded"
, "keypress"
, и т.д.), и это работает просто великолепно в Chrome/Safari/Firefox. Однако в IE наблюдатель никогда не стреляет.
По крайней мере в некоторых случаях я мог заставить это работать над IE, вместо этого разместив наблюдателя во что-то другое, чем window
, например. document
(в случае "dom:loaded"
) или document.body
(в случае "keypress"
). Однако это все эмпирически.
Там некоторый более систематический путь состоит в том, чтобы определить, куда разместить этих наблюдателей, таким образом, что результатами будет совместимый перекрестный браузер?
Документация по объектам различных браузеров (например, window
в MSDN, документ
в MDC) определяют, какие события поддерживаются на объекте. Вы можете начать там.
(Это не очень исчерпывающий ответ, но, похоже, он работает эмпирически - так что, надеюсь, эти практические правила будут полезны другим.)
Как правило, события регистрируются в документе
, а не в окне
. Браузеры Webkit и Mozilla, похоже, довольны этим, но IE не реагирует на большинство событий, зарегистрированных в окне, поэтому вам нужно использовать документ
для работы с IE
Исключение: resize
, и события, связанные с загрузкой, разгрузкой и открытием / закрытием, должны быть установлены в окне.
Исключение из первого исключения: dom: loaded
должно быть установлено в документе
в IE.
Другое исключение: при обнаружении нажатий клавиш в Mozilla с включенной функцией поиска по мере ввода установите наблюдателей ключевых событий в окне
, а не в документе
. Если вы сделаете последнее, кажется, что поиск по типу заблокирует событие.