layer.load()不弹出是什么原因?

提问 已结 14 273
clemert
clemert 5天前
悬赏:20飞吻
版本:layui 2.4.5 浏览器:谷歌
想要的效果是点击事件触发后弹出 layer.load(),请求post发送,拿到返回值后load关闭,然后弹出layer.open()。但现在的实际情况是 layer.load()只在layer.open()弹出前瞬间出现然后就结束,没有达到正在加载的效果,那位大神帮我看看呀,难道是我方法用错了么?急。。。谢谢啦!
    layui.use('layer', function () { //独立版的layer无需执行这一句
var $ = layui.$
, layer = layui.layer; //独立版的layer无需执行这一句

$(document).on("click", "#layerDemo .layui-btn", function () {
var code = $(this).attr("value"), text = $(this).text();

//loading层
var loadingIndex = layer.load(2, { //icon支持传入0-2
shade: [0.5, 'gray'], //0.5透明度的灰色背景
});

if (code === 'Afll' || code === 'Bfll' || code === 'Cfll') {

$.ajaxSettings.async = false;
$.post(url, {code: code}, function (result) {
console.log(result);
if (result.msg == "0") {
text = "指令错误!";
} else if (result.msg == "1") {
text = "网络连接失败!";
} else {
text = result.msg;
}
});

layer.close(loadingIndex);
}

layer.open({
type: 1
, offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
//,id: 'layerDemo' //防止重复弹出
, content: '<div style="padding: 20px 100px;">' + text + '</div>'
, btn: '我知道了'
, btnAlign: 'c' //按钮居中
, shade: 0 //不显示遮罩
, yes: function () {
layer.closeAll();
}
});
});

});
回帖
  • @clemert 你用了异步后,是可以的,可能是请求成功太快,所以就一闪了,text赋值不上是,代码先执行下面layer.open了,你可以把layer.open放在text赋值之后去调用啊,如果发不发请求都要layer.open,不方便放在text赋值之后的话,你可以把layer.open封装起来,传text的值。你那判断if那,回调里调用封装方法,加个else也调用一次方法
    0 回复
  • @clemert 同步请求会导致load不出来,这是layui的bug来的,好多人遇到过的,改成异步,是肯定出来的,一闪是请求成功快,就继续执行下去关闭了
    1 回复
  • 因为你的close用错地方了,你的本意是不是说等到这个请求回来之后再关闭这个遮罩层,然后再弹出一个新的layer显示返回的信息,那么jquery默认是异步的,所以那些关闭遮罩层或者后面需要在请求回来之后再处理的内容,必须放在post请求的回调里面去做,而不是跟在post后面,当然也可以将这个post换成一个非异步的请求也可以。
    0 回复
  • clemert
    5天前
    这个请求如果用异步就无法给text赋值做渲染,text会拿默认值,所有我用的同步。按你说的我把close放在function里面也解决不了问题[悲伤] 还有什么办法么,我前端技术太毛糙了。。。
    0 回复
  • $.ajaxSettings.async = false;的问题,为false是同步,浏览器会暂时锁死代码操作,等请求完成再继续执行,可以改为true,或者用定时器,500或者1秒后执行post请求,也可以达到效果,你也可以再等等,等其他大佬更好的回复
    0 回复
  • @clemert 那你为什么不把layer.open放在请求回调里面。。。
    0 回复
  • @clemert 哦,不好意思,没看仔细,你实际是已经设置成同步的了,那应该可以才对呀,另外一个就是这个请求是不是返回的时间很短,如果请求很短就返回了,那么一闪而过也是正常的,所以要看下这个请求的情况,还有你要的遮罩层具体要等到什么时候关闭,如果是请求回来就关闭,那么这么写是没问题的
    0 回复
  • clemert
    5天前
    @半桶水搬砖工 不行啊 我用了异步,text赋不上值,而且也没load页面,只是在open出现前一闪而过[悲伤] 我是写的一手好BUG么
    0 回复
  • clemert
    5天前
    @半桶水搬砖工 其实上面会有很多请求,我只是截取了一个,有好几个if else 判断,我这么写是为了同步请求之后再去执行,按理说效果都是一样啊,会是这个问题么
    0 回复
  • clemert
    5天前
    @岁月小偷 正常访问一闪而过那我也能理解,但是这个POST发送的是个指令,如果指令错误后台会循环接受消息,大概2~3秒左右,写这个的目的也就是为了在这个时间段提示用户,并且遮罩按钮,但事实是这个时间段也是没有loadd的
    0 回复