外部Javascript超时
我在我的网站上安装了许多跟踪脚本和web服务,我注意到当其中一个服务出现故障时,它仍然试图调用托管在不同服务器上的外部javascript文件。在Firefox、Chrome和其他新浏览器中,当其中一项服务关闭时,似乎没有任何问题。然而,在IE7和IE8中,我的页面不会一直加载,并且在显示所有内容之前会超时。有没有办法在这些javascript调用上添加一个超时,以防止它们在页面崩溃时破坏我的页面 尝试添加 defer属性提示 该脚本不支持的浏览器 创建任何内容,以便浏览器可以 有选择地推迟解释 剧本这可以提高性能 通过将脚本的执行延迟到 在解析正文内容并 渲染 编辑外部Javascript超时,javascript,Javascript,我在我的网站上安装了许多跟踪脚本和web服务,我注意到当其中一个服务出现故障时,它仍然试图调用托管在不同服务器上的外部javascript文件。在Firefox、Chrome和其他新浏览器中,当其中一项服务关闭时,似乎没有任何问题。然而,在IE7和IE8中,我的页面不会一直加载,并且在显示所有内容之前会超时。有没有办法在这些javascript调用上添加一个超时,以防止它们在页面崩溃时破坏我的页面 尝试添加 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");
...
}
您可以在使用JS加载页面后动态加载它们。如果JS文件位于不同的服务器上,则执行此操作时浏览器仍会显示“browser busy”(浏览器忙)指示器,但会加载原始页面 如果您可以从自己的站点获取JS,则可以在页面加载后使用
XMLHttpRequest
加载它(或者使用您最喜欢的JS库的助手,例如jQuery的$.ajax(…)
),然后对其进行评估。这样,抓取本身就不会显示浏览器忙指示器
要从您自己的站点获取JS,您可以从您的跟踪提供商处下载它(该服务不受官方支持,但通常有效)-只需记住每隔一段时间重新获取新版本-或者您可以在您自己的站点上创建“转发”服务,从跟踪提供商处获取JS并在本地缓存一段时间。这样你的JS就不会有过时的危险
Steve Souders提供了有关的详细信息。如果您需要加载外部脚本,并且希望强制执行超时限制,以避免繁忙指示器运行太长时间,您可以将setTimeout()与window.stop()一起使用,并且IE等效: 请注意,window.stop()相当于用户在浏览器上单击“停止”按钮。因此,通常您只希望在页面加载后调用setTimeout(),以确保在浏览器仍在下载图像、css等时不会中断浏览器 这应该与orip提出的建议相结合,即动态加载脚本,以避免出现服务器从未响应的最坏情况,从而导致“浏览器忙”指示器一直处于活动状态,直到浏览器超时(通常超过一分钟)。使用计时器中的window.stop(),可以有效地指定浏览器可以尝试加载脚本的时间 还要注意的是,setTimeout()的时间间隔并不是由浏览器精确解释的,所以根据您希望允许加载脚本的时间来进行汇总 另外,使用window.stop()的一个计数器指示是,如果您的页面通过js滚动到某个位置。您可能愿意接受这一点,但在任何情况下,您都可以将stop()设置为没有加载所需内容的条件。例如,如果您的外部JS将定义一个变量foo,您可以执行以下操作:
var abort_load = function() {
if (typeof(foo) == "undefined") {
if(navigator.appName == "Microsoft Internet Explorer") {
window.document.execCommand('Stop');
} else {
window.stop();
}
}
};
这样,在快乐路径的情况下(脚本确实在超时时间间隔内加载),您实际上不会调用window.stop()。是的,我认为这不起作用。我认为真正的问题是IE试图连接到外部JS文件,而默认超时设置得太高。firefox和其他浏览器似乎很快就知道文件没有响应,并相应地继续前进。我想知道是否有任何方法可以防止这种情况……您可以使用javascript而不是html加载外部javascript文件。将加载代码放在
块中,或在onLoad处理程序中进行加载@orip他只是在IE上有问题。所以firefox/chrome不支持这个标签也没关系。fwiw、defer
和onload后添加脚本是不同的。Onload在加载所有资产(包括图像等非关键资产)后激发<代码>延迟只是将脚本执行延迟到DOM变为“交互式”之后,即解析DOM。这仍然发生在“onload”事件之前。
var abort_load = function() {
if (typeof(foo) == "undefined") {
if(navigator.appName == "Microsoft Internet Explorer") {
window.document.execCommand('Stop');
} else {
window.stop();
}
}
};