当有人尝试离开某个页面而没有保存他们的工作时,我会弹出一个对话框。我使用JavaScript的onbeforeunload事件,效果很好。
现在我想在用户单击对话框上的“取消”按钮时运行一些JavaScript代码(表示他们不想离开该页面)。
这种做法可行吗?我也使用jQuery,所以是否可以绑定类似于beforeunloadcancel的事件呢?
更新:实际上,这个想法是在选择取消时保存并将用户引导到另一个网页。
当有人尝试离开某个页面而没有保存他们的工作时,我会弹出一个对话框。我使用JavaScript的onbeforeunload事件,效果很好。
现在我想在用户单击对话框上的“取消”按钮时运行一些JavaScript代码(表示他们不想离开该页面)。
这种做法可行吗?我也使用jQuery,所以是否可以绑定类似于beforeunloadcancel的事件呢?
更新:实际上,这个想法是在选择取消时保存并将用户引导到另一个网页。
你可以这样做:
$(function() {
$(window).bind('beforeunload', function() {
setTimeout(function() {
setTimeout(function() {
$(document.body).css('background-color', 'red');
}, 1000);
},1);
return 'are you sure';
});
});
第一个 setTimeout
方法中的代码延迟1毫秒。这只是为了将函数添加到 UI队列
中。由于 setTimeout
异步运行,JavaScript解释器将通过直接调用 return
语句继续执行,从而触发浏览器的 模态对话框
。这将阻塞 UI队列
并且来自第一个 setTimeout
的代码不会被执行,直到模态框关闭。如果用户取消了操作,则会触发另一个 setTimeout,大约1秒后触发。如果用户确认并点击 ok,则用户将被重定向,第二个 setTimeout 将永远不会触发。
我知道这个问题现在已经老了,但是如果还有人遇到这个问题,我找到了一个似乎对我有效的解决方案。
基本上,在 beforeunload
事件之后会触发 unload
事件。我们可以利用这一点来取消在 beforeunload
事件中创建的超时,修改jAndy的答案:
$(function() {
var beforeUnloadTimeout = 0 ;
$(window).bind('beforeunload', function() {
console.log('beforeunload');
beforeUnloadTimeout = setTimeout(function() {
console.log('settimeout function');
$(document.body).css('background-color', 'red');
},500);
return 'are you sure';
});
$(window).bind('unload', function() {
console.log('unload');
if(typeof beforeUnloadTimeout !=='undefined' && beforeUnloadTimeout != 0)
clearTimeout(beforeUnloadTimeout);
});
});
EDIT: jsfiddle here
我之前觉得这是不可能的,但我试了一下这个想法,它可以运行(虽然有点像黑客技巧,在所有浏览器中可能不会起作用):
window.onbeforeunload = function () {
$('body').mousemove(checkunload);
return "Sure thing";
};
function checkunload() {
$('body').unbind("mousemove");
//ADD CODE TO RUN IF CANCEL WAS CLICKED
}
不可能的。也许有人会证明我错了...你想运行什么代码?当用户点击取消时,你想自动保存吗?这听起来很反直觉。如果你还没有自动保存,我认为在他们点击“取消”时自动保存是没有意义的。也许你可以在onbeforeunload处理程序中突出显示保存按钮,以便用户在导航离开之前看到他们需要做什么。
另一种变化 第一个 setTimeout 等待用户响应浏览器的“离开/取消”弹出窗口。第二个 setTimeout 等待 1 秒,然后仅在用户取消时调用 CancelSelected。否则页面将被卸载并且 setTimeout 将会失效。
window.onbeforeunload = function(e) {
e.returnValue = "message to user";
setTimeout(function () { setTimeout(CancelSelected, 1000); }, 100);
}
function CancelSelected() {
alert("User selected stay/cancel");
}
window.onbeforeunload = function() {
if (confirm('Do you want to navigate away from this page?')) {
alert('Saving work...(OK clicked)')
} else {
alert('Saving work...(canceled clicked)')
return false
}
}
通过这段代码,即使用户在IE8中单击“取消”,默认的导航对话框也会出现。
onbeforeunload
的函数中使用 confirm()
。 - Alexis Wilke