同步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)
以下是在Firefox和Chromium中实现更改的方式:
- https://bugzilla.mozilla.org/show_bug.cgi?id=969671
- http://src.chromium.org/viewvc/blink?view=revision&revision=184788
至于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);