2010-06-17 93 views
5

好的,我有一个问题,下面的代码。当用户关闭浏览器时会发生什么,它会提示他们单击确定或单击取消离开该页面。点击确定会触发一个window.location重定向到用户跟踪的另一个页面(是的,为了避免火焰战争,有一个辅助系统来保证准确的跟踪,在用户从任务管理器中剔除浏览器的情况下(如同样的问题所述))。取消将保留在页面上,问题是无论按下哪个按钮,都会重定向,就好像您想离开页面一样。相关代码如下。Javascript onbeforeunload问题

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

回答

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浏览器的最后遗嘱实际上是否击中了服务器。大部分(如果不是全部)网页浏览器都不会。我宁愿在该网址上发布一个垃圾请求,但是您依赖于webbrowser以及它是否能够完美地工作。

+0

Ajax请求不起作用。我的意思是,他们确实有效,但有时他们没有足够的时间在页面实际卸载之前完成。我们已经在我们的开发机器上尝试了这种技术,确保请求完成的唯一方法是使其同步。这对IE造成了很大的问题,因为它对每个浏览器实例的Ajax请求堆栈有限。 – 2010-06-17 13:02:45

+0

@Igor:公平点。我又做了一次本地测试,它可以在IE8和Chrome上运行,但不能在FF3和Safari4上运行。 – BalusC 2010-06-17 13:15:09

+0

@ IgorZinov'yev你可以实现这个没有问题,如果ajax调用是一个火灾,并忘记。电话会一直打到服务器。 – thomaux 2013-04-26 08:05:22

0

也许不是劫持用户的浏览器,你可以从你的unbeforeunload内触发一个XHR请求(),并得到你需要派人过来在你需要它的数据?

没有更多的用例很难说,但这可能提供一个很好的选择。

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);