在提示onBeforeUnload后检测用户是否停留

Dan*_*ola 9 javascript onbeforeunload

在我正在处理的网络应用程序中,我正在捕获onBeforeUnload以询问用户他是否真的要退出.

现在,如果他决定留下来,我想做很多事情.我想弄清楚的是他实际上选择了留下来.

我当然可以声明一个SetTimeout为"x"秒,如果它触发,那么这意味着用户仍然在那里(因为我们没有被卸载).问题是用户可以花时间决定是否留下来......

我首先希望在对话框显示时,SetTimeout调用不会触发,所以我可以设置一个短暂的超时,并且只有在用户选择留下时它才会触发.但是,在显示对话框时发生超时,因此不起作用.

我尝试的另一个想法是在窗口/文档上捕获mouseMoves.在显示对话框时,mouseMoves确实不会触发,除了一个真正适用于我的情况的奇怪异常,因此也不起作用.

谁能想到其他方法呢?

谢谢!


(如果您好奇,捕获mouseMove不起作用的原因是我的页面中有一个IFrame,其中包含来自另一个域的网站.如果在卸载页面时,焦点位于IFrame内,对话框显示,然后当鼠标从IFrame内部移动到外部时(至少在Firefox中),我得到MouseMove事件触发ONCE.这可能是一个bug,但是,很可能在我们的情况下会发生,所以我不能用这种方法).

Dan*_*ola 6

我最终做的是挂钩我的文档的点击事件,一旦我收到点击,我认为用户已经停留.

这不是一个好的解决方案,在大多数情况下(如果你是一个DiggBar)你会有很多假阴性(人们会留下来,你永远不会知道它),但在我们的情况下,它完全有道理,因为人们互动与我们的网站密切相关,不仅仅是框架网站.

基本上,我的代码做到了这一点......

function OnBeforeUnload() {
    Event.observe(document, "click", UserStayed);
    if (IConsiderTheIFrameMightBeTryingToPopOut) {
        return "The site is trying to escape. Do you want to stay?";
    }
}

function UserStayed() {
Event.stopObserving(document, "click", UserStayed);
    // New we know the user is still with us for sure.
}
Run Code Online (Sandbox Code Playgroud)