Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
外部Javascript超时_Javascript - Fatal编程技术网

外部Javascript超时

外部Javascript超时,javascript,Javascript,我在我的网站上安装了许多跟踪脚本和web服务,我注意到当其中一个服务出现故障时,它仍然试图调用托管在不同服务器上的外部javascript文件。在Firefox、Chrome和其他新浏览器中,当其中一项服务关闭时,似乎没有任何问题。然而,在IE7和IE8中,我的页面不会一直加载,并且在显示所有内容之前会超时。有没有办法在这些javascript调用上添加一个超时,以防止它们在页面崩溃时破坏我的页面 尝试添加 defer属性提示 该脚本不支持的浏览器 创建任何内容,以便浏览器可以 有选择地推迟解释

我在我的网站上安装了许多跟踪脚本和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();
    }
  }
};