Ответ 1
Документация объектов различных браузеров (например, window
на MSDN, document
в MDC) определяют, какие события поддерживаются объектом. Вы можете начать там.
Я использую 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, document
в MDC) определяют, какие события поддерживаются объектом. Вы можете начать там.
(Это не супер-всеобъемлющий ответ, но, похоже, он работает эмпирически - поэтому, надеюсь, эти эмпирические правила будут полезны другим.)
В общем случае регистрируйте события на document
, а не window
. Webkit и mozilla браузеры, похоже, тоже довольны, но IE не реагирует на большинство событий, зарегистрированных в окне, поэтому вам нужно использовать document
для работы с IE
Исключение: resize
, а события, связанные с загрузкой, разгрузкой и открытием/закрытием, должны быть установлены в окне.
Исключение к первому исключению: dom:loaded
должен быть установлен в document
в IE.
Другое исключение: при обнаружении нажатий клавиш в Mozilla с включенным параметром find-as-you-type установите для своих наблюдателей ключевых событий значение window
, а не document
. Если вы сделаете последнее, тип find-as-you, похоже, заблокирует событие.