JavaScript onunload 仅在文档​​完全加载时调用?

Posted

技术标签:

【中文标题】JavaScript onunload 仅在文档​​完全加载时调用?【英文标题】:JavaScript onunload only called if document fully loaded? 【发布时间】:2010-02-03 14:24:57 【问题描述】:

我没有看到任何提到这是 David Flanagan 的“javascript - the Definitive Guide”一书(我也在 O'Reilly Answers 上问过这个问题),或者其他任何地方,但我发现除非文档完全加载,否则不会调用 window.onunload,这很烦人!至少 IE8 和 Chrome 3 是这样的

我有一段 Javascript 想要添加到网页底部。如果用户碰巧在页面加载之前点击了页面(^ 见下文),并且在我的 Javascript 有机会运行之前,我希望将其捕获在 onunload 中。但这是不可能的,因为只有在文档完全加载时才会调用 onunload 事件处理程序。如果我不能使用 onunload,还有什么其他方法可以达到同样的效果吗?

^ "Javascript - The Definitive Guide" 建议在页面加载之前用户与页面的交互不会发生。我相信这是错误的。这本书是这么说的:

"Javascript 执行模型中的另一个灰色地带是在文档完全加载之前是否可以调用事件处理程序的问题。我们对 Javascript 执行模型的讨论到目前为止得出的结论是,所有事件处理程序总是被触发在所有脚本执行之后。虽然这通常会发生,但任何标准都不需要这样做。如果文档很长或通过慢速网络连接加载,浏览器可能会部分呈现文档并允许用户开始交互在所有脚本和 onload 处理程序运行之前使用它(并触发事件处理程序)。如果这样的事件处理程序调用尚未定义的函数,它将失败。(这是在脚本中定义所有函数的原因之一)文档。)如果这样的事件处理程序试图操作文档中尚未解析的部分,它将失败。这种情况在实践中并不常见,通常不值得额外的编码工作需要积极地防范它。” (第 5 版,第 256 页)

我在 IE8 上进行了测试,结果表明可以在页面加载的任何阶段与页面交互(并通过锚链接离开)。

感谢您的帮助, 保罗

【问题讨论】:

如果在 javascript 完成初始执行之前用户有时间点击离开,您能否减少必须以这种方式运行的 javascript 数量?以后可以随时使用 eval 拉入另一个 js 文件。 您是将“完全加载”定义为“文档已解析”还是“onload 事件已触发”? 浏览器可能会部分呈现文档并允许用户开始与其交互读取到浏览器可能允许用户与部分呈现的页面交互。 【参考方案1】:

对我来说,在解析文档之前无法触发 onunload 事件是有道理的。文档解析和脚本执行通常在同一个线程上运行,如果用户要离开页面,则在触发 onunload 事件后线程将被取消。由于在用户离开页面时解析正在使用线程,因此浏览器将具有以下选项:

完成解析并触发 unload 事件 - 这会延迟导航到下一页,因此这不是一个真正可行的选择。 取消解析并触发 unload 事件 - 这是一个更可行的选择,但您可能会看到一些 UA 没有打扰。 只需停止线程并导航到下一页 - 这似乎是您在 IE 和 Chrome 中发生的事情

也许您可以查看onbeforeunload 事件是否被触发?我不认为这会有所作为。我认为最好的办法是研究可以优化页面以加快加载速度的方法。

【讨论】:

以上是关于JavaScript onunload 仅在文档​​完全加载时调用?的主要内容,如果未能解决你的问题,请参考以下文章

javascript   卸载事件(onunload)

Javascript仅在html文档中起作用[重复]

html文本框控件的常用属性、事件和方法

JavaScript DOM

如果值不为空,如何仅在对象中添加字段? Javascript

JavaScript页面加载三个事件