我给一个文本框绑定了 change 事件,自动将变更后的文本提交至服务器。
大多情况下没问题,但若修改该文本框的内容后,直接点击页面上的一个链接,页面会跳转,此时 change 中的 ajax 请求无法完成。
请教,如何解决,确保在窗体跳转前,jquery 发起的ajax请求执行完成?
不要使用同步模式(async:false),速度太慢。
尝试过在 unload 时等待,如下:
$(window).bind("unload", function () { while (isCompelete) { $.noop(); }});
但页面会永久卡住!
使用whille是不行,因为浏览器的线程模型有限制,和Silverlight类似的原因,可以使用定时器试试,参考如下的连接使用的是这个方法
http://stackoverflow.com/questions/3138498/window-unload-wait-for-ajax-call-to-finish-before-leaving-a-webpage
http://stackoverflow.com/questions/600494/jquery-automatically-abort-ajaxrequests-on-page-unload
楼主可以给页面所有链接绑定click事件,然后在事件中判断是否ajax请求已经完成.
$("a").click(function(e){
if(!ajaxComplete) //ajaxComplete表示是否提交完成
{
e.preventDefault() ; //如果没完成提交,取消A的默认事件(跳转)
}
});
//还可以加上计时器,自动循环判断,那么当提交完成后就会自动跳转
再ajax请求发出是,给页面铺一个遮罩,让用户不能点击html上的按钮和链接,监控ajax完成事件,成功后,取消遮罩。
window.beforeunload = function(){
//to do
//可以阻止窗体关闭
}
浏览器关闭前事件兼容性如下:
//搜狗浏览器不支持该事件。
//支持:firefox,chrome,ie6-10,360极速
window.onbeforeunload = function (e) {
var e = e || window.event;
var msg = "离开本页将会立即退出本系统!";
if (e) e.returnValue = msg;
return msg;
};