jQuery已弃用同步XMLHTTPRequest


119

像许多其他网站一样,我的网站使用的是jQuery。打开开发人员工具时,我看到一条警告,指出XMLHTTPRequest是

不推荐使用,因为它对最终用户的体验有不利影响。

我继续阅读了部分文档,但这是相当技术性的。有人可以用简单的术语解释从XMLHTTPRequest转换为WHATWG的后果吗?它说发生在2012年。

此外,该文档还说,正在从Web平台删除工作人员外部的Synchronous XMLHttpRequest,当发生这种情况时,如果用户代理将它们放在服务中,他们是否需要修改其现有代码?


2
您必须谈论的是同步XMLHTTPRequest,而不是异步的,对吗?同步请求对于最终用户的体验来说是可怕的(它们在请求期间锁定了浏览器),通常不应该使用。
jfriend00 2015年

2
提供一些触发此代码的代码
charlietfl 2015年

3
这是全文吗?不赞成在主线程上使用同步XMLHttpRequest,因为它会对最终用户的体验产生不利影响。
澳洲航空94年重型

1
jQuery仅对同步请求给出警告,不是吗?您是否故意发出同步请求?如果是这样,解决方案是将代码构造为可处理异步请求,无论如何都应这样做,因为从用户的角度来看它们要好得多。
nnnnnn 2015年

1
我不仅在我的网站上看到过该标志,还曾在其他地方看到过该标志,例如Youtube。关于规范,我的代码应符合W3C或WHATWG的哪个规范?,我不想在主线程中询问的引用,因为我认为它会被标记为观点问题。@ Qantas94Heavy
Edd

Answers:


136

为避免此警告,请勿使用:

async: false

在您的任何$.ajax()通话中。这是XMLHttpRequest不推荐使用的唯一功能。

默认值为async: true,因此,如果您根本不使用此选项,则如果确实删除了该功能,则代码应该是安全的。

但是,可能不会-可能会将其从标准中删除,但是我敢打赌,浏览器将继续支持它很多年。因此,如果由于某种原因确实需要同步AJAX,则可以使用async: false并忽略警告。但是有充分的理由将同步AJAX视为劣质样式,因此您应该尝试找到一种避免这种方式的方法。而且编写Flash应用程序的人可能也从未想到它会消失,但是现在正在逐步淘汰它。

请注意,Fetch要替换的API XMLHttpRequest甚至没有提供同步选项。


9
那么这就是jQuery的警告。我可以忽略它吗?我不使用对服务器的同步调用。我的完美主义者根本不喜欢发出警告。
乔丹

2
@Jordan我认为警告来自浏览器,而不是jQuery。每当您尝试使用同步AJAX时,它就会发生。如果您使用jQuery,则只有在将该选项指定为时,才会发生这种情况$.ajax
Barmar 2015年

2
我正在使用,jquery.i18n.properties.js但是我的身边并没有明确调用“ $.ajax.也许在内部,但不确定”。
曼努埃尔·乔丹

1
该插件从.properties文件加载资源包。可能是使用同步AJAX来执行此操作,从而引起此警告。
Barmar

1
@ManuelJordan设置async:在i18n中为true可能会导致显示慢速连接时显示在页面中显示的字符串的延迟。改为显示字符串代码
Siyon DP

62

可接受的答案是正确的,但是如果您使用Visual Studio 2013或更高版本在ASP.NET下进行开发,并且确定没有进行任何同步ajax请求或在错误的位置定义脚本,则我发现了另一个原因。

解决方案是通过在VS工具栏下拉菜单中取消选中“启用浏览器链接”来禁用“浏览器链接”功能,该工具栏下拉菜单由顺时针指向的小刷新图标指示。完成此操作并重新加载页面后,警告应停止!

禁用浏览器链接

这仅应在本地调试时发生,但是知道警告的原因仍然很高兴。


您可以按照以下说明web.config通过添加<add key="vs:EnableBrowserLink" value="false" />内部内容来禁用它<appSettings>poconosystems.com/software-development/…
Beel 2016年

3
我认为这是一个不好的建议,只是为了在控制台中获得警告消息。禁用浏览器链接并摆脱浏览器链接增加的生产力增强功能,这样您就不会在浏览器控制台中看到警告消息?最好向Microsoft提交错误,然后将其修复。
编码4fun

4
@ coding4fun感谢您的意见;您可以随时向Microsoft提交错误。我并不是说您应该禁用浏览器链接。对于某些情况下此警告的原因,我的回答是准确的,排除自己代码中的某些内容很有用。一旦我意识到这不是我做错的事情,并以为其他人也可能会觉得有用,我个人会感觉更好。
山姆

这不仅解决了ajax警告。我在使用asp核心的javascript控制台中遇到了各种浏览器链接混乱。
JoeBass

谁知道浏览器链接是什么,为什么最终会给出这样的警告?
gideon

15

这是通过在主体部分结尾之前在头部外部链接到外部js发生的。您知道,其中之一:

<script src="http://somesite.net/js/somefile.js">

它与JQuery没有任何关系。

您可能会看到类似的操作:

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

但是我还没有检验过这个想法。


当我删除这样的行时,警告对我消失了:@ Html.Script(“〜/ scripts / apps / appname.js”)
MsTapp

10

@ henri-chan曾将其作为评论提到,但我认为值得更多关注:

当您使用jQuery / javascript用新的html更新元素的内容,并且此新的html包含<script>标签时,这些标签将同步执行,从而触发此错误。样式表也是如此。

您知道XHR在控制台窗口中看到正在加载的(多个)脚本或样式表时,这种情况正在发生。(Firefox)。


3

以前的答案(都正确)中没有一个适合我的情况:我没有在中使用async参数,jQuery.ajax()也没有在返回的内容中包含script标记,例如:

<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,它会发出警告标志。我通过用click()函数替换f2调用解决了这个问题:

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

5
如果直接通过innerHTML将脚本插入DOM,则不会执行脚本。因此,当您调用.html()时,jQuery会同步获取并执行html响应中包含的所有脚本。
Henry Chan

@HenryChan,我试图了解您,但无济于事。你能用简单的话向我解释。我不将脚本插入DOM,仅插入HTML,但此解决方案对我来说是唯一可行的解​​决方案。在此先感谢
Adib Aroui '16

2
@whitelettersinblankpapers我认为他的意思是:在ajax回调中,如果您附加到“ div”上的内容包含脚本标记,那么这些将被同步调用。
Haitham Sweilem,2013年

1

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


您有一点代码让我知道如何实现吗?
ZerOne 2015年

5
@runback,不能使用done()承诺回调吗? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) 希望我没有看错任何东西。
pravin 2015年

0

如果我们在局部视图中加载脚本,那么这个问题就来了

  1. 我在局部视图中删除了脚本,然后移至主视图。

这个解决方案对我来说很好

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.