我有一个带有窗口加载事件的空白页面,并且它工作正常,直到我不通过导入(es6模块)+ JSPM(babel transpiler)包含jquery库来使事情正常工作,无法找到原因,任何想法?
这就是我在页面中得到的所有内容:
app.js
"use strict";
import "jquery"; // if i remove this event will fire
window.addEventListener("load", function(event){
console.log("loaded");
}, true);
在我的html中,我执行以下操作(在开发模式下)
index.html
<script src="jspm_packages/system.js"></script>
<script src="jspm.config.js"></script>
<script>
System.import("assets/js/app");
</script>
P.S。 我在htmt
中没有正文载入等解决!
JSPM仅在开发模式下加载模块async,在生产模式下所有模块和库已经捆绑到一个文件中,所以事情加载同步,所有工作都很好。谢谢@ T.J。克劳德
答案 0 :(得分:2)
我怀疑你会发现System.import
异步导入 ,所以你就会遇到竞争条件。当您删除jQuery的导入时,您的代码会加载并运行得更快,让它在window.load
事件触发之前发生。当你有导入时,运行你的代码有一个延迟(等待加载jQuery文件),你错过了这个事件。
您可以轻松确定是否属于这种情况(参见评论):
index.html
:
<script src="jspm_packages/system.js"></script>
<script src="jspm.config.js"></script>
<script>
window.addEventListener("load", function(event){ // Added
console.log("index.html - got load event"); // Added
}, true); // Added
System.import("assets/js/app");
</script>
app.js
:
"use strict";
import "jquery"; // if i remove this event will fire
console.log("app.js running"); // Added
window.addEventListener("load", function(event){
console.log("loaded");
}, true);
如果你看到这个:
index.html - got load event app.js running
......你知道你错过了这个活动。
如果您定位的是现代浏览器,则可以修改app.js
代码以通过document.readyState
处理该案例:
"use strict";
import "jquery";
function loadCallback() {
console.log("loaded");
}
if (document.readyState !== "complete") {
setTimeout(loadCallback, 0);
} else {
window.addEventListener("load", loadCallback, true);
}
(注意,为了避免混乱,我们总是异步调用loadCallback
,以便上面的代码之后的任何代码在运行之前都可靠地完成。)
如果您需要支持不提供document.readyState
的浏览器,您可能需要在load
(blech)中连接index.html
事件处理程序,或者使用jQuery ready
功能。如果您使用ready
,请注意它不能以异步方式可靠地调用您的函数(如果ready
已被触发,它将同步)。 : - |此外,ready
比load
更早发射(通常这是一件好事,但如果您依赖已加载的图像......)。