Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript onbeforeunload问题_Javascript_Dom Events_Onbeforeunload - Fatal编程技术网

Javascript onbeforeunload问题

Javascript onbeforeunload问题,javascript,dom-events,onbeforeunload,Javascript,Dom Events,Onbeforeunload,我对以下代码有问题。当用户关闭浏览器时,浏览器会提示用户单击“确定”或单击“取消”离开页面。单击“确定”将触发一个窗口。位置重定向到另一个页面进行用户跟踪(是的,为了避免火焰战,有一个辅助系统,以确保在用户从任务管理器关闭浏览器的情况下进行准确跟踪(如类似问题中所述))。“取消”将保留在页面上,问题是,无论你按哪个按钮,你都会被重定向,好像你想离开页面一样。相关代码如下 window.onbeforeunload = confirmExit; function confirmExit() {

我对以下代码有问题。当用户关闭浏览器时,浏览器会提示用户单击“确定”或单击“取消”离开页面。单击“确定”将触发一个
窗口。位置
重定向到另一个页面进行用户跟踪(是的,为了避免火焰战,有一个辅助系统,以确保在用户从任务管理器关闭浏览器的情况下进行准确跟踪(如类似问题中所述))。“取消”将保留在页面上,问题是,无论你按哪个按钮,你都会被重定向,好像你想离开页面一样。相关代码如下

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...");
    }
}

也许您可以从unbeforeunload()内部触发一个XHR请求,并将所需数据发送到所需位置,而不是劫持用户的浏览器

如果没有更多的用例,很难说清楚,但这可能提供了一个很好的替代方案。

没有这样做。相关函数应返回一个字符串,该字符串依次显示在默认的
onbeforeunload
对话框中

function confirmExit() {
    return "This message will appear in the dialog.";
}
但您不会返回任何东西,并用
确认()
将其拿在自己手中。如果函数不返回任何内容,则根本不会显示
onbeforeuload
对话框

要调用真正的注销,您需要使用事件。这里有一个重写:

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

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

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

但是,您取决于webbrowser最后一个是否会实际命中服务器。大多数(如果不是所有的话)网络浏览器都没有。我宁愿对该URL发出一个ajaxical请求,但你也依赖于webbrowser是否能完美工作。

在IE9和Chrome中测试



Ajax请求不起作用。我的意思是,他们确实工作,但有时他们没有足够的时间在页面实际卸载之前完成。我们已经在我们的开发机器上尝试了这种技术,确保请求完成的唯一方法是使其同步。这给IE带来了很大的问题,因为每个浏览器实例的ajax请求堆栈有限。@Igor:fair point。我又做了一次本地测试,它可以在IE8和Chrome上运行,但不能在FF3和Safari4上运行。@IgorZinov'yev如果ajax调用是fire and forget,您可以毫无问题地实现这一点。呼叫总是会打到服务器上。@Anzeo,我已经不记得了-那是很久以前的事了,但我认为即使是我们尝试的“先发后忘”呼叫也有50%的时间有效。@IgorZinov'yev在寻找类似解决方案时偶然发现了这个问题,幸运的是我们的客户决定接受我们的解决方案,当客户端未注销就离开页面时,将显示一条警告消息:)
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);