上的Web浏览器的JavaScript是单线程(禁止使用的web workers),所以如果你的JavaScript代码运行,根据定义没有其他的JavaScript代码运行。*
为了尽量保证你的脚本发生之后页面上的所有其他JavaScript已经被下载和评估,已发生的所有渲染之后,提出了一些建议:
- 将脚本标记为您的代码在文件的最后。
- 在标签上使用
defer
and async
属性(它们会被不支持它们的浏览器忽略,但目标是尽可能地使您的最后)。
- 通过DOM2风格的连接钩住
window
load
事件(例如,在具有标准支持的浏览器上为addEventListener
,在较旧的IE版本上为attachEvent
)。
- 在
load
事件中,安排您的代码在setTimeout
延迟0ms后运行(它不会真的为零,它会稍微长一些)。
所以,script
标签:
<script async defer src="yourfile.js"></script>
...和yourfile.js
:
(function() {
if (window.addEventListener) {
window.addEventListener("load", loadHandler, false);
}
else if (window.attachEvent) {
window.attachEvent("onload", loadHandler);
}
else {
window.onload = loadHandler; // Or you may want to leave this off and just not support REALLY old browsers
}
function loadHandler() {
setTimeout(doMyStuff, 0);
}
function doMyStuff() {
// Your stuff here. All images in the original markup are guaranteed
// to have been loaded (or failed) by the `load` event, and you know
// that other handlers for the `load` event have now been fired since
// we yielded back from our `load` handler
}
})();
这并不意味着其他代码不会已经安排自己以后运行(通过setTimeout
,例如,就像我们上面做的,但有一个更长的超时),但。
所以你可以做一些事情来做最后的尝试,但我不相信有任何方法可以在没有完全控制页面和脚本运行的情况下实际保证它(我从问题是你没有)。
(*有一些边缘的情况下螺纹可以悬浮在一个地方,然后允许其他代码到在另一个地方运行[例如,当一个AJAX调用完成而被示出的alert
消息有些浏览器会触发ajax处理程序,即使0123'上的另一个函数正在等待解除],但它们是边缘情况,并且仍然只有一件事情正在一次完成。)
什么浏览器运行? – Boomer 2012-01-09 14:43:07
@Boomer我需要做这个跨浏览器。 – gotqn 2012-01-09 14:44:38
这可能有所帮助:http://stackoverflow.com/questions/3283576/how-to-trace-javascript-events-stack-trace – 2012-01-09 14:45:46