如何知道用户是否点击了Javascript onbeforeunload对话框上的取消?

当有人试图离开特定页面而没有保存他们的工作时,我弹出一个对话框。 我使用Javascript的onbeforeunload事件,效果很好。

现在,当用户在出现的对话框上单击“取消”时,我想运行一些Javascript代码(说他们不想离开页面)。

这可能吗? 我也在使用jQuery,所以有可能像我之前可以绑定的beforeunloadcancel这样的事件吗?

更新 :如果用户选择取消,则实际上是将用户保存并指向不同的网页

你可以这样做:

$(function() { $(window).bind('beforeunload', function() { setTimeout(function() { setTimeout(function() { $(document.body).css('background-color', 'red'); }, 1000); },1); return 'are you sure'; }); }); 

第一个setTimeout方法中的代码延迟为1毫秒。 这只是将function添加到UI queue 。 由于setTimeout以异步方式运行,因此Javascript解释器将通过直接调用return语句继续执行,而return语句又会触发浏览器modal dialog 。 这将阻止UI queue并且不会执行第一个setTimeout的代码,直到模式关闭。 如果用户按下取消,它将触发另一个在大约一秒钟内触发的setTimeout。 如果用户确认为ok,则用户将重定向,并且永远不会触发第二个setTimeout。

例如: http : //www.jsfiddle.net/NdyGJ/2/

我知道这个问题现在已经过时了,但是如果有人仍然遇到这个问题,我找到了一个似乎对我有用的解决方案,

基本上,在beforeunload事件之后触发了beforeunload事件。 我们可以使用它来取消在beforeunload事件中创建的超时,修改jAndy的答案:

 $(function() { var beforeUnloadTimeout = 0 ; $(window).bind('beforeunload', function() { console.log('beforeunload'); beforeUnloadTimeout = setTimeout(function() { console.log('settimeout function'); $(document.body).css('background-color', 'red'); },500); return 'are you sure'; }); $(window).bind('unload', function() { console.log('unload'); if(typeof beforeUnloadTimeout !=='undefined' && beforeUnloadTimeout != 0) clearTimeout(beforeUnloadTimeout); }); }); 

编辑: jsfiddle在这里

我不认为这是可能的,但只是尝试了这个想法并且它有效(虽然它是一些黑客,可能在所有浏览器中都不一样):

 window.onbeforeunload = function () { $('body').mousemove(checkunload); return "Sure thing"; }; function checkunload() { $('body').unbind("mousemove"); //ADD CODE TO RUN IF CANCEL WAS CLICKED } 

不可能。 也许有人会certificate我错了……你想要运行什么代码? 要点击取消时要自动保存吗? 这听起来违反直觉。 如果你还没有自动保存,我认为当他们点击“取消”时自动保存是没有意义的。 也许您可以突出显示onbeforeunload处理程序中的保存按钮,以便用户在导航之前看到他们需要做什么。

 window.onbeforeunload = function() { if (confirm('Do you want to navigate away from this page?')) { alert('Saving work...(OK clicked)') } else { alert('Saving work...(canceled clicked)') return false } } 

使用此代码,如果用户在IE8中单击“取消”,则会出现默认导航对话框。