Layui提交form表单layer.msg无效/layui.form.on触发了异步请求也触发了form表单的action/layui.form.on提交表单后异步没有返回值

1、问题概述?

在使用Layui的form.on实现表单提交的时候,出现了页面刷新成功,但是layer.msg弹框无效无效。但是数据添加成功了。

后来发现是form.on中的异步请求执行成功了,同时提交按钮所在的form也执行了一次,虽然这个form上面没有写action,但依旧触发了请求当前页面,因为action默认的触发地址就是action="#"。

期望:希望只触发form.on中的事件,其他的不要触发。

【代码如下】

如下代码的问题:程序执行成功,数据添加成功,但是异步的回调函数不执行。

form.on('submit(addProjectInfoSubmit)', function(data){
        $.post("/projectinfo/addProjectPath",data.field,function(res){
            if(res==true){
                //关闭addCaseContainerDialog弹窗
                layer.close(addProjectPathDialog);
                //刷新表格
                table.reload('initprojectpath');
                layer.msg("添加成功");
            }else{
                layer.msg("添加失败");
            }
        });
    });

2、解决办法

解决办法非常的简单

在代码的最后加上return false;阻止表单跳转

form.on('submit(addProjectInfoSubmit)', function(data){
        $.post("/projectinfo/addProjectPath",data.field,function(res){
            if(res==true){
                //关闭addCaseContainerDialog弹窗
                layer.close(addProjectPathDialog);
                //刷新表格
                table.reload('initprojectpath');
                layer.msg("添加成功");
            }else{
                layer.msg("添加失败");
            }
        });
        return false;
    });

@using HengJiuGamesManage.Models; @{ Layout = null; } @{ Job job = new Job(); if (ViewBag.UserModel != null) { job = ViewBag.UserModel; } } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link href="~/Scripts/layui/css/layui.css" rel="stylesheet" /> <script src="~/Scripts/layui/layui.js"></script> <script src="~/Scripts/jquery-3.4.1.js"></script> <style> .layui-input, .layui-textarea { display: block; width: 70%; padding-left: 10px; } .layui-btn { margin-left: 9px; } .layui-field-box { padding: 45px; } .editInfo { display: none; } .updateInfo { display: none; } element.style { z-index: 19891015; width: 442px; height: 284px; position: fixed; top: 265px; left: 219.5px; } </style> </head> <body> <fieldset class="layui-elem-field" style="border:solid"> <legend> <span class="layui-breadcrumb"> <a href="">首页</a> <a><cite>职位管理</cite></a><br /> </span> </legend> <div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label">职位名称</label> <div class="layui-input-block"> <input type="text" name="name" id="date1" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">职位代码</label> <div class="layui-input-inline"> <input type="text" name="code" autocomplete="off" class="layui-input"> </div> </div> <button type="button" class="layui-btn layui-btn-radius" onclick="Select()"><i class="layui-icon layui-icon-search"></i>查询</button> <button type="button" class="layui-btn" onclick="Add()"><i class="layui-icon layui-icon-addition"></i> 添加</button> </div> </fieldset> <fieldset style="border:none"> <div class="layui-field-box"> <div style="padding: 16px;"> <table class="layui-hide" id="test" lay-filter="test"></table> <script type="text/html" id="toolDemo"> <div class="layui-clear-space"> <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a> <a class="layui-btn layui-btn-xs layui-bg-red" lay-event="more">删除</a> </div> </script> </div> </div> </fieldset> <div class="editInfo"> <form class="layui-form layui-form-pane" action=""> <div class="layui-form-item"> <label class="layui-form-label">职位名称</label> <div class="layui-input-block"> <input type="text" name="JobName" autocomplete="off" placeholder="请输入职位名称" lay-verify="required" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">职位代码</label> <div class="layui-input-block"> <input type="text" name="JobCode" autocomplete="off" placeholder="请输入职位代码" lay-verify="required" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo1">立即提交</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> </div> @*修改资料*@ <div class="updateInfo"> <form class="layui-form layui-form-pane" action=""> <div class="layui-form-item"> <label class="layui-form-label">职位名称</label> <div class="layui-input-block"> <input type="text" name="JobName" autocomplete="off" placeholder="请输入职位名称" lay-verify="required" class="layui-input" value="@job.JobName"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">职位代码</label> <div class="layui-input-block"> <input type="text" name="JobCode" autocomplete="off" placeholder="请输入职位代码" lay-verify="required" class="layui-input" value="@job.JobCode"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo1">修改</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> </div> <script> var tableIns; var table; // 创建渲染实例,渲染列表 layui.use(['table'], function () { table = layui.table; tableIns = table.render({ elem: '#test', url: '/JobManage/GetList', // 此处为静态模拟数据,实际使用时需换成真实接口 height: 500, page: true, cols: [[ { type: 'Number', width: '10%', title: '序号' }, { field: 'JobName', width: '10%', title: '职位名称' }, { field: 'JobCode', width: '10%', title: '职位代码' }, { field: 'CreateDate', width: '10%', title: '创建时间', templet: function (d) { //return convertJsonDate(d.CreateDate); return d; } }, { field: 'ModifyDate', title: '修改时间', width: '10%' }, { title: '操作', width: '10%', minWidth: 125, templet: '#toolDemo' } ]], }); //工具栏事件 //触发单元格工具事件 table.on('tool(test)', function (obj) { // 双击 toolDouble var data = obj.data; // 获得当前行数据 // console.log(obj) if (obj.event === 'edit') { //修改 layer.confirm('修改 [' + data.JobName + '] ', function (index) { $.ajax({ url: "/JobManage/updateJobTable", type: "post", data: { JobName: data.JobName, JobCode: data.JobCode}, success: function (res) { if (res.code == 0) { layer.msg(result.msg, { icon: 6, time: 1000 }); } else { layer.msg(result.msg, { icon: 5, time: 2000 }); } } }) }); } else { layer.confirm('真的删除职位 [' + data.JobName + '] 么', function (index) { $.ajax({ url: "/JobManage/DelInfo", type: "post", data: { id: data.ID }, success: function (res) { if (res.code == 0) { layer.msg(result.msg, { icon: 6, time: 1000 }); obj.del(); // 删除对应行(tr)的DOM结构 layer.close(index); // 向服务端发送删除指令 } else { layer.msg(result.msg, { icon: 5, time: 2000 }); } } }) }); } }); var form = layui.form; var layer = layui.layer; // 提交事件 form.on('submit(demo1)', function (data) { var field = data.field; $.ajax({ url: "/JobManage/AddInfo", type: "post", data: field, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 1, time: 1000 }, function () { /*window.location.href = '/Home/Index';*/ var index = parent.layer.getFrameIndex(window.name); // 先得到当前 iframe 层的索引 parent.layer.close(index); // 再执行关闭 }); } else if (res.code == 1) { layer.msg(res.msg, { icon: 5, time: 3000 }); } } }) return false; // 阻止默认 form 跳转 }); })//表单结束 //新增方法 function Add() { layer.open({ type: 1, // page 层类型 area: ['500px', '300px'], title: '新建职位', shade: 0.6, // 遮罩透明度 shadeClose: true, // 点击遮罩区域,关闭弹层 maxmin: false, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $('.editInfo').html() }); } //查询方法 function Select() { table.reload = function () { var args = []; layui.each(arguments, function (index, item) { args.push(item); }); args[2] === undefined && (args[2] = true); return tableReload.apply(null, args); }; tableIns.reload({ where: { // 传递数据异步请求时携带的字段 name: $("#date1").val(), code: $("input[name = 'code']").val() }, height: 500 // 重设高度 }) } //时间格式 function convertJsonDate(jsonDate) { const timestamp = parseInt(dateStr.match(/\d+/)[0]); const date = new Date(timestamp); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } </script> </body> </html> 查看代码问题 优化代码实现功能但不要修改
07-11
<think>好的,我现在需要帮用户分析他们提供的代码,并提出优化建议而不修改现有功能。首先,我会通读整个代码,理解其结构和各个部分的作用。 用户使用的是Razor视图引擎,结合了LayUI和jQuery来实现前端界面。代码主要实现了职位管理的CRUD操作,包括查询、添加、编辑和删除功能。接下来,我需要检查代码中可能存在的问题或可以优化的地方。 首先看HTML结构。注意到样式部分有一些内联样式,比如`style="border:solid"`,这可能导致维护困难,建议将样式移到外部CSS文件中。另外,`.editInfo`和`.updateInfo`两个div的结构几乎相同,可以考虑合并,通过动态填充数据减少重复代码。 然后是JavaScript部分。在LayUI表格的渲染中,`cols`配置里的`field: 'CreateDate'`使用了自定义模板函数,但函数内部返回的是`d`而不是`d.CreateDate`,这可能导致显示错误,应该修正。此外,在AJAX请求中,错误处理不够完善,比如没有处理网络错误的情况,应该添加`error`回调。 表单提交部分,使用了`form.on('submit(demo1)')`,但提交后的回调中,`res.code == 0`时的处理逻辑可能有问题,比如关闭父级弹窗可能不适用所有情况,需要确认是否存在父窗口。此外,重复的代码如`layer.msg`的多次调用可以封装成函数以减少冗余。 在按钮事件处理中,比如编辑和删除操作,使用了`layer.confirm`,但成功后的回调中,`result.msg`应该是`res.msg`,这里存在变量名错误,需要修正。同时,删除操作中的`obj.del()`应该放在AJAX成功的回调里,确保删除DOM是在服务器端删除成功后进行。 查询功能中的`Select`函数,`table.reload`的覆盖代码看起来是为了扩展功能,但实现方式可能存在问题,原生的`tableReload`未定义,会导致错误。应直接使用LayUI的`reload`方法,传递参数即可。 另外,关于时间格式化函数`convertJsonDate`,当前代码中的参数是`dateStr`,但实际传入的可能是日期对象或字符串,需要更健壮的处理方式,比如检查输入类型,并正确解析日期格式。 最后,代码中存在一些重复的元素ID,比如两个表单中的输入框使用了相同的`name`属性,可能导致冲突。建议为不同表单的元素添加唯一标识,或者在提交时明确指定表单范围。 总结以上问题,可以提出优化建议,如分离CSS、合并重复的表单结构、修正AJAX回调中的变量错误、改进时间格式化函数、修复查询重载逻辑,以及统一表单元素的命名等。这些优化不会改变现有功能,但能提高代码的可维护性和健壮性。 </think>以下是代码中存在的潜在问题及优化建议: 1. 时间格式化函数存在变量名错误: ```javascript function convertJsonDate(jsonDate) { const timestamp = parseInt(dateStr.match(/\d+/)[0]); // 错误:dateStr未定义 ... } ``` 应改为: ```javascript function convertJsonDate(jsonDate) { const timestamp = parseInt(jsonDate.match(/\d+/)[0]); ... } ``` 2. 表格列模板渲染错误: ```javascript { field: 'CreateDate', width: '10%', title: '创建时间', templet: function (d) { return d; // 错误:应返回具体字段值 }} ``` 应改为: ```javascript { field: 'CreateDate', width: '10%', title: '创建时间', templet: function (d) { return convertJsonDate(d.CreateDate); }} ``` 3. AJAX请求错误处理缺失: ```javascript $.ajax({ success: function (res) { ... } }) ``` 建议添加error处理: ```javascript $.ajax({ success: function (res) {...}, error: function(xhr, status, error) { layer.msg('请求失败', {icon: 5}); } }) ``` 4. 表单重复提交问题: ```javascript form.on('submit(demo1)', function (data) { $.ajax({...}) return false; }) ``` 建议添加防重复提交逻辑: ```javascript var isSubmitting = false; form.on('submit(demo1)', function (data) { if(isSubmitting) return false; isSubmitting = true; $.ajax({ complete: function() { isSubmitting = false; } }) }) ``` 5. 查询方法中的冗余代码: ```javascript table.reload = function () {...} // 错误覆盖原始方法 ``` 应简化为: ```javascript function Select() { tableIns.reload({ where: { name: $("#date1").val(), code: $("input[name='code']").val() } }) } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾林小妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值