我试图在用户关闭浏览器时发出一个put请求来保存一些东西。我使用的是angular,我已经尝试使用onbeforeunload和onunload事件,但没有让它以我想要的方式工作。我有一个资源,我想更新。
$window.onbeforeunload = function(){
myResource.foo = closingBrowser();
myResource.$update();}
运行fiddler时,我发现它没有执行put请求。当我使用$window.onunload
时也没有。但是如果我向onbeforeunload
输入return语句,就会弹出确认框,当我单击OK时,fiddler显示put请求完成。现在我不想要这个弹出框,我只想在用户关闭浏览器时执行PUT。
有没有一种方法让我用这些方法来做这件事,或者我必须用其他方法来解决它(非常感谢建议)?
更新日期:
我又做了一些测试,发现了一些不一致的行为。在Internet Explorer(11)中:如果我有return语句,就会有一个经典的弹出窗口。但是只有当我按下cancel并返回到页面时,它才会发送PUT。如果我按下OK离开,PUT不会发出。
在chrome中:如果我按cancel返回,或者Ok离开,PUT仍然会被发送。另一个在chrome中工作但不在ie中的'hack'(?),当没有返回时(没有弹出窗口,这是想要的行为),在$update()
之后有一个循环,类似于:while(!myResource.$resolved){}
(或者只是一个for循环迭代几百万次也可以工作,但它看起来更丑,)chrome实际上发送了PUT(IE没有)。
你认为这将如何在IE中复制?
我没有在firefox上做过广泛的测试,但我做的很少,它看起来更像chrome。
2条答案
按热度按时间iyfjxgzm1#
你不能逃避这个弹出窗口(“你想关闭这个窗口bla bla bla...”).我认为最好的解决方案是下一个:
1.如果用户关闭当前选项卡,浏览器将显示弹出与您的文本
1.你发送http把请求到服务器,当http请求将调用成功回调你会,显示自定义弹出(“您的设置或其他东西被保存bla bla bla)
1.使用window关闭窗口
uyhoqukh2#
我认为现在你可以使用Service Worker来处理这个问题。
可以在卸载前向ServiceWorker onbeforeunload发送消息并执行请求。也可以ping service worker并检测应用程序何时停止从sw端ping,然后执行PUT请求。