记一次ajax sync为false 同步神坑bug
记一次ajax sync为false 同步神坑bug记一次项目中想要实现一个转圈圈的等待遮罩层代码如下:$("#zhezhao").show();$.ajax({url:'',data:data,sync:false,done:{$("#zhezhao").hide();}})自信满满的运行然而点击查询后页面上什么也没有??以为报错了,然后各种调试输出display的值等怎么都出不来但是在浏览器F
记一次ajax sync为false 同步神坑bug
记一次项目中想要实现一个转圈圈的等待遮罩层
代码如下:
$("#zhezhao").show();
$.ajax({
url:'',
data:data,
sync:false,
done:{
$("#zhezhao").hide();
}
})
自信满满的运行
然而点击查询后页面上什么也没有??
以为报错了,然后各种调试输出display的值等
怎么都出不来
但是在浏览器F12调试模式下打断点,执行到show(),再下一步,哎他出来了!然后再点下一步 等到请求返回,执行done的回调时也能隐藏!!
这他喵的这是什么奇葩bug,以为是有其它代码将这个框隐藏掉了,然后直接注释掉原来HTML代码,新建一个div,起名新的ID,新的代码
然后我又来试了,然而 它喵的还是那样,F12调试模式能出来,正常执行不出来,崩溃了一下午没弄出来,暂时先弄别的去了
后来第二天,知道这块代码不行,就先注释吧,高潮来了,我一注释,发现等待框它出来了!!
然后就细细的看这段代码没什么特别的啊,把ajax注释掉试一下,发现正常显示和隐藏等待框,ajax有问题,逮到真凶了
就看这个ajax,仔细想来是不是同步的问题?
把sync:false注释掉,发现可以显示隐藏!!!
$("#zhezhao").show();
$.ajax({
url:'',
data:data,
//sync:false,
done:{
$("#zhezhao").hide();
}
})
好嘛,仔细想想可能是因为同步会阻塞线程让线程等待请求执行完成
原因:
那我的框为什么不显示呢,一开始调用了show(),也就是display设为block, display的值已经改了(输出验证过),
但是JavaScript执行引擎因为同步阻塞的原因他没有立即执行刷新dom操作,然后等到我的请求回来,我的框的display的值又给改回去了,所以相当于没有显示!!!
解决方案:
-
sync改为true
-
如果true不满足需求,你可以使用setTimeOut(),
将时间设置为几毫秒后执行,这个时间自己看着设
$("#zhezhao").show();
setTimeOut(function({
$.ajax({
url:'',
data:data,
sync:true,
done:{
$("#zhezhao").hide();
}
})
}),100)
- 使用alert
alert弹框会让JavaScript执行引擎去执行渲染dom操作
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)