jQuery 已弃用同步 XMLHTTPRequest
Posted
技术标签:
【中文标题】jQuery 已弃用同步 XMLHTTPRequest【英文标题】:jQuery has deprecated synchronous XMLHTTPRequest 【发布时间】:2015-02-28 10:22:36 【问题描述】:像许多其他人一样,我的网站使用 jQuery。当我打开开发者工具时,我看到一条警告说 XMLHTTPRequest 是
因其对最终用户体验的不利影响而被弃用。
我继续阅读了documentation 的一部分,但它是相当技术性的。有人可以简单地解释一下从 XMLHTTPRequest 转移到 WHATWG 的后果吗?它说它发生在 2012 年。
此外,文档说工作人员之外的同步 XMLHttpRequest 正在从 Web 平台中删除,当这种情况发生时,如果用户代理将它们放在服务中,他们是否需要修改现有代码?
【问题讨论】:
您说的一定是同步的 XMLHTTPRequest,而不是异步的,对吗?同步请求对于最终用户体验来说是很糟糕的(它们在请求期间锁定了浏览器),通常不应该使用。 提供一些触发这个的代码 这是有问题的全文吗? 主线程上的同步 XMLHttpRequest 已被弃用,因为它对最终用户的体验产生不利影响。 jQuery 只对同步请求发出警告,不是吗?您是否故意发出同步请求?如果是这样,解决方案是构建您的代码以处理异步请求,无论如何您都应该这样做,因为从用户的角度来看它们更好。 我不仅在我的网站上看到过这个标志,我还在其他一些地方看到过,例如优酷也一样。关于规范,我的代码应该符合 W3C 还是 WHATWG 的规范? , reference 我不想在主线程中询问,因为我猜它会被标记为意见问题。 @Qantas94Heavy 【参考方案1】:为避免此警告,请勿使用:
async: false
在您的任何$.ajax()
电话中。这是XMLHttpRequest
唯一被弃用的功能。
默认值为async: true
,因此如果您根本不使用此选项,那么如果该功能被真正删除,您的代码应该是安全的。
但是,它可能不会——它可能会从标准中删除,但我敢打赌浏览器会继续支持它很多年。因此,如果您出于某种原因确实需要同步 AJAX,则可以使用 async: false
并忽略警告。但是同步 AJAX 被认为是糟糕的风格是有充分理由的,所以你应该尝试找到一种方法来避免它。编写 Flash 应用程序的人可能也从未想过它会消失,但它现在正处于逐步淘汰的过程中。
请注意,替换 XMLHttpRequest
的 Fetch
API 甚至不提供同步选项。
【讨论】:
这是 jQuery 的警告。我可以无视吗?我不使用对服务器的同步调用。我完美主义的一面根本不喜欢警告。 @Jordan 我认为警告来自浏览器,而不是 jQuery。每当您尝试使用同步 AJAX 时都会发生这种情况。如果您使用 jQuery,那么只有在您将该选项指定为$.ajax
时才会发生这种情况。
我正在使用jquery.i18n.properties.js
,但我身边没有明确调用$.ajax.
也许在内部,但不确定。
该插件从.properties
文件加载资源包。它可能使用同步 AJAX 来执行此操作,导致此警告。
@ManuelJordan 在 i18n 中设置 async: true 可能会导致在慢速连接时显示页面中显示的字符串出现延迟。改为显示字符串代码【参考方案2】:
我的工作:我使用异步请求将代码转储到缓冲区。我有一个循环每秒检查一次缓冲区。当转储到达缓冲区时,我执行代码。我也使用超时。 对于最终用户来说,页面就像使用同步请求一样工作。
【讨论】:
你有一点代码让我知道如何实现吗? @runback,不能使用 done() 承诺回调吗?$.ajax( url : "example.com", async : true /* default is true */ ).done(function(response) // Process the dump )
希望我没有看错任何东西。【参考方案3】:
这发生在我身上,因为在正文部分结束之前有一个指向外部 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")【参考方案4】:接受的答案是正确的,但如果您使用 Visual Studio 2013 或更高版本在 ASP.NET 下进行开发,并且确定您没有发出任何同步 ajax 请求或在错误的位置定义任何脚本,我发现了另一个原因。
解决方案是通过取消选中 VS 工具栏下拉菜单中的“启用浏览器链接”来禁用“浏览器链接”功能,该下拉菜单由指向顺时针的小刷新图标指示。执行此操作并重新加载页面后,警告应该会停止!
这应该只在本地调试时发生,但知道警告的原因仍然很高兴。
【讨论】:
可以通过在<appSettings>
中添加<add key="vs:EnableBrowserLink" value="false" />
来禁用web.config
,如下所述:poconosystems.com/software-development/…。
我认为这是一个糟糕的建议,只是为了在控制台中获取警告消息。禁用 browserlink 并摆脱 browserlink 添加的生产力增强功能,这样您就不会在浏览器控制台中看到警告消息?最好向微软提交错误并得到修复。
@coding4fun 感谢您的意见;您可以随时向 Microsoft 提交错误。我并不是说您应该禁用浏览器链接。在某些情况下,我的回答对于此警告的原因是准确的,排除您自己代码中的某些内容很有用。一旦我意识到这不是我做错了什么并且认为其他人也可能会觉得它有帮助时,我个人感觉好多了。
这不仅修复了 ajax 警告。我在使用 asp core 的 javascript 控制台中得到了各种浏览器链接。
有人知道什么是浏览器链接,为什么它最终会给出这样的警告吗?【参考方案5】:
没有一个之前的答案(所有答案都是正确的)适合我的情况:我不使用 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();
);
【讨论】:
如果通过 innerHTML 直接将脚本插入 DOM,则不会执行脚本。因此,当您调用 .html() 时,jQuery 会同步获取并执行包含在 html 响应中的任何脚本。 @HenryChan,我试图理解你,但无济于事。你能用更简单的话给我解释一下吗?我不将脚本插入 DOM,我只插入 HTML,但这个解决方案仍然是我唯一可行的解决方案。提前致谢 @whitelettersinblankpapers 我认为他的意思是:在您的 ajax 回调中,如果您附加到“div”的内容包含脚本标签,那么这些将被同步调用。【参考方案6】:@henri-chan 在评论中提到了它,但我认为它值得更多关注:
当您使用 jQuery/javascript 用新的 html 更新元素的内容时,并且这个新的 html 包含 <script>
标签,这些标签会同步执行,从而触发此错误。样式表也是如此。
当您在控制台窗口中看到(多个)脚本或样式表被加载为XHR
时,您就知道发生了这种情况。 (火狐)。
【讨论】:
以上是关于jQuery 已弃用同步 XMLHTTPRequest的主要内容,如果未能解决你的问题,请参考以下文章
jQuery.ajax() 方法的异步选项已弃用,现在怎么办?
同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)
jQuery.type() 已弃用。检查 var 是不是不是对象时,我应该使用啥来代替? [复制]
JQMIGRATE:jQuery.browser 已弃用,无法读取未定义的属性“mozilla”
⚠️ [已弃用]不再维护,请使用https://github.com/fengyuanchen/jquery-viewer