Подтвердить что ты не робот

Когда я должен наблюдать события Javascript в окне против документа или документа.

Я использую 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"), Тем не менее, это все методом проб и ошибок.

Есть ли какой-то более систематический способ определить, где разместить этих наблюдателей, чтобы результаты были совместимы с разными браузерами?

4b9b3361

Ответ 1

Документация объектов различных браузеров (например, window на MSDN, document в MDC) определяют, какие события поддерживаются объектом. Вы можете начать там.

Ответ 2

(Это не супер-всеобъемлющий ответ, но, похоже, он работает эмпирически - поэтому, надеюсь, эти эмпирические правила будут полезны другим.)

  • В общем случае регистрируйте события на document, а не window. Webkit и mozilla браузеры, похоже, тоже довольны, но IE не реагирует на большинство событий, зарегистрированных в окне, поэтому вам нужно использовать document для работы с IE

  • Исключение: resize, а события, связанные с загрузкой, разгрузкой и открытием/закрытием, должны быть установлены в окне.

  • Исключение к первому исключению: dom:loaded должен быть установлен в document в IE.

  • Другое исключение: при обнаружении нажатий клавиш в Mozilla с включенным параметром find-as-you-type установите для своих наблюдателей ключевых событий значение window, а не document. Если вы сделаете последнее, тип find-as-you, похоже, заблокирует событие.