jQuery 已弃用同步 XMLHTTPRequest

IT技术 javascript jquery ajax xmlhttprequest
2021-01-23 12:31:53

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

已弃用,因为它会对最终用户的体验产生不利影响。

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

此外,文档说工作人员之外的同步 XMLHttpRequest 正在从网络平台中删除,当发生这种情况时,如果用户代理在服务中使用它们,他们是否需要修改现有代码?

6个回答

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

async: false

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

默认为async: true,因此如果您根本不使用此选项,那么如果该功能被真正删除,您的代码应该是安全的。

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

请注意,Fetch要替换APIXMLHttpRequest甚至不提供同步选项。

这是 jQuery 的警告。我可以无视吗?我不使用对服务器的同步调用。我完美主义的一面根本不喜欢有警告。
2021-03-16 12:31:53
该插件从.properties文件加载资源包它可能使用同步 AJAX 来执行此操作,从而导致此警告。
2021-03-18 12:31:53
@ManuelJordan 设置 async: true 在 i18n 中会导致在慢速连接时延迟显示页面中显示的字符串。而是显示字符串代码
2021-03-19 12:31:53
@Jordan 我认为警告来自浏览器,而不是 jQuery。每当您尝试使用同步 AJAX 时都会发生这种情况。如果您使用 jQuery,则只有将该选项指定为$.ajax.
2021-03-23 12:31:53
我正在使用,jquery.i18n.properties.js但我身边没有明确的电话,$.ajax.也许在内部,但不确定。
2021-04-05 12:31:53

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

解决方案是通过取消选中 VS 工具栏下拉菜单中的“启用浏览器链接”来禁用“浏览器链接”功能,该下拉菜单由顺时针指向的小刷新图标指示。一旦你这样做并重新加载页面,警告就会停止!

禁用浏览器链接

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

这不仅仅是修复了 ajax 警告。我在使用 asp core 的 javascript 控制台中遇到了各种浏览器链接混乱。
2021-03-17 12:31:53
@coding4fun 感谢您的意见;您可以随时向 Microsoft 提交错误。我并不是说你应该禁用浏览器链接。对于某些情况下此警告的原因,我的回答是准确的,排除您自己的代码中的某些内容很有用。一旦我意识到这不是我做错的事情并认为其他人可能也会觉得它有帮助,我个人感觉好多了。
2021-04-01 12:31:53
有谁知道什么是浏览器链接,为什么它最终会给出这样的警告?
2021-04-01 12:31:53
可以web.config通过添加<add key="vs:EnableBrowserLink" value="false" />inside来禁用,<appSettings>如下所述:poconosystems.com/software-development/...
2021-04-07 12:31:53
我认为这是一个糟糕的建议,只是为了在控制台中处理警告消息。禁用 browserlink 并摆脱 browserlink 添加的生产力增强功能,这样您就不会在浏览器控制台中看到警告消息?最好向微软提交错误并修复。
2021-04-11 12:31:53

这发生在我身上,因为在正文部分结束之前有一个指向头部外部的外部 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")
2021-03-31 12:31:53

@henri-chan在评论中提到它,但我认为它值得更多关注:

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

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

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

<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();
});
}
如果通过innerHTML 直接将脚本插入到DOM 中,则不会执行脚本。因此,当您调用 .html() 时,jQuery 会同步获取并执行包含在 html 响应中的任何脚本。
2021-03-22 12:31:53
@whitelettersinblankpapers 我认为他的意思是:在您的 ajax 回调中,如果您附加到“div”的内容包含脚本标签,那么这些将被同步调用。
2021-04-05 12:31:53
@HenryChan,我试图理解你,但无济于事。你能不能用简单的词给我解释一下。我不将脚本插入 DOM,我只插入 HTML,但这个解决方案仍然是我唯一可行的解​​决方案。提前致谢
2021-04-09 12:31:53