gpt4 book ai didi

javascript - 可以信任 script.readyState 来检测动态脚本加载的结束吗?

转载 作者:IT王子 更新时间:2023-10-29 03:20:50 27 4
gpt4 key购买 nike

我使用动态脚本加载来减少初始页面加载的持续时间。为确保脚本定义的函数和对象可访问,我需要确保脚本已完全加载。

我开发了my own Javascript library为此,因此对该主题进行了大量研究,研究了它在不同图书馆中的工作方式。在与此问题相关的讨论中,LABjs 的作者凯尔·辛普森 (Kyle Simpson) , 表示:

LABjs (and many other loaders) set both "onload" and "onreadystatechange" on all script elements, knowing that some browsers will fire one, and some will fire the other...

您可以在 the current version of jQuery as of this writing, v1.3.2 中找到这方面的示例:

// Attach handlers for all browsers
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
success();
complete();

// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
head.removeChild( script );
}
};

这是最先进的,但在分析 Opera 9.64 中的一个奇怪行为时,我得出的结论是,使用这种技术,onload 回调被过早触发。

我将发布我自己的发现来回答这个问题,并希望从社区收集更多证据和反馈。

最佳答案

在 Opera 中,script.readyState 属性是不可信任的。例如,在 Opera 9.64 中脚本运行之前可能会触发 readyState“loaded”。

我执行了 the same test在 Opera 9.64 和 Opera 10 中,结果不同。

在 Opera 9.64 中,onreadystatechange 处理程序被触发两次,一次是在脚本运行之前,一次是在脚本运行之后。 readyState 属性在这两种情况下都是“加载”的,这意味着不能信任这个值来检测脚本加载的结束:

# Fri Dec 18 2009 17:54:43 GMT+0100
# Opera/9.64 (Windows NT 5.1; U; en) Presto/2.1.1
Test for script.readyState behavior started
Added script with onreadystatechange handler
readystatechange: loaded
test1.js: Start
test1.js: Start of closure
test1.js: End of closure
readystatechange: loaded

在 Opera 10 中,onreadystatechange 处理程序仍然会以“loaded”值触发两次,但两次都是在脚本运行之后:

# Fri Dec 18 2009 18:09:58 GMT+0100
# Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.10
Test for script.readyState behavior started
Added script with onreadystatechange handler
test1.js: Start
test1.js: Start of closure
test1.js: End of closure
readystatechange: loaded
readystatechange: loaded

这些不同的行为表明 onreadystatechange 不是检测 Opera 脚本加载结束的可靠方法。由于 Opera 还支持 onload 监听器,因此应该使用其他机制。

根据这些测试的结果,onreadystatechange 应该只用于检测 Internet Explorer 中的脚本加载结束,不应该在其他浏览器中设置。

关于javascript - 可以信任 script.readyState 来检测动态脚本加载的结束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com