天天看点

基于layui-2.4.5实现的页面层方式弹窗显示表单并通过ajax提交表单根据返回值处理窗口问题

一个比较挫的写法,是用闭包写的,请参考下文:

https://blog.csdn.net/zhi_ai_yaya/article/details/86225400

本文是比较正确的一种使用方式:

1.主页index.html ——请自行引用jquery和layui。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>layui</title>
	<meta name="renderer" content="webkit">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<link rel="stylesheet" href="/layui-v2.4.5/css/layui.css" media="all">
	<!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
	<style type="text/css">
		/* 自定义样式 */
		/* .layui-button-block {
			text-align: center;
		}
		.layui-form-button {
			position: absolute;
			bottom: 0px;
			width: 100%;
			margin: 0px auto;
			padding-top: 10px;
			padding-bottom: 10px;
			background-color: #e6e6e6;
		}
		body .layui-layer-btn {
			text-align: center;
		} */
	</style>
</head>
<body>
	<div class="layui-low" style="margin:20px;">
		<button id="btn-test" class="layui-btn layui-btn-primary">测试按钮</button>
	</div>
	<script src="/layui-v2.4.5/layui.all.js" charset="utf-8"></script>
	<!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->
	<script src="/jquery/jquery.min.js" charset="utf-8"></script>
	<script>
		layui.use('table', function () {
			$("#btn-test").on("click", function () {
				$.get('/test.html', 'id=1', function (str) {
					layer.open({
						type: 1,
						title: '页面窗口',
						id: 'test',
						shadeClose: false,
						shade: [0.3, '#393D49'],
						maxmin: true, //开启最大化最小化按钮
						area: ['893px', '600px'],
						content: str, //注意,如果str是object,那么需要字符拼接。
						btnAlign: 'c',
						end: function () {
							alert('count=' + count + ' result=' + result);
							//return false 开启该代码可禁止点击该按钮关闭
						}
					});
				});
			});
		});
	</script>

</body>

</html>
           

2.弹窗页面test.html

<form class="layui-form" action="" lay-filter="example">
    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">验证手机</label>
            <div class="layui-input-inline">
                <input type="tel" name="phone" lay-verify="required|phone" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" lay-submit="" lay-filter="demo1">立即提交</button>
                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
            </div>
        </div>
</form>

<script>
     //全局变量,用于返回给调用该页面的窗口
    var count = 0;
    var result = '状态:未提交';
    layui.use(['form'], function () {
        var form = layui.form, layer = layui.layer;
        form.render();

        //监听提交
        form.on('submit(demo1)', function (data) {
            // layer.alert(JSON.stringify(data.field), {
            //     title: '最终的提交信息'
            // })
            // return false;

            count++;
            $.ajax({
                url: '/demo.json?phone=' + data.field.phone,
                type: 'get',
                async: false,//必须是同步提交的
                success: function (ret) {
                    //console.log(JSON.stringify(ret));
                    if (count > 1) { //模拟成功的返回值,具体请使用ret参数
                        layer.alert(JSON.stringify(ret), {
                            title: '大于3次表示提交成功,要关闭窗口'
                            // ,yes: function(index, layero){
                            //     layer.close(index); //此时你只需要把获得的index,轻轻地赋予layer.close即可
                            // }
                        });
                        result = '提交成功';
                        layer.closeAll('page'); //关闭所有页面层:此处会有一个坑,如果是多个页面层弹窗,是否全部被干掉了??
                    } else {
                        layer.alert(JSON.stringify(ret), {
                            title: '小于3次表示提交失败,不能关闭窗口'
                        });
                        result = '提交失败';
                    }
                },
                error: function () {
                    result = '提交失败';;
                }
            });
            return false;
        });

        //表单初始赋值
        form.val('example', {
            "phone": "15720337502"
        })
    });
</script>
           

3.数据接口 demo.json

{
  "code": 0
  ,"msg": ""
  ,"count": 3000000
  ,"data": [{
    "id": "10001"
    ,"username": "杜甫"
    ,"email": "[email protected]"
    ,"sex": "男"
  }]
}  
           

总结:

弹窗通过ajax提交成功之后,会弹出一个 提示窗口(提交成功),但是接着要执行下面的这句代码才能关闭 测试窗口而保留提示窗口。这个问题比较恶心恶心恶心恶心恶心。。。。

如果是弹窗再弹窗再弹窗,closeAll岂不是得gg?

layer.closeAll('page'); //关闭所有页面层:此处会有一个坑,如果是多个页面层弹窗,是否全部被干掉了??
           

如果有更好的方法麻烦在评论中回复下,非常感谢!!!

总结下写法:

//监听提交
        form.on('submit(demo1)', function (data) {
            // layer.alert(JSON.stringify(data.field), {
            //     title: '最终的提交信息'
            // })
            // return false;
            count++;
            $.ajax({
                url: '/demo.json?phone=' + data.field.phone,
                type: 'get',
                async: false,//必须是同步提交的
                success: function (ret) {
                    //console.log(JSON.stringify(ret));
                    if (count > 1) { //模拟成功的返回值,具体请使用ret参数
                        result = '提交成功';

                        ///写法1-start-直接关闭,OK
                        //layer.close(index);
                        ///写法1-end
                        
                        //写法2-start-关闭所有层,OK
                        // layer.alert(JSON.stringify(ret), {
                        //      title: '大于3次表示提交成功,关闭窗口'
                        // });
                        //layer.closeAll('page'); //关闭所有页面层:此处会有一个坑,如果是多个页面层弹窗,是否全部被干掉了??
                        //写法2-end

                        //写法3-start-直接关闭最新弹出的层。要减1 
                        //layer.close(layer.index -1);  //如果你想关闭最新弹出的层,直接获取layer.index即可。//它获取的始终是最新弹出的某个层,值是由layer内部动态递增计算的
                        //写法3-end


                        //写法4-start-直接关闭后,弹出3秒自动提示框
                        // layer.close(layer.index - 1); 
                        // layer.msg('同上', {
                        //     icon: 1,
                        //     time: 3000 //3秒关闭(如果不配置,默认是3秒)
                        //     }, function(){
                        //     //do something
                        //     }
                        // );  
                        //写法4-end

                        //写法5-start,OK
                        // layer.close(layer.index - 1); 
                        // layer.alert(JSON.stringify(ret), {
                        //     title: '大于3次表示提交成功,关闭窗口'
                        // });
                        //写法5-end

                        //写法6-start,OK。对比写法4和写法5,说明这个layer.index索引计算是有并发问题的!!
                        layer.alert(JSON.stringify(ret), {
                            title: '大于3次表示提交成功,关闭窗口'
                        });
                        layer.close(layer.index - 2);  //必须是减2
                        //写法6-end
                    } else {
                        layer.alert(JSON.stringify(ret), {
                            title: '小于3次表示提交失败,不能关闭窗口'
                        });
                        result = '提交失败';

                    }
                },
                error: function () {
                    result = '提交失败';;
                }
            });
            return false;
        });
           

继续阅读