为什么$(window).on('beforeunload',callback);

在我们的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调用,并且我已经确认我们的网络服务器也未收到请求。但是,当我在Chrome 73.0.3683.86上运行相同的代码时,它将触发Ajax请求,并且Web服务器会收到它!我确认此更改会影响Mac OS和Windows。


Chrome 73.0.3683.103中的哪些更改导致了此问题?和/或如何解决?


来自客户的一系列支持通知书引起了我们的注意,因为这对我们的应用程序的工作方式产生了负面影响。在我11年的职业生涯中,作为Web应用程序开发人员,这是我第一次告诉我们的用户切换到Internet Explorer。


青春有我
浏览 467回答 2
2回答

临摹微笑

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

慕后森

我的使用信标的解决方法-异步调用不是答案,而是解决方案:我使用问题注释中提供的提示来提出以下解决方案。我在现有代码之上添加了此代码,因此现有代码是后备代码。请注意,使用信标将触发异步调用。if (navigator && navigator.sendBeacon) {    navigator.sendBeacon(url);    return;}Ildar Faizov提到的解决方法-同步呼叫我没有对此进行测试,但是据报道这可以工作并执行同步ajax调用。var img = document.createElement('img');img.src = url;document.body.appendChild(img);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript