我有一个页面,可以通过 defer
加载一些外部脚本:
<script src="externalPlugin.js" defer></script>
i然后在jquery.ready
中有一些代码,可以调用该脚本的内容
$(function() {
$.externalPlugin();
});
到目前为止,它有99.9%的时间。
问题
如果用户远离页面(命中"刷新",或者只是快速导航到另一页(> externalScript
仍在加载/执行 - jQuery.ready
仍然被调用(!(,显然是称为(!(引发此错误:$.externalPlugin is not a function
或类似。
我该如何战斗?
我尝试添加一个beforeunload
处理程序,该处理程序删除ready
绑定
window.addEventListener("beforeunload",function() { $(document).unbind("ready"); });
但行不通。
这不是一个大问题(在所有用户都在导航之后,他不在乎任何错误(,但这仍然是有趣的行为。
update
是的,我知道我可以等待定义甚至使用<script defer onload='whatever()'>
,但我想知道是否有一种"全局"方法可以普遍修复此操作 - 如果页面已卸载,则不请致电.ready
。...如果不是 - 我会说这实际上是一个错误,必须向jQuery团队报告,嗯?
如果您必须在DOM准备的主页上启动脚本,请删除脚本的延期属性:
<script src="externalPlugin.js"></script>
您可以等待功能définition:
function wait(fn, delay)
{
var i = setInterval(function(){
if(fn() && typeof fn() == "function")
{
clearInterval(i);
fn()();
}
}, delay);
}
$(document).ready(function(){
wait(function(){ return $.externalPlugin }, 100);
});
等到脚本加载
$(function() {
waitPlugin();
});
function waitPlugin(){
if( $.externalPlugin == null ) {
setTimeout(waitPlugin,1000);
return;
}
$.externalPlugin();
}
,但我会以某种方式重组代码。