何时应该在window、document和document.body上观察Javascript事件?

26
我正在使用prototype.js来开发我的Web应用程序,并且我已经在Chrome、Safari和Firefox上运行了所有内容。现在,我正在努力实现IE8的兼容性。
当我在IE中调试时,我注意到有些JavaScript事件之前我已经在窗口上设置了观察器,例如:
Event.observe(window, eventType, function () {...});

在这里,eventType可能是"dom:loaded""keypress"等。在Chrome/Safari/Firefox中它可以正常工作。但是,在IE中观察者从未触发。

至少在某些情况下,我可以通过将观察者放置在window以外的其他位置上(例如,在"dom:loaded"情况下放在document上,在"keypress"情况下放在document.body上)来让它在IE上工作。然而,这都是试错。

有没有更系统的方法来确定在哪里放置这些观察者,使结果跨浏览器兼容?

2个回答

36

这里并不是一个完整全面的答案,但从经验上看似乎有效。因此希望这些经验法则对他人有所帮助。

  • 通常情况下,在document上注册事件,而非window。WebKit和Mozilla浏览器似乎都能很好地处理二者,但在IE中,大多数注册在window上的事件都不起作用,因此需要使用document来处理IE中的事件。

  • 例外:调整窗口大小和与加载、卸载、打开/关闭相关的事件都应设置在window上。

  • 第一个例外:在IE中,必须将dom:loaded设置在document上。

  • 另一个例外:在检测启用“随找即见”功能的Mozilla浏览器中,应将按键事件监视器设置在window上,而不是document上。如果使用后者,则“随找即见”功能会阻止事件的触发。


2
这个问题有没有任何更新? - Augustin Riedinger
请注意,在Firefox Quantum中,如果您启用了“键入时搜索文本”选项,则window.addEventListener('keyup', handler)也将无法工作。 - thdoan

1
各种浏览器的对象文档(例如MSDN上的window,MDC上的document)定义了对象支持哪些事件。你可以从那里开始。

5
文档没有很好地解释这一点。 - Diodeus - James MacFarlane
这似乎是一个不错的查找位置,但据我所知,MSDN并不全面。例如,可以在窗口上注册onresize事件,但我实际上没有在那里看到它被列出。 - brahn
这是因为onresize在IE上由window.prototype暴露出来。它在文档中有说明。 - Alsciende
啊哈!window.prototype 谢谢 Alsciende。 - brahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接