是否有取消window.onbeforeunload的回调

Rob*_*ler 30 javascript

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

http://jsfiddle.net/rWHU9/

function warning(){
    if(true){
      console.log('leaving');
      return "You are leaving the page";
    }
}
window.onbeforeunload = warning;?
Run Code Online (Sandbox Code Playgroud)

Roc*_*mat 26

停留在页面上没有回调,但有一个用于离开页面,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;?
Run Code Online (Sandbox Code Playgroud)

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

  • @JuanMendes:超时为"0",它会在*unload`事件之前运行*. (2认同)

jAn*_*ndy 9

简答:不,没有回调或任何直接拦截"停留在此页面"事件的方法.

但是,你可以作弊并创建一个这样的结构:

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;?
Run Code Online (Sandbox Code Playgroud)

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

为什么有两个setTimeout()嵌套?好吧,一旦模态对话框弹出,计时器就会"运行".因此,我们不希望在模式对话框关闭之前运行该计时器.一旦发生这种情况,我们的内心setTimeout会随着时间的推移而发起并做一些事情.

我认为大多数现实场景的实际价值都是2.000内在的mssetTimeout


jba*_*bey 5

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

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

  • @jbabey:更准确地说,它实际上依赖于浏览器.但是某些浏览器会以某种方式处理命令序列,在显示模态对话框时,`setTimeout`的超时时间会运行,因此`setTimeout`的代码会在模态对话框消失后立即执行.事实上,我们希望在关闭对话框后将`setTimeout`代码插入到UI队列中,以便为浏览器提供实际离开页面的时间窗口. (2认同)