jQuery已弃用同步XMLHTTPRequest

5hcedyr0  于 2023-10-17  发布在  jQuery
关注(0)|答案(7)|浏览(94)

和其他人一样,我的网站也使用jQuery。当我打开开发人员工具时,我看到一个警告,说XMLHTTPRequest是
由于其对最终用户体验的不利影响而被弃用。
我继续阅读了documentation的一部分,但它相当技术性。有人能简单地解释一下从XMLHTTPRequest转换到WHATWG的后果吗?据说是2012年的事。
此外,文档中说,工人之外的同步XMLHttpRequest正在从Web平台中删除,当这种情况发生时,如果用户代理在服务中拥有它们,他们是否需要修改现有代码?

iecba09b

iecba09b1#

为避免出现此警告,请勿用途:

async: false

你的任何一个$.ajax()电话这是XMLHttpRequest唯一不推荐使用的特性。
默认值是async: true,所以如果你从来不使用这个选项,你的代码应该是安全的,即使这个特性真的被删除了。
然而,它可能不会-它可能会从标准中删除,但我敢打赌浏览器将继续支持它很多年。因此,如果您出于某种原因确实需要同步AJAX,您可以使用async: false并忽略警告。但是有很好的理由说明为什么同步AJAX被认为是糟糕的风格,所以您可能应该尝试找到一种方法来避免它。那些写Flash应用程序的人可能也从未想过它会消失,但它现在正在逐步淘汰。
注意,取代XMLHttpRequestFetch API甚至没有提供同步选项。

mqkwyuun

mqkwyuun2#

公认的答案是正确的,但我发现了另一个原因,如果你在ASP.NET下使用Visual Studio 2013或更高版本进行开发,并且确定你没有发出任何同步访问请求或在错误的地方定义任何脚本。
解决方案是通过取消选中VS工具栏中的“启用浏览器链接”来禁用“浏览器链接”功能,该工具栏由顺时针指向的小刷新图标指示。一旦你这样做并重新加载页面,警告应该停止!

这应该只在本地调试时发生,但知道警告的原因仍然很好。

tuwxkamq

tuwxkamq3#

这发生在我身上,因为在body部分结束之前,在head之外有一个外部js的链接。你知道,其中之一:
<script src="http://somesite.net/js/somefile.js">
它与jQuery无关。
你可能会看到同样的事情做这样的:

var script = $("<script></script>");
script.attr("src", basepath + "someotherfile.js");
$(document.body).append(script);

但我还没有测试过这个想法。

eivnm1vs

eivnm1vs4#

这是@henri-chan的评论,但我认为它值得更多的关注:
当你使用jQuery/JavaScript用新的html更新元素的内容时,这个新的html包含<script>标签,这些标签被同步执行,从而触发这个错误。样式表也是如此。
当您在控制台窗口中看到(多个)脚本或样式表作为XHR加载时,您就知道这是在发生的。(firefox).

lmyy7pcs

lmyy7pcs5#

前面的答案(都是正确的)都不适合我的情况:我在jQuery.ajax()中没有使用async参数,并且我没有将脚本标记作为返回内容的一部分,例如:

<div> 
     SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script>

我的情况是,我连续调用两个AJAX请求,目的是同时更新两个div:

function f1() {
     $.ajax(...); // XMLHTTP request to url_1 and append result to div_1
}

function f2() {
     $.ajax(...); // XMLHTTP request to url_2 and append result to div_2
}

function anchor_f1(){
$('a.anchor1').click(function(){
     f1();
})
}

function anchor_f2(){
$('a.anchor2').click(function(){
     f2();
});
}

// the listener of anchor 3 the source of problem
function anchor_problem(){
$('a.anchor3').click(function(){
     f1();
     f2();
});
}

anchor_f1();
anchor_f2();
anchor_problem();

当我点击a.anchor3时,它会引发警告标志。我通过将f2调用替换为click()函数来解决这个问题:

function anchor_problem(){
$('a.anchor_problem').click(function(){
     f1();
     $('a.anchor_f2').click();
});
}
nukf8bse

nukf8bse6#

我的工作:我使用异步请求将代码转储到缓冲区。我有一个循环每秒检查缓冲区。当转储到达缓冲区时,我执行代码。我也用了超时。对于最终用户,页面的工作方式就像使用同步请求一样。

pdtvr36n

pdtvr36n7#

我进一步研究了这个错误,得出的结论是错误来自这里:

jQuery.ajaxTransport( function( options ) {
    ...

            xhr.open(
                options.type,
                options.url, 
                options.async, // This one
                options.username,
                options.password
            );
    ...

如果将其设置为true,则即使将其设置回options.exe,错误也会消失。所以也许一个很好的解决这个问题的方法是使用下载的jquery文件并修改这一行(在3.2.1文件中是在9400上的~)

相关问题