捕获window.onbeforeunload确认对话框的结果

xzy*_*fer 12 javascript jquery javascript-events onunload window.onunload

是否有一种方法可以捕获window.onbeforeunload确认对话框的结果,如Stack Overflow中的下一个(当离开'Ask Question'页面而不发布问题时会发生这种情况)?

这就是它在Chrome中的显示方式,我相信它在其他浏览器中略有不同,但你总是有某种形式的是/否按钮.

window.onbeforeunload确认对话框

据推测,如果事件被触发后他们仍然在违规页面上,他们选择留下来,你可以通过观察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')
Run Code Online (Sandbox Code Playgroud)

请注意我在我的网站中使用jQuery.

我本质上是在尝试实现像绘图实现一样的Gmail,其中如果用户离开带有表单的页面,他们已经进行了更改而没有保存,他们会使用类似的对话框加热.如果他们选择丢弃他们的更改并离开页面,我需要清理数据库中的一些临时记录(我正在考虑一个AJAX调用,或者只是提交带有delete标志的表单)然后在他们的路上发送它们.

我的问题还涉及:

在手动刷新后获取页面后,onunload处理程序中的jQuery AJAX调用触发.我如何保证首先发生onunload?

小智 6

这个怎么样:

$( window ).bind( 'beforeunload' , function( event ) {
    setTimeout( function() {
        alert( 'Hi againe!' );
    } );
    return '';
} ).bind( 'unload', function( event ) {
    alert( 'Goodby!' );
} );
Run Code Online (Sandbox Code Playgroud)

  • 这并没有真正削减它......即使在本地主机上,它在`beforeunload`和`unload`之间通常需要不止一个滴答声。在慢速连接上,即使是 500 毫秒的延迟也可能太短。 (2认同)

myl*_*gon 6

聚会迟到了,但我发现下面的代码(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)
  });
}
Run Code Online (Sandbox Code Playgroud)

我不确定您需要在该unload事件中运行代码多少时间,但在本例中,我通过 Socket.io 发送通知,因此完成速度非常快。

至于检测该通知的取消,正如其他人提到的,创建一个全局变量,例如let didEnterBeforeUnload = false可以设置为事件触发true时的值beforeunload。之后,通过创建第三个事件,就像这样(同样,在 TypeScript 中),您可以推断用户按下了取消

window.addEventListener('focus', (e) => {

  if (didEnterBeforeUnload) {
    console.log('pressed cancel')
  }

  didEnterBeforeUnload = false
});
Run Code Online (Sandbox Code Playgroud)

不过,作为旁注,除非您与页面进行了交互,否则这些事件不会 (iirc) 触发。因此,在测试期间尝试导航离开之前,请确保单击或点击进入页面。

我希望这对其他人有帮助!

  • 检测是否按下取消按钮的解决方法对我有用。谢谢! (2认同)

Hao*_*chi 5

您可以使用window.onbeforeunload进行退出确认,但无法找出用户单击了哪个按钮。

从这个线程引用jvenema的早期回复:

beforeunload 的主要目的是允许用户选择在更改丢失之前保存更改。

此外,如果您的用户要离开,那已经太晚了 [...]

  • 为了测试用户点击了什么:我找到了一个使用 ```window.onfocus()``` 的成功解决方案。该函数会在用户点击STAY 时触发,并返回到页面。但是,请注意,更改选项卡、窗口等时也会触发 onfocus()。在 onbeforeunload() 中设置一个全局变量,以便能够检查/捕获用户来自何处。如果用户确实想离开页面,你可以在 ```window.onunload()``` 中做一些最后的事情 (7认同)