使用我们的Web应用程序,当用户退出/关闭窗口时,必须使用附带'kill'操作的ajax调用服务器。但是,unload / pagehide事件没有被触发,或者ajax调用没有被执行,我无法确定为什么......
上下文:
相关代码......
来自.jsp的代码:
if (window.onpagehide || window.onpagehide === null) {
addEvent(window, 'pagehide', kill);
} else {
addEvent(window, 'unload', kill);
}
来自utils文件的代码:
function addEvent(obj, evt, fnc) {
if (obj.addEventListener) { //W3C
obj.addEventListener(evt, fnc, false);
return true;
} else if (obj.attachEvent) { // MSFT
return obj.attachEvent('on' + evt, fnc);
} else { // Legacy
evt = 'on'+evt;
if(typeof obj[evt] === 'function') {
// Object already has a function on traditional
// Let's wrap it with our own function inside another function
fnc = (function(f1, f2) {
return function() {
f1.apply(this, arguments);
f2.apply(this, arguments);
}
})(obj[evt], fnc);
}
obj[evt] = fnc;
return true;
}
return false;
};
function kill() {
ajax.post({
"refCallback": null,
"sURL": "--deleted--",
"async": false,
"timeout": 10000,
"params": {"op": "kill",
"guid": guid}});
};
任何见解或指示都会非常有用......
答案 0 :(得分:0)
我已经有一段时间了,因为我已经搞乱了onunload和onbeforeunload,但这是我记得的。尝试使用onunload时,您只需要很短的时间来执行任何操作,因为卸载页面的请求已在进行中。通常,您需要在onbeforeunload方法中执行代码。关于你的问题"除非有一些我不知道的魔法黑客抑制了默认弹出框和/或提供了查看用户响应的方法",有一种方法可以禁止默认弹出窗口盒子,但如果你的目的是用自定义的替换它,你运气不好。要使弹出框不显示,只需在onbeforeonload调用中不返回任何内容。
我记得我需要做一些与你所要求的非常相似的事情。我也无法使用JQuery,但我使用了一个调用jsp来删除凭据而不是使用AJAX。我实际上在Stack Overflow上问了一个问题并自己回答:How to logout during onbeforeunload/onunload using Javascript。尝试用你的AJAX调用替换我的jsp调用吗?
下面是与onunload相比unbeforeunload的一个很好的框架示例:
<script type="text/javascript"> //may not be neccesary for your code
window.onbeforeunload=before;
window.onunload=after;
function before(evt)
{
return "This will appear in the dialog box allong with some other default text";
//If the return statement was not here, other code could be executed silently (with no pop-up)
}
function after(evt)
{
//This event fires too fast for the application to execute before the browser unloads
}
</script>
上面的代码是我的答案的结果,我认为是Show popup window when the browser close和OnUnload Alert Error "NS_ERROR_NOT_AVAILABLE"的类似问题。
即使您正在使用onbeforeunload而不是onunload,如果我没记错,如果您不显示弹出窗口,它将无法执行冗长的代码。我知道这个答案并不是你所寻找的,但希望它能引导你走上正确的道路。
答案 1 :(得分:0)
实际上可以在pagehide或unload(已弃用但仍在工作)事件处理程序中执行AJAX请求,但是您需要使此请求同步,否则Safari将抛弃请求。
NamespaceManager