【问题标题】:When should I observe Javascript events on window vs. document vs. document.body?我什么时候应该在 window、document 和 document.body 上观察 Javascript 事件?
【发布时间】:2011-02-08 23:32:33
【问题描述】:

我将prototype.js 用于我的Web 应用程序,并且我的所有内容都在Chrome、Safari 和Firefox 上运行。我现在正在研究 IE8 兼容性。

由于我一直在 IE 中调试,我注意到有一些 Javascript 事件,我之前在窗口上设置了观察者,例如

Event.observe(window, eventType, function () {...});

(其中eventType 可能是"dom:loaded""keypress" 等),它在Chrome/Safari/Firefox 中运行良好。但是,在 IE 中,观察者永远不会触发。

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

是否有一些更系统的方法来确定将这些观察者放置在何处以使结果与跨浏览器兼容?

【问题讨论】:

    标签: javascript cross-browser prototypejs dom-events


    【解决方案1】:

    (这不是一个超级全面的答案,但似乎可以根据经验得出结论——因此希望这些经验法则对其他人有所帮助。)

    • 一般来说,在document 上注册事件,而不是在window 上。 Webkit 和 mozilla 浏览器似乎对两者都满意,但 IE 不会响应窗口上注册的大多数事件,因此您需要使用 document 才能与 IE 一起使用

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

    • 第一个例外的例外:dom:loaded 必须在 IE 中设置为 document

    • 另一个例外:在启用 find-as-you-type 的情况下检测 Mozilla 下的击键时,请将您的键事件观察器设置为 window,而不是 document。如果您执行后者,则 find-as-you-type 似乎会阻止该事件。

    【讨论】:

    • 这个问题有任何更新吗?
    • 请注意,在 Firefox Quantum 中,如果您启用“开始输入时搜索文本”选项,window.addEventListener('keyup', handler) 也将不起作用。
    【解决方案2】:

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

    【讨论】:

    • 文档并没有很好地解释这一点。
    • 这看起来确实是个不错的地方,但据我所知,MSDN 并不全面。例如,可以在window 上注册一个onresize 事件,但我实际上并没有看到它在那里列出。
    • 那是因为onresize在IE上被window.prototype暴露了。它在文档中。
    • 啊哈! window.prototype 感谢 Alsciende。
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 2022-01-25
    • 2010-11-02
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多