Javascript 如何知道是否“窗口”;“加载”;事件已被激发

Javascript 如何知道是否“窗口”;“加载”;事件已被激发,javascript,asynchronous,dom-events,Javascript,Asynchronous,Dom Events,我正在写一个Javascript脚本。 此脚本可能会异步加载(AMD格式) 在这个脚本中,我不想做任何重要的事情,直到触发window.load事件。 所以我听窗口“加载”事件 但是如果脚本是在window.load事件之后加载的。。。我怎么知道window.load已启动 当然,我不想在任何其他脚本中添加任何内容(它们都是异步加载的,问题是相同的):) 编辑: 想象一下,一个HTML文档中根本没有Javascript 然后有人在这个文档中插入一个标记,这个脚本标记加载我的Javascript文

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

在这个脚本中,我不想做任何重要的事情,直到触发
window.load
事件。 所以我听窗口“加载”事件

但是如果脚本是在window.load事件之后加载的。。。我怎么知道
window.load
已启动

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

编辑:

想象一下,一个HTML文档中根本没有Javascript

然后有人在这个文档中插入一个标记,这个脚本标记加载我的Javascript文件

这将执行我的脚本

此脚本如何知道是否已启动window.load

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

有可能知道吗

我找到了
window.document.readystate
属性。我猜这个属性是用于文档“就绪”事件,而不是用于窗口“加载”。
窗口“加载”事件有类似的情况吗?

覆盖window.load怎么样

window._load = window.load;
window.load = function(){
  window.loaded = true;
  window._load();
}
然后检查

if (window.loaded != undefined && window.loaded == true){
    //do stuff
}

如果您不想使用jQuery,它使用的逻辑是:

if( !document.body )
    setTimeout( checkAgain, 1 );
因此,在windows加载事件和检查文档的body属性是否可用之间,您可以检查DOM是否准备就绪

您可以阅读addEventListener()及其兼容性(它是ECMAScript 5规范的新特性)。这是未来做事的新“首选”方式

您可以阅读有关立即调用的函数表达式(IIFE)(也可以是自调用匿名函数或立即调用匿名函数)

编辑:这里有一个关于StackOverflow的好答案:

如果您特别想知道是否触发了DOM load事件,请在DOM“load”事件处理程序中设置一个全局变量,然后在加载新代码时检查它是否存在

// in 'load' event handler
window.domLoadEventFired = true;

// in code you are loading asynchronously
if (typeof window.domLoadEventFired !== undefined) {
    // ...
}

最简单的解决方案可能是检查
document.readyState==“complete”
,请参阅浏览器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');
}
快速回答 要快速回答问题的标题,请执行以下操作:

document.readyState === 'complete'
更深层次的例子 如果您希望在加载窗口时调用代码,同时仍然处理在代码运行时窗口可能已经加载的情况,下面是一个很好的帮助

函数winLoad(回调){
如果(document.readyState==='complete'){
回调();
}否则{
addEventListener(“加载”,回调);
}
}
winLoad(函数(){
log('窗口已加载');

});基于@CTS_AE的方法,我为环境问题制定了一个解决方案,其中:

  • window.addEventListener('load',activateMyFunction)
  • window.addEventListener('DOMContentLoaded',activateMyFunction)
不要工作

它需要单字符替换(例如从

函数
窗口\u addEventListener()
如下所示:

const window_addEventListener = (eventName, callback, useCapture = false) => {

  if ((document.readyState === 'interactive') || (document.readyState === 'complete'))   {

    callback();
  }
}

为什么不使用jQuery document ready事件?否则,钩住window.load事件并设置一个标志(例如,
window.loadFired
),并每隔50ms排队超时以检查标志。是否可以在非异步加载的窗口加载事件中设置一个全局布尔值?我想等待窗口“加载”事件,因为在此事件之前,浏览器仍处于忙碌状态。我想在浏览器真正准备就绪时开始工作…也许这很愚蠢,但无论如何,无法知道是否触发了事件是一个问题…不是吗?如果没有依赖加载事件的脚本,则是否检测到它会有什么区别?P您真正需要知道的是,document.readyState是否加载了其所有元素@Nicolas@nicolas出现document.readyState,其中包含字符串“complete”在加载文档的所有元素之后,如果这是准确的,并且我的理解是正确的:这篇MSDN文章似乎也表明它可能是您所需要的:为了使此解决方案工作,我们必须在窗口“加载”事件之前执行一些代码。即使它很小,也必须同步加载此脚本(或者直接写在HTML文档中),或者您不能确定它是否在窗口“加载”之前执行……我错了吗?你是对的。不过,现在我想不出其他办法。如果你能处理!document.body的事情,那可能不需要它,但我不确定这与load Event的触发有什么关系。我可以问一下,根本不需要同步代码吗?@NicolasI在创建HTML文档时遇到了这个问题在iframe中,然后在其中注入脚本。我希望HTML文档完全中立,以查看其行为。如果我在HTML文档中异步加载所有JS脚本,理论上可能会遇到相同的问题。因为它们都是异步的,所以我无法确定在窗口“加载”之前是否会执行任何一个脚本…document.body在DOM就绪时可用。而不是在触发窗口“加载”时可用。此解决方案用于检测文档“就绪”(DOM就绪),但我更喜欢猜测窗口“加载”事件…应尽可能避免
setTimeout
轮询,尤其是在为其存在事件时。例如:
window.addEventListener(“加载”),callback)
这将不会执行此任务。如果"load事件已经触发,重写window.load是无用的,它已经被执行,它将不再是…MDN中的同一解决方案根据MDN,document.readyState在load事件即将触发时变为“完成”,因此有可能出现竞态条件,您的代码将在load事件之前运行。如果需要在加载事件后运行代码(但不知道加载事件是否已触发),您可能运气不好。简化:
if(performance.timing.loadEventEnd){/*window loaded*/}
window.addEventListener('load', activateMyFunction);
window_addEventListener('load', activateMyFunction);)
const window_addEventListener = (eventName, callback, useCapture = false) => {

  if ((document.readyState === 'interactive') || (document.readyState === 'complete'))   {

    callback();
  }
}