如何知道窗口"load"事件是否已被触发

Nic*_*las 45 javascript asynchronous dom-events

我正在写一个Javascript脚本.此脚本可能会异步加载(AMD格式).

在这个脚本中,在window.load事件被触发之前,我不想做任何重要事情.所以我听窗口"加载"事件.

但是如果在window.load事件之后加载脚本......我怎么知道window.load已经被触发了?

当然我不想在任何其他脚本中添加内容(它们都是异步加载,问题是一样的):)

编辑:

想象一下,根本没有Javascript的HTML文档.

有人在此doc中插入一个标记,并且此脚本标记加载我的Javascript文件.

这将执行我的脚本.

这个脚本如何知道window.load是否已被触发?

我之前没有jQuery,也没有HTML文档中的任何脚本.

有可能知道??

我找到了window.document.readystate属性.此属性用于文档"就绪"事件我gess,而不是窗口"加载".窗口"加载"事件有什么类似的吗?

Mat*_*sel 48

最简单的解决方案可能是检查document.readyState == 'complete',请参阅http://www.w3schools.com/jsref/prop_doc_readystate.asp

  • 来自MDN的相同解决方案https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState#Values (10认同)
  • 根据 MDN,当加载事件即将触发时 document.readyState 变为“完成”,因此可能会出现竞争条件,您的代码将在加载事件之前运行。如果您绝对需要在加载事件之后运行代码(但不知道加载事件是否已触发),那么您可能不走运。 (3认同)

CTS*_*_AE 16

快速回答

快速回答问题的标题:

document.readyState === 'complete'
Run Code Online (Sandbox Code Playgroud)

更深入的例子

如果您想在加载窗口时调用代码,同时仍处理在代码运行时窗口可能已经加载的情况,下面是一个很好的帮助。

document.readyState === 'complete'
Run Code Online (Sandbox Code Playgroud)

注意:此处的代码段实际上不在同一窗口上下文中运行,因此document.readyState === 'complete'实际评估的时间是false您运行该代码段的时间。如果您现在立即在此窗口中将其放入控制台,则应评估为true。

另请参阅'$(document).ready()'的非jQuery等效项是什么?


Evg*_*eny 14

浏览器导航性能loadEventEnd 指标可用于确定是否触发了加载事件:

let navData = window.performance.getEntriesByType("navigation");
if (navData.length > 0 && navData[0].loadEventEnd > 0)
{
    console.log('Document is loaded');
} else {
    console.log('Document is not loaded');
}
Run Code Online (Sandbox Code Playgroud)

  • 简化:`if (performance.timing.loadEventEnd) { /* 窗口加载 */ }` (7认同)
  • “performance.timing”已被弃用,因此虽然它可能更简单,但使用起来可能很危险。 (5认同)
  • `performance.getEntriesByType("navigation").every((e) => e.loadEventEnd) // true|false` 对于非弃用版本 (3认同)