同步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中实现更改的方式:

  • 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.沃尔夫的上述建议。


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

  • 自己更改jQuery的来源 - 但也许有一个很好的理由使用它
  • 请注意警告,请注意,此选项已弃用且未过时。
  • 改变你的代码,所以它不使用这个功能
  • 我认为2号是这种情况下最明智的做法。

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

    链接地址: http://www.djcxy.com/p/55337.html

    上一篇: Synchronous XMLHttpRequest warning and <script>

    下一篇: Is it possible to abort a synchronous XmlHttpRequest?