JavaScript onbeforeunload问题

5
我有一个关于以下代码的问题。当用户关闭他们的浏览器时,应该提示他们要么点击“确定”要么点击“取消”以离开页面。点击“确定”将触发 window.location 重定向到另一个页面进行用户跟踪(是的,为避免热烈争论,在类似问题中提到的情况下,还有一个辅助系统来确保准确跟踪,即在用户从任务管理器中终止浏览器时)。点击“取消”将留在当前页面,问题在于无论点击哪个按钮,都会被重定向离开页面。以下是相关代码:
window.onbeforeunload = confirmExit;
function confirmExit()
{
    var where_to = confirm("Click OK to exit, Click CANCEL to stay.");
    if (where_to == true)
    {
        window.location="logout.php";
    }
    if (where_to == false){
        alert("Returning...");
    }
}
3个回答

6
onbeforeunload 不是这样工作的。相关函数应该返回一个字符串,这个字符串会在默认的 onbeforeunload 对话框上显示。
function confirmExit() {
    return "This message will appear in the dialog.";
}

但是你没有返回任何内容并且使用了confirm()来自己处理。当函数没有返回任何内容时,onbeforeunload对话框将不会被显示。

为了调用真正的注销功能,您需要使用onunload事件。以下是重写后的代码:

window.onbeforeunload = confirmExit;
window.onunload = logout;

function confirmExit() {
    return "Click OK to exit, Click CANCEL to stay.";
}

function logout() {
    window.location = 'logout.php';
}

然而,您仍然依赖于Web浏览器是否会将请求发送到服务器。大多数(如果不是全部)的Web浏览器都不会这样做。我宁愿在该URL上发出一个ajax请求,但是您也依赖于Web浏览器是否能够完美地工作。


@IgorZinov'yev 如果 Ajax 调用是“fire and forget”,那么您可以轻松实现此操作。该调用将始终击中服务器。 - thomaux
@Anzeo,我已经记不清了——那是很久以前的事情了,但我认为,我们实验过的“发射并忘记”调用的成功率约为50%。 - Igor Zinov'yev
如果浏览器因操作系统关闭而关闭,这个会起作用吗? - techie_28
@techie_28:这取决于操作系统如何关闭。如果是因为电脑着火而关闭,那么嗯...我不确定 :) - BalusC
@BalusC,在正常关机的情况下(开始菜单-> 关闭按钮),beforeunload不会被触发,但如果使用叉号(X)按钮关闭,则会触发。 - techie_28
显示剩余3条评论

0

已在IE9和Chrome中测试


function addEvent(elm, evType, fn, useCapture) {
  if (elm.addEventListener) {
    elm.addEventListener(evType, fn, useCapture);
    return true;
  }
  else if (elm.attachEvent) {
    var r = elm.attachEvent('on' + evType, fn);
    return r;
  }
  else {
    elm['on' + evType] = fn;
  }
}

function exitAlert(e) {
  var msg = "This message will appear in the dialog.";
  if (!e) { e = window.event; }
  if (e) { e.returnValue = msg; }
  return msg;
}

addEvent(window, 'beforeunload', exitAlert, false);

0
也许你可以在 unbeforeunload() 中发起一个 XHR 请求,将所需数据发送到需要的位置,而不是劫持用户的浏览器呢?
如果没有更多的用例,很难确定,但这可能提供了一个不错的替代方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接