我的网站上安装了许多跟踪脚本和Web服务,我注意到其中一个服务出现故障时,它仍然会尝试调用托管在不同服务器上的外部javascript文件。在Firefox,Chrome和其他新浏览器中,当其中一项服务出现故障时似乎没有任何问题。但是,在IE7和IE8中,我的页面在显示所有内容之前不会一直加载和超时。有没有办法在这些javascript调用上添加时间,以防止它们在关闭时破坏我的页面?
答案 0 :(得分:5)
您可以在使用JS加载页面后动态加载它们。如果JS文件位于不同的服务器上,那么当您执行此操作时,浏览器仍将显示“浏览器忙”指示符,但原始页面将加载。
如果您可以从自己的站点获取JS,可以在页面加载后使用XMLHttpRequest
加载它(或者使用您最喜欢的JS库的帮助程序,例如jQuery的$.ajax(...)
),然后评估它。这样,提取本身不会显示浏览器忙碌指示符。
要从您自己的网站获取JS,您可以从您的跟踪提供商下载它(这将不会得到官方支持但通常可以正常工作) - 只需记住每隔一段时间重新获取一个新版本 - 或者您可以创建一个在您自己的站点上“转发”服务,该服务从跟踪提供程序获取它并在本地缓存它一段时间。这样你的JS就不会有陈旧的危险。
Steve Souders提供了有关deferred loading of scripts and browser-busy indicators的更多信息。
答案 1 :(得分:2)
尝试添加defer="defer"
defer属性提供了一个提示 脚本没有的浏览器 创建任何内容,以便浏览器可以 可选择推迟解释 脚本。这可以提高性能 通过延迟执行脚本直到 在解析正文内容之后 呈现。
修改的
这将阻止这些脚本在页面加载之前运行:
function loadjs(filename) {
var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", filename);
}
window.onLoad = function() {
loadJs("http://path.to.js");
loadJs("http://path.to2.js");
...
}
答案 2 :(得分:2)
如果你需要加载外部脚本并且想要强制执行超时限制,为了避免繁忙指示器运行太长时间,可以使用带有window.stop()和等效IE的setTimeout(): p>
http://forums.devshed.com/html-programming-1/does-window-stop-work-in-ie-1311.html
var abort_load = function() {
if(navigator.appName == "Microsoft Internet Explorer") {
window.document.execCommand('Stop');
} else {
window.stop();
}
};
/**
* Ensure browser gives up trying to load JS after 3 seconds.
*/
setTimeout(abort_load, 3000);
请注意,window.stop()相当于用户单击其浏览器上的停止按钮。所以通常你只想在页面加载后调用setTimeout(),以确保在它仍在下载图像,css等时不会中断浏览器。
这应该与orip提出的建议相结合,即动态加载脚本,以避免服务器从未响应的最坏情况,导致“浏览器忙”指示器在浏览器超时之前一直处于活动状态(通常超过一分钟)。使用计时器中的window.stop(),您可以有效地指定浏览器尝试加载脚本的时间。
另请注意,setTimeout()的间隔不是由浏览器精确解释的,因此需要多长时间来加载脚本。
此外,使用window.stop()的一个反指示是,如果您的页面通过js滚动到某个位置。您可能愿意接受它,但无论如何,您可以使stop()条件为NOT已经加载了您期望的内容。例如,如果您的外部JS将定义变量foo,您可以执行以下操作:
var abort_load = function() {
if (typeof(foo) == "undefined") {
if(navigator.appName == "Microsoft Internet Explorer") {
window.document.execCommand('Stop');
} else {
window.stop();
}
}
};
这样,在happy path的情况下(脚本在超时间隔内加载),你实际上并没有调用window.stop()。