Когда я должен наблюдать события javascript в окне против документа или документа. - PullRequest
22 голосов
/ 16 апреля 2010

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

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

Спасибо!

Ответы [ 2 ]

32 голосов
/ 20 апреля 2010

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

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

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

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

  • Еще одно исключение: при обнаружении нажатий клавиш в Mozilla с включенным поиском по типу, установите ваши ключевые наблюдатели событий на window, а не document. Если вы сделаете последнее, тип поиска как вы блокирует событие.

1 голос
/ 16 апреля 2010

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

...