同步XMLHttpRequest警告和<script>
我收到一条警告消息:
主线程上的同步XMLHttpRequest已被弃用,因为它对最终用户的体验有不利影响。 如需更多帮助,请查看http://xhr.spec.whatwg.org/。
当执行包含脚本(具有本地src
)的异步AJAX请求时,该脚本使用$.html()
方法注入到HTML中。 我已将给定的脚本更改为包含async="async"
,但警告消息仍然存在。
我已经开始调试问题,发现我的附加<script>
是通过jQuery.ajaxTransport
(http://code.jquery.com/jquery-1.10.0.js,#8663)的jQuery AJAX调用处理的,其中async
设置为false
(这可能是问题的来源)。
现在 - 我能做些什么呢?
该消息出现在最新版本的Chrome和Firefox中。
虽然我无法在jsfiddle上提供测试用例,但下面是一个显示问题的测试用例:
的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 request的显式异步选项设置为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.沃尔夫的上述建议。
即使最新的jQuery也有这一行,所以你有这些选择:
我认为2号是这种情况下最明智的做法。
顺便说一下,如果你还没有尝试过,试试这个: $.ajaxSetup({async:true});
,但我认为它不会起作用。