Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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执行?_Javascript - Fatal编程技术网

加载远程javascript文件失败是否会停止任何浏览器中的javascript执行?

加载远程javascript文件失败是否会停止任何浏览器中的javascript执行?,javascript,Javascript,我有一个要从第三方服务器加载的独立脚本文件: <script type="text/javascript" src="//some_server/logger.js"></script> 在加载脚本之前,将您使用的所有函数(位于//some_server/logger.js中)定义为空函数,即使您在不加载脚本的情况下使用它们,也不会出现异常 <script type="text/javascript"> functionInLog

我有一个要从第三方服务器加载的独立脚本文件:

<script type="text/javascript" src="//some_server/logger.js"></script> 

在加载脚本之前,将您使用的所有函数(位于//some_server/logger.js中)定义为空函数,即使您在不加载脚本的情况下使用它们,也不会出现异常

<script type="text/javascript">
   functionInLogger = function() {
   };
   functionInLogger2 = function() {
   };
   ...
</script>
<script type="text/javascript" src="//some_server/logger.js"></script> 

<script type="text/javascript">
   functionInLogger(); 
   functionInLogger2();
   console.log("This will always work");
</script>

functionInLogger=函数(){
};
functionInLogger2=函数(){
};
...
functionInLogger();
函数logger2();
log(“这将始终有效”);
当脚本加载时,它将覆盖空函数

我找不到任何流行的浏览器可以在404上停止执行。W3标准仅规定了这一点;()

当需要用户代理执行脚本块时,它必须运行以下步骤:

如果加载导致错误(例如DNS错误或HTTP 404错误) 执行脚本块必须只包括在元素处触发一个名为error的简单事件


您可以将该脚本放在页面底部(在完成所有重要脚本之后),以确保这不会阻止页面的呈现

或者您也可以在文档准备就绪后加载它,当找不到脚本时,此方法不会提供额外的加载时间。例如:

$(document).ready(function() {
    $('head').append('<script type="text/javascript" src="//some_server/logger.js"></script>');
});

*在上面的示例中,我假设如果您使用jQuery,我认为您应该使用以下内容

发件人: 它允许开发人员定义在执行模块之前必须加载的依赖项,这样模块就不会尝试使用尚未可用的外部代码

我是否可以安全地包含此脚本,而不会阻塞或导致错误 我的应用程序中的javascript错误导致其他javascript无法运行

是的,你可以 404不会以任何方式停止javascript的执行,只有错误才会停止。
只要服务器响应404,并且没有挂起,脚本不加载就不会引起任何明显的延迟

通过记录检查404或断开链接所需的时间,可以在不同的浏览器中对其进行测试。
浏览器记录时间的事实表明,这样的脚本不会停止javascript的执行,除非解析器在脚本中遇到错误,否则线程总是继续执行下一个脚本标记。如果找不到URL,没有浏览器会抛出错误,只要URL未解析,它就会继续执行

<script>console.time('Test');</script>
<script type="text/javascript" src="http://www.broken.url/file.js"></script>
<script>console.timeEnd('Test');</script>
console.time('Test');
控制台。时间结束(“测试”);

在IE、Chrome、Firefox和Opera中进行的测试表明,所有浏览器解析断开的链接所用的时间都少于0.0002秒,而解析404所需的时间取决于服务器的响应速度,但对于谷歌的服务器来说,在返回404状态码之前,所有浏览器中的响应时间似乎始终少于0.2秒,浏览器会继续执行下一个脚本

即使加上全部返回404的20个脚本,服务器解析并继续运行通常也不到半秒钟

换句话说,您可以安全地添加任何链接已断开或返回404的脚本,它不会断开任何内容,也不会以任何方式挂起浏览器,现代浏览器只需几毫秒即可确定无法加载脚本并继续


您不能做的是包含实际加载的脚本,以及包含致命错误的脚本,因为这将停止整个线程,以及在遇到错误后执行的任何脚本。

在脚本标记上使用async或defer attribs以避免页面呈现停滞。这是我目前的想法,但是如果脚本有时不存在(例如404s),这会导致任何问题吗?如果页面上有其他依赖于脚本的js,我建议使用jquery.getscript函数。然后将所有依赖代码放入回调中。如果未加载脚本,所有其他代码将正常运行。没有其他代码依赖于脚本。。。在任何意义上,应用程序的其余部分都不需要或使用额外的分析功能…在动态添加的脚本或硬编码的脚本标记上使用404,w/async attrib不会在页面上暂停任何其他内容。如果没有attribs,速度慢的服务器将暂停渲染,但快速404不会慢很多,它只会在控制台中出错。感谢您的反馈,但脚本根本不公开任何函数。。。。它类似于谷歌分析,我的应用程序并不真正使用它,但它会记录有关当前url和其他浏览器数据的信息,几乎所有这些信息都会被我的应用程序使用。因此,它不加载不会阻止我的应用程序的功能工作,因为我的应用程序不依赖于此文件。那么,只要你不自己调用它,它就不会干预你的代码。这是我所期望的,但我希望看到一些实际浏览器结果、跨平台等的来源。。。谢谢@布拉德帕克斯-在回答中添加了更多的上下文,试图解释这种行为。浏览器如何处理无法加载的脚本取决于供应商,并且没有标准,但这是经常发生的事情,脚本出现,服务器停机等。所有浏览器处理此类错误都非常快速和可靠,没有任何问题。
$(document).ready(function() {
    $.getScript('//some_server/logger.js', function(data, textStatus) {
        /*optional stuff to do after getScript */ 
    });
});
<script>console.time('Test');</script>
<script type="text/javascript" src="http://www.broken.url/file.js"></script>
<script>console.timeEnd('Test');</script>