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