javascript - window.onbeforeunload 可能会触发多次

标签 javascript jquery onbeforeunload

仅仅因为您看不到某项功能的用途并不意味着它没有用。

Stack Exchange 网络、GMail、Grooveshark、Yahoo! Mail 和 Hotmail 使用 onbeforeunload 提示来防止/警告用户他们在开始编辑某些内容后将离开页面。哦,是的,几乎每个接受可保存的用户输入数据的桌面程序都使用这种提示用户在离开前的 UX 模式。


我有一个功能与这个功能类似:

window.onbeforeunload = function(){
    // only prompt if the flag has been set... 
    if(promptBeforeLeaving === true){
        return "Are you sure you want to leave this page?";
    }
}

当用户尝试离开页面时,浏览器会向他们提供离开或留在页面上的选项。如果用户选择“离开此页面选项”,然后他们在页面完全卸载之前再次快速单击链接,则会再次触发对话框。

这个问题有什么万无一失的解决方案吗?


注意:以下不是解决方案:

var alreadyPrompted = false;
window.onbeforeunload = function(){
    // only prompt if the flag has been set... 
    if(promptBeforeLeaving === true && alreadyPrompted === false){
        alreadyPrompted = true;
        return "Are you sure you want to leave this page?";
    }
}

因为用户可能会选择“留在页面上”选项,这会导致以后的 onbeforeunload 停止工作。

最佳答案

我认为您可以使用在 onbeforeunload 回调中启动的计时器 (setInterval) 来完成此操作。 Javascript 执行将在确认对话框打开时暂停,然后如果用户取消计时功能,可以将 alreadyPrompted 变量重置回 false,并清除间隔。

只是一个想法。

好的,我根据您的评论进行了快速测试。

<span id="counter">0</span>
window.onbeforeunload = function () {
   setInterval(function () { $('#counter').html(++counter); }, 1);
   return "are you sure?";
}
window.onunload = function () { alert($('#counter').html()) };

在两个回调之间 #counter 从未超过 2(毫秒)。结合使用这两个回调似乎可以满足您的需求。

编辑 - 评论的回答:

关闭。这就是我的想法

var promptBeforeLeaving = true,
    alreadPrompted = false,
    timeoutID = 0,
    reset = function () {
        alreadPrompted = false;
        timeoutID = 0;
    };

window.onbeforeunload = function () {
    if (promptBeforeLeaving && !alreadPrompted) {
        alreadPrompted = true;
        timeoutID = setTimeout(reset, 100);
        return "Changes have been made to this page.";
    }
};

window.onunload = function () {
    clearTimeout(timeoutID);
};

关于javascript - window.onbeforeunload 可能会触发多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126820/

相关文章:

javascript - jQuery 未在 Firefox 中定义错误

jquery - 如何调试通过 AJAX(特别是 jQuery)加载的 Javascript

javascript - window.onbeforeunload 不在子窗口中触发

javascript - 使用 jquery 进行项目搜索时表损坏

javascript - C.S. 基础知识 : Understanding Data Packets, 协议(protocol),Wireshark

javascript在函数构造函数中访问 "this"

javascript - Angular js/javascript 计算一次迭代的次数

jquery - 不支持 Youtube 链接

javascript - Ajax 在 javascript window.beforeunload : returning error 期间

angular - 使用 Angular 关闭浏览器窗口/选项卡时执行异步服务获取