ajax请求处理中 带来的页面暂时卡住 问题

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

我的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请求已经完成了,可以进行后面的操作了。

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

时间: 2024-10-20 00:27:41

ajax请求处理中 带来的页面暂时卡住 问题的相关文章

java开发中的那些事(6)------一次ajax调用中的问题

这个周末就要到这次开发任务的结尾了,不过也到这时候了,才发现用起来比较顺手了,前几次项目中也有过啊,说起来实实在在用过的才3个项目,就分别用了不同的,着实有些痛苦啊,初学阶段的jsp+servlet还算是初学,可这后面的loushang和ssh2是让我欢喜让我忧啊,高兴的是框架的魅力让我情不自禁,可这样的框架我啥时候才能自己组的那么完善,甚至现在用起来还磕磕绊绊的.总结下这次的大收获的话,一方面是这个框架,另一方面的话就是ajax和json了,这个在我来说是比较陌生的地方,虽然现在我可以用,但原

PushState+Ajax实现简单的单页面应用SPA

http://www.helloweba.com/view-blog-386.html 单页面应用(Single Page Application)简称SPA,使用SPA构建的应用优点有用户体验好.速度快,内容的改变不需要重新加载整个页面,避免了不必要的跳转和重复渲染,从而相对减轻了服务器压力,SPA在WEB移动端应用非常广泛. 我们在上一篇文章Javascript实现前端简单路由中提到的前端路由,可以在不刷新整个页面的情况下,通过变换地址栏的hash来实现页面局部加载. 今天我要给大家介绍的是

Spring MVC Controller与jquery ajax请求处理json

在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: var cmd = {orders:[{"storeId":"0a1", "address":"西斗门路2号", "goods":[{"goodsId":"1"}, {"goodsId":"2"},

Ajax请求中的Redirect()

页面中有一个IsLogin()方法,用以判断该请求的触发者是否登录,如果登录了,则执行查询操作,如果没有登录,则Redirect()至登录界面 页面使用了较多的Ajax请求来获取数据,而在Ajax请求中,若运行至Context.Response.Redirect()则出错. 网上的一些资料给出的解决方案是在Ajax请求中增加一个状态码,然后人为的去获取该状态码,进行重定向. IsLogin()方法需要同时处理普通请求与Ajax请求,所以,在处理之前,应当知道当前请求是否为Ajax请求. 参考了网

在ASP.NET MVC4中实现同页面增删改查,无弹出框02,增删改查界面设计

在上一篇"在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建"中,已经搭建好了Repository层,本篇就剩下增删改查的界面了......今天的阳光真特么好,写完本篇,好出去在阳光下溜溜狗.散散步什么的,正所谓文武之道一张一弛,走神了,进入正题. 首先是一个View Model,在这里定义验证规则,提交和保存数据的时候还必须和领域模型映射. using System; using System.ComponentModel.DataAnnotat

ajax配置项中的type与method

1. jQuery中ajax配置项中的使用type与method的区别 本质上两个配置项是没有区别的,区别在于两者出现的时间不同,type对于目前jQuery的版本全部兼容,也就是说 1 $.ajax({ 2 type: 'POST', 3 url: '/login', 4 dataType: 'json',若出现跨域请求请使用'jsonp' 5 data: { 6 'userName': userName, 7 'password': password 8 }, 9 success: func

利用浏览器调试APP中的H5页面

安卓手机的情况下,可以用chrome浏览器来调试. 打开地址: chrome://inspect/#devices 手机用USB数据线连接电脑,并启动USB调试模式. 只要在APP中打开H5页面,界面就会显示该页面地址 点击inspect进入调试模式 之后就可以像调试浏览器页面一样调试了. 这个方法也可以用来查看APP中哪些页面调用的是H5的页面. 苹果手机可以用Safari自带的调试工具调试,在Safari浏览器工具栏-开发一栏下.

MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码

在MyEclispe中创建Jsp页面,Jsp页面的默认编码是“ISO-8859-1”,如下图所示: 在这种编码下编写中文是没有办法保存Jsp页面的,会出现如下的错误提示: 因此可以设置Jsp默认的编码为utf-8,具体步骤如下: 启动MyEclipse,点击菜单上的window--->preferences 在弹出的对话框中点击MyEclise--->Files and Editors--->JSP,如下图所示: 此时就可以看到JSP编码设置面板,如下图所示: 在Encoding那个下拉

jauery加入项目中,但是在页面中显示没有找到这个文件--springMVC框架

遇到一件很不爽的事情,自己明明已经把jquery的文件放在了项目中,但是在页面中总是看不到效果,开发者模式提示没有找到文件,当时都要郁闷疯了,后来无意间看到了Eclipse中报的错,怎么与Spring的配置文件相关,就去看看,看到<mvc:resource="/css/**" />这个配置,是css的配置,然后就照毛画虎的写了个js的标签,然后就可以了.我前台写的是basepath/script/jqurey.mini.js String path = request.ge