捕获window.onbeforeunload确认对话框的结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了捕获window.onbeforeunload确认对话框的结果相关的知识,希望对你有一定的参考价值。
是否有一种方法可以捕获window.onbeforeunload确认对话框的结果,如Stack Overflow中的下一个(当离开'Ask Question'页面而不发布问题时会发生这种情况)?
这就是它在Chrome中的显示方式,我相信它在其他浏览器中略有不同,但你总是有某种形式的是/否按钮。
据推测,如果事件被触发后他们仍然在违规页面上,他们选择留下来,你可以通过观察js序列来解决这个问题。但是我想知道如何确定他们是否点击了“离开此页面”?
我已经实现了如下:
// concept taken from SO implementation
function setConfirmUnload(showMessage, message) {
window.onbeforeunload = showMessage ? (message ? message : "this is a default message") : null;
}
// pseudo code
listen to changes on inputs
if any inputs fire a change event
call setConfirmUnload(true, 'My warning message')
请注意我在我的网站中使用jQuery。
我本质上是在尝试实现像绘图实现一样的Gmail,其中如果用户离开带有表单的页面,他们已经进行了更改,而没有保存它们会被类似的对话框加热。如果他们选择丢弃他们的更改并离开页面,我需要清理数据库中的一些临时记录(我正在考虑一个AJAX调用,或者只是提交带有delete
标志的表单)然后发送它们的方式。
我的问题还涉及:
您可以使用window.onbeforeunload进行退出确认,但无法找到用户点击的按钮。
引用jvenema from this thread先前的回复:
beforeunload的主要目的是允许用户选择在更改丢失之前保存更改。
此外,如果您的用户离开,已经太晚了[...]
这个怎么样:
$( window ).bind( 'beforeunload' , function( event ) {
setTimeout( function() {
alert( 'Hi againe!' );
} );
return '';
} ).bind( 'unload', function( event ) {
alert( 'Goodby!' );
} );
晚到派对,但我发现以下代码(在TypeScript中)是一个很好的方法来检测该人是否在该确认对话窗口点击了“确定”。
public listenToUnloadEvents(): void {
window.addEventListener('beforeunload', (e) => {
const confirmationMessage = 'o/';
(e || window.event).returnValue = confirmationMessage; // Gecko + IE
return confirmationMessage; // Webkit, Safari, Chrome etc.
});
window.addEventListener('unload', () => {
this.sendNotification(Action.LEFT)
});
}
我不确定你有多少时间在unload
事件中运行代码,但在这个例子中,我通过Socket.io发送通知,所以它很快完成。
至于检测该通知的取消,正如其他人提到的那样,当let didEnterBeforeUnload = false
事件触发时,创建像true
这样的全局变量可以设置为beforeunload
。在此之后,通过创建第三个事件(再次,在TypeScript中),您可以推断用户按取消
window.addEventListener('focus', (e) => {
if (didEnterBeforeUnload) {
console.log('pressed cancel')
}
didEnterBeforeUnload = false
});
但是,作为附注,除非您与页面进行了交互,否则这些事件不会(iirc)触发。因此,在测试期间尝试离开之前,请务必点击或点按页面。
我希望这有助于其他人!
以上是关于捕获window.onbeforeunload确认对话框的结果的主要内容,如果未能解决你的问题,请参考以下文章
JS捕获关闭浏览器事件之chrome浏览器真支持onbeforeunload事件吗