加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ajax请求处理中gif页面卡住不动

发布时间:2020-12-16 03:28:29 所属栏目:百科 来源:网络整理
导读:前阵子做项目,遇到一个很奇怪的问题。 我的html页面执行一个删除item的操作,需要跟后台用ajax交互。由于后台处理的过程有点长,为了给用户更好的体验,我试图在ajax请求发出前,让页面显示一个loading的gif图,当收到后台ajax处理结束的信号后,再将这个lo

前阵子做项目,遇到一个很奇怪的问题。

我的html页面执行一个删除item的操作,需要跟后台用ajax交互。由于后台处理的过程有点长,为了给用户更好的体验,我试图在ajax请求发出前,让页面显示一个loading的gif图,当收到后台ajax处理结束的信号后,再将这个loading图隐藏。

然而,奇怪的事情发生了。 页面确实出现了那个gif图,但是却完全不动,页面出现假死的状态。

查阅了很多资料,请教了很多高手,都没有找到合适的解决方案。最后同事发来一个链接,让我照着试一试,没想到解决了问题。

http://www.alixixi.com/web/a/2014060493440.shtml

原因在ajax请求的async:false这里。

原来浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程--包括gif图的动效)都会停止下来。即使我的DOM操作语句(显示loading gif图)是在发起ajax请求的前一句,这个同步请求也会“迅速”将UI线程阻塞,不给它执行的时间。这就是代码失效的原因。

解决方法是用Deferred!同时不要将async改成false即保证ajax请求是异步的。代码大致思路如下:

function handleData(){
        var defer = $.Deferred();
        $.ajax({
            url : "manage",//async : false,
            success: function(data){
                defer.resolve(data)
            }
        });
        return defer.promise();
}    

$(".delBtn").click(function(){
        $(".loadingLayer").show();
        $.when(handleData()).done(function(data){
            $(".loadingLayer").hide();
            alert(data);
        });
});

我的理解是 通过defer.resolve()主动告诉浏览器,这个ajax请求已经完成了,可以进行后面的操作了。

不过好像还是有点说不通,有没有理解得比较透彻的大侠给点拨一下。谢谢噜。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读