这里的主要挑战是在用户真正离开页面之前执行 JavaScript 函数,问题是处理onbeforeunload
事件,你无法对用户的选择做出反应,因为为了让这个事件在多浏览器场景中工作,你必须返回将用作消息的字符串,每个浏览器将创建一个自定义对话框,该对话框将显示给用户。我还没有找到更好的方法来做你需要的。基本上你不能覆盖浏览器的默认行为,你不能返回一个布尔值来指示页面是否应该被卸载。
欲了解更多信息:
来自 MSDN
将字符串分配给 window.event 的 returnValue 属性时,会出现一个对话框,让用户可以选择留在当前页面并保留分配给它的字符串。对话框中显示的默认语句“您确定要离开此页面吗?...按 OK 继续,或按 Cancel 留在当前页面。”无法删除或更改。
所以在这个例子中,我提出了一个解决方法,我不确定这是否是最好的方法,但我在几家在线银行和微软本身在他们的网站注销时看到了这样的行为。
例子:
ASPX
<script type="text/javascript" src="Scripts/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
function showConfirmOnLeave() {
return $("#showConfirm").prop("checked");
}
function onLeavePage() {
if (showConfirmOnLeave()) {
return "Don't goo";
}
else {
return undefined;
}
}
$(function () {
if ($("body").attr('onbeforeunload') == null) {
$("body").attr('onbeforeunload', 'return onLeavePage(event)');
}
$(window).unload(function (event) {
if (showConfirmOnLeave()) {
window.open(
'<%: this.ResolveClientUrl("~/CallOnLeave.aspx") %>',
"_blank",
"height=100, location=no, menubar=no, resizable=no, scrollbars=no, status=no, titlebar=no, toolbar=no, width=100, left=1, top=1",
false
);
}
});
});
</script>
<input type="checkbox" id="showConfirm" /> Show confirm on exit?
CallOnLeave.ASPX 代码后面
protected void Page_Load(object sender, EventArgs e)
{
// add here your custom code, ideally fire a new async thread to execute your commands on the background
}