首页 新闻 赞助 找找看

如何确保在窗体跳转前,jquery 发起的ajax请求执行完成?

0
悬赏园豆:50 [待解决问题] 解决于 2011-04-28 15:40

我给一个文本框绑定了 change 事件,自动将变更后的文本提交至服务器。

大多情况下没问题,但若修改该文本框的内容后,直接点击页面上的一个链接,页面会跳转,此时 change 中的 ajax 请求无法完成。

请教,如何解决,确保在窗体跳转前,jquery 发起的ajax请求执行完成?

不要使用同步模式(async:false),速度太慢。

 

尝试过在 unload 时等待,如下:

$(window).bind("unload", function () { while (isCompelete) { $.noop();    }});

但页面会永久卡住!

love-me的主页 love-me | 初学一级 | 园豆:130
提问于:2011-04-13 15:40
< >
分享
所有回答(4)
0

使用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

2012 | 园豆:21228 (高人七级) | 2011-04-13 17:48
使用定时器我试过了,不行的:
$(window).unload(function () {
setTimeout(function () { alert(886) }, 1);
});
支持(0) 反对(0) love-me | 园豆:130 (初学一级) | 2011-04-13 20:11
0

楼主可以给页面所有链接绑定click事件,然后在事件中判断是否ajax请求已经完成.

$("a").click(function(e){
if(!ajaxComplete) //ajaxComplete表示是否提交完成
{
e.preventDefault() ; //如果没完成提交,取消A的默认事件(跳转)
}
});

//还可以加上计时器,自动循环判断,那么当提交完成后就会自动跳转
coder_wang | 园豆:193 (初学一级) | 2011-11-18 17:21
0

再ajax请求发出是,给页面铺一个遮罩,让用户不能点击html上的按钮和链接,监控ajax完成事件,成功后,取消遮罩。

 

                        
小侠女 | 园豆:204 (菜鸟二级) | 2013-08-22 10:00
0

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;

};

往事随风2010 | 园豆:202 (菜鸟二级) | 2013-11-13 12:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册