为什么$(window).on('beforeunload',callback);更新为73.0.3683.103后,不再在Chrome中触发我的Ajax调用吗?

时间:2019-04-12 21:46:03

标签: javascript ajax google-chrome

在我们的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。

2 个答案:

答案 0 :(得分:1)

我也遇到了这个问题。我发现一条推文说,已从Chrome使用的浏览器引擎Blink中的页面关闭事件中删除了对同步xhr的支持。这发生在四月初。 Chrome 73.0.3683.103很有可能在已删除该链接的Blink版本上运行。 sendBeacon和fetch keepalive是在pageunload上触发ajax的新推荐方法。

The tweet in question

答案 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);