32

我没有这方面的实际用例,但我很好奇,如果用户在触发 window.onbeforeunload 时点击“留在此页面上”,是否有办法做出反应(回调)。

http://jsfiddle.net/rWHU9/

function warning(){
    if(true){
      console.log('leaving');
      return "You are leaving the page";
    }
}
window.onbeforeunload = warning;​
4

5 回答 5

27

留在页面没有回调,但离开页面有回调,window.unload.

尝试在 中设置超时beforeunload,然后在卸载中清除它。如果你留下,超时将运行,否则将被清除。

var timeout;

function warning() {
    timeout = setTimeout(function() {
        alert('You stayed');
    }, 1000);
    return "You are leaving the page";
}

function noTimeout() {
    clearTimeout(timeout);
}

window.onbeforeunload = warning;
window.unload = noTimeout;​

演示:http: //jsfiddle.net/aPwfz/1/

于 2012-08-06T20:24:14.823 回答
10

简短的回答:不,目前还没有回调或任何直接的方法来拦截“留在此页面上”事件。

但是,您可以稍微作弊并创建如下构造:

function warning() {
    setTimeout(function() {
        setTimeout(function() {
            alert('user choosed to stay on this site: ' + location.href);
        }, 100);
    },1);
    return "You are leaving the page";
}
window.onbeforeunload = warning;​

由于问题是模态对话框,因此在setTimeout您确认该模态框之前不会触发回调。但正如您现在正确假设的那样,如果您单击“离开此站点”,这也会触发。所以这很棘手。要解决这个问题,您需要增加setTimeout以使浏览器有足够的时间访问unload该页面。

为什么会有两个setTimeout()的嵌套?好吧,一旦弹出模式对话框,计时器就会“运行”。所以我们不想在模式对话框关闭之前运行那个计时器。一旦发生这种情况,我们的内在setTimeout就会随着时间的推移启动并做一些事情。

我认为大多数现实世界场景的现实价值是关于2.000内部的 mssetTimeout

于 2012-08-06T20:21:43.077 回答
5

告诉用户单击取消的唯一方法是触发 asetTimeout并查看它是否触发。没有办法从系统的confirm-esque 框中询问返回。

http://jsfiddle.net/rWHU9/2/

于 2012-08-06T20:20:25.277 回答
1

在返回“这里的问题”之前,尝试触发 setTimeout 作为第一个调用任何其他函数的代码(比如 5-10 秒)。IE

window.onbeforeunload = confirmExit;
function confirmExit() {
    setTimeout("thisFunction;", 10000);
    return "do you realy want to close?";
}

并取消 onbeforeclose 这对我有用:尝试一个空函数:

window.onbeforeunload = function(){};

谢谢,祝你好运!

于 2014-07-13T05:23:02.157 回答
0
$(window).bind('beforeunload', function(){
     return '\n Your custom message';
 });

附加了'beforeunload'事件,当你关闭页面,点击返回按钮或重新加载页面时,一个确认框会提示你是否真的想去,选择确定退出页面:取消停止页面退出并停留在同一页面上。

于 2015-01-19T11:36:09.993 回答