在我们的Web应用程序中,我们使用一个在beforeunload事件时触发的ajax调用来跟踪用户是否仍在处理某些信息。大致如下:
$(window).on('beforeunload', function() {
$.ajax({
async: false,
url: "../orderInformation/assignOrder",
data: {
orderId: orderId,
shouldAssign: false
}
});
console.info("Handled beforeunload");
});
直到今天,这在Chrome,IE和Firefox中都运行良好。从Chrome 73.0.3683.103版本开始,不再执行Ajax调用,尽管该处理程序中的其余JS都可以执行。即消息将打印到控制台。
Chrome的开发者工具栏上没有显示正在版本73.0.3683.103中执行的AJAX调用,并且我已经确认我们的Web服务器也未收到请求。但是,当我在Chrome 73.0.3683.86上运行相同的代码时,它将触发Ajax请求,并且Web服务器会收到它!我确认此更改会影响Mac OS和Windows。
Chrome 73.0.3683.103中的哪些更改导致了此问题?和/或我该如何解决?
我们收到了来自客户的一系列支持通知,引起了我们的注意,因为这对我们的应用程序的工作方式产生了负面影响。在我作为Web应用程序开发人员的11年职业中,我第一次必须告诉我们的用户切换到Internet Explorer。
答案 0 :(得分:1)
我也遇到了这个问题。我发现一条推文说,已从Chrome使用的浏览器引擎Blink中的页面关闭事件中删除了对同步xhr的支持。这发生在四月初。 Chrome 73.0.3683.103很有可能在已删除该链接的Blink版本上运行。 sendBeacon和fetch keepalive是在pageunload上触发ajax的新推荐方法。
答案 1 :(得分:0)
我使用信标的解决方法-异步呼叫
不是答案,但这是一个解决方案:我使用问题注释中提供的提示来提出以下解决方案。我在现有代码上方添加了此代码,因此现有代码是后备代码。请注意,使用信标会触发异步呼叫。
if (navigator && navigator.sendBeacon) {
navigator.sendBeacon(url);
return;
}
Ildar Faizov提到的解决方法-同步呼叫
我没有对此进行测试,但是据报道它可以正常工作并执行同步ajax调用。
var img = document.createElement('img');
img.src = url;
document.body.appendChild(img);