同步XMLHttpRequest警告和<script>

我收到一条警告消息:

主线程上的同步XMLHttpRequest由于对最终用户的体验有不利的影响而被弃用。 如需更多帮助,请查看http://xhr.spec.whatwg.org/ 。

当使用$.html()方法执行包含脚本(具有本地src )的asynchronousAJAX请求时,该脚本被注入到HTML中。 我已经改变了给定的脚本,以包含async="async" ,但警告消息仍然存在。

我已经开始debugging问题,发现我的附加的<script>是通过jQuery.ajaxTransport ( http://code.jquery.com/jquery-1.10.0.js,#8663 )的jquery AJAX调用来处理的,其中async被设置为false (这可能是问题的来源)。

现在 – 我能做些什么呢?

该消息显示在最新版本的Chrome和Firefox中。


尽pipe我无法在jsfiddle上提供testing用例,但下面是一个显示问题的testing用例:

的test.html

 <html> <body> <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.3.js"></script> <script> $(document).ready(function(){ $.ajax({ url: '/response.html', success: function(response){ $(document.body).html(response); } }) }); </script> </body> </html> 

response.html

 <script type="text/javascript" src="/json.js" async="async"></script> 

json.js

 console.log('hi'); 

AJAX请求没有必要触发警告 – 所有需要的是插入一个<script>

test2.html

 <html> <body> <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.3.js"></script> <script> $(document).ready(function(){ $(document.body).html('<script type="text/javascript" src="/json.js" async="async"><\/script>'); }); </script> </body> </html> 

值得注意的是,这已经被修复,根据https://github.com/jquery/jquery/issues/2060

更新: 这已在jQuery 3.x中修复。 如果你没有升级到3.0以上版本的可能性,你可以使用下面的代码片断,但是请注意,现在你将失去在目标内容中加载脚本的同步行为。

你可以修复它,显式设置xhr请求的asynchronous选项为true

 $.ajaxPrefilter(function( options, original_Options, jqXHR ) { options.async = true; }); 

浏览器现在警告使用同步XHR。 MDN表示这是最近实施的:

从Gecko 30.0开始(Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27)

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests#Synchronous_request

以下是在Firefox和Chromium中实现更改的方式:

至于Chrome用户的报告,这开始发生在版本39左右。我不知道如何将版本/更改集链接到特定版本的Chrome。

是的,当jQuery将标记附加到包含加载外部js文件的脚本标记的页面时,会发生这种情况。 你可以像这样重现它:

 $('body').append('<script src="foo.js"></script>'); 

我想jQuery将在未来的版本中解决这个问题。 在此之前,我们可以忽略它,或者使用A.沃尔夫的上述build议。

即使是最新的jQuery也有这一行,所以你有这些select:

  • 自己更改jQuery的来源 – 但也许有一个很好的理由使用它
  • 住警告,请注意,这个选项已被弃用 ,不会过时
  • 改变你的代码,所以它不使用这个function

我认为在这种情况下,2号是最明智的做法。

顺便说一句,如果你还没有尝试过,试试这个: $.ajaxSetup({async:true}); ,但我不认为这会奏效。

尽pipe使用async:true,但仍然受到此错误消息的困扰。 事实certificate,实际的问题是使用success方法。 我改变了这done ,警告消失了。

success: function(response) { ... }

换成:

done: function(response) { ... }

在我的情况下,这是由灵活脚本,这是由Cloudflare提供的“CDNJSselect”应用程序的一部分引起的。

根据Cloudflare的说法,“这个应用程序在2015年3月被弃用”。 我把它关掉了,消息立刻消失了。

您可以通过访问https://www.cloudflare.com/a/cloudflare-apps/yourdomain.com访问这些应用程序;

如果你只是需要加载脚本不要做如下

 $(document.body).html('<script type="text/javascript" src="/json.js" async="async"><\/script>'); 

尝试这个

 var scriptEl = document.createElement('SCRIPT'); scriptEl.src = "/module/script/form?_t="+(new Date()).getTime(); //$('#holder').append(scriptEl) // <--- create warning document.body.appendChild(scriptEl);