2012-11-13 45 views
28

我在写Javascript脚本。 这个脚本可能会被异步加载(AMD格式)。如何知道窗口“加载”事件是否已被触发

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

但是,如果脚本加载后的window.load事件...我怎么知道window.load已被解雇?

当然,我不希望任何其他脚本添加的东西(它们都装异步,问题是一样的):)

编辑:

想象一下,没有一个HTML文档它的Javascript在所有。

比某人在此文档中插入标签,并且此脚本标记加载了我的Javascript文件。

这将执行我的脚本。

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

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

是否有可能知道?

我找到了window.document.readystate属性。此属性用于文档“就绪”事件I gess,而不是窗口“加载”。 有没有类似的窗口“加载”事件?

+0

为什么不使用jQuery文档准备事件?否则,hook window.load事件并设置一个标志(例如'window.loadFired'),并且队列超时以每50ms检查一次该标志。 –

+0

你可以在不是异步加载的窗口加载事件中设置一个全局布尔值吗? – Aeoril

+0

我想等待窗口“加载”事件,因为在此事件之前,浏览器仍然很忙。当浏览器真的准备就绪时,我想开始工作....也许这很愚蠢,但无论如何,这是一个问题,不能知道事件是否被解雇了......不是吗? – Nicolas

回答

-3

重写window.load怎么样?

window._load = window.load; 
window.load = function(){ 
    window.loaded = true; 
    window._load(); 
} 

然后检查

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

这不会做这项工作。如果窗口的“加载事件已经被触发,覆盖window.load就没用了,它已经被执行了,它就不会再有了...... – Nicolas

1

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

if(!document.body) 
    setTimeout(checkAgain, 1); 

所以窗口之间加载事件,如果检查文档的主体属性是可用的,你可以检查DOM是否准备好了

+2

当DOM准备就绪时,document.body可用。当窗口”load“被触发时这个解决方案用于检测文档“准备就绪”(准备就绪),但我会优先猜测窗口“加载”事件... – Nicolas

2

这是我的回答:

fiddle

window.addEventListener("load", function() { 
    window.loaded = true; 
}); 

function logLoaded() { 
    console.log("loaded"); 
} 

(function listen() { 
    if (window.loaded) { 
     logLoaded(); 
    } else { 
     console.log("notLoaded"); 
     window.setTimeout(listen, 50); 
    } 
})(); 

你可以阅读有关的addEventListener()和它的兼容性(这是新来的的ECMAScript 5规格)here。这是继续前进的新“首选”方式。

您可以阅读有关立即调用函数表达式(IIFE)(或者,自调用匿名函数或立即调用匿名函数)here

编辑:这已经是一个很好的答案在计算器上:

How to check if DOM is ready without a framework?

如果你特别想知道,如果DOM load事件触发,坐落在一个DOM“负荷”的全局变量事件处理程序然后在加载新代码时检查它的存在。

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

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

要使此解决方案起作用,我们必须在窗口“加载”事件之前执行一些代码。即使它很小,这个脚本也必须同步加载(或者直接写在HTML文档中),否则你不能确定它是在窗口“加载”前执行的....我错了吗? – Nicolas

+0

你是对的。如果你可以处理!document.body的东西,那可能不需要它,但是我不太确定那与加载事件的触发有什么关系 – Aeoril

+0

我可以问一下吗?什么需要是没有同步代码?@Nicolas – Aeoril

相关问题