仅仅因为您看不到某项功能的用途并不意味着它没有用。
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/