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

时间:2010-02-03 14:24:58

标签: javascript onunload

我还没有看到任何提及这是David Flanagan的“JavaScript - 权威指南”一书(我也在O'Reilly Answers上提出了这个问题),或其他任何地方,但我发现除非文件完全加载,否则不会调用window.onunload,这非常烦人!对IE8和Chrome 3来说至少是这样的

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

^“Javascript - The Definitive Guide”建议用户与页面的交互在页面加载之前不会发生。我认为这是错误的。这是本书的内容:

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

我在IE8上进行了测试,显示可以在加载页面的任何阶段与页面进行交互(并通过锚链接保留)。

感谢您的帮助, 保罗

1 个答案:

答案 0 :(得分:0)

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

  • 完成解析并触发卸载事件 - 这将导致导航到下一页,因此这不是一个真正可行的选项。
  • 取消解析并触发卸载事件 - 这是一个更可行的选项,但您可能会看到一些UA没有打扰。
  • 只需停止该主题并导航到下一页 - 这似乎是在IE和Chrome中发生的事情

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