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