Layui——实现弹出层中的form表单验证(lay-verify不生效)

news2024/9/22 23:33:47

目录

分析原因

完整版修改后的代码 

 完整版原代码


参考文章:

  • 1、http://t.csdnimg.cn/64KdG
  • 2、http://t.csdnimg.cn/CUTPa
  • 3、http://t.csdnimg.cn/iHAIO

分析原因

  • 添加部门时,部门名称不能为空,添加不成功,也没有任何提示,不方便用户填写和检查表单。
  • 原本是使用了lay-verify做表单验证的,但是不生效,具体原因:
    • 弹出层的表单验证和普通的表单验证不同,弹出层的表单验证使用的是弹出层的提交按钮,而该按钮并没有和lay-verify绑定,也就无法触发表单验证。
    • 实现思路就是在弹出层form表单页面中设置一个隐藏的提交按钮,然后在layer弹出层点击“确定”按钮时,找到form表单中隐藏的提交按钮,触发点击事件,即可实现验证功能。

    • lay-verify 要和lay-filter和lay-submit 一起使用,才会被触发。lay-filter 用于标识表单,以便 layui 可以应用对应的验证规则,而 lay-submit 用于触发表单的提交事件,包括验证。
    • 如果需要自定义更细致的验证规则,可以使用form.verify({})……

主要添加了三个部分:

        <div class="layui-form-item">
            <label class="layui-form-label">部门名称</label>
            <div class="layui-input-block">
                <input type="text" name="deptname" required  lay-verify="required" autocomplete="off" class="layui-input">
                <input type="text" name="id" hidden>
            </div>
        </div>
        <div>
            <%--该按钮绑定了弹出层里的"保存"按钮,主要是为了用该按钮触发弹出层的表单验证,该按钮已经隐藏--%>
            <button type="button" data-method="addDept" lay-filter="formVerify" lay-submit style="display: none">提交</button>
        </div>
        function layerForm(){
            //多窗口模式,层叠置顶
            layer.open({
                type: 1, // 弹出层类型为内容层(1: HTML内容)
                title: '添加部门', // 弹出层标题
                content: $('#addDept'), // 弹出层内容,从 id 为 `addDept` 的元素中获取
                btn: ['保存', '取消'], // 弹出层的按钮,显示“保存”和“取消”按钮
                area: ['600px', '300px'], // 弹出层的宽度和高度
                closeBtn: 0, // 关闭按钮设置为 0,表示隐藏关闭按钮
                success: function (layero, index) { // 弹出层打开后的回调函数
                    layero.addClass('layui-form'); // 为弹出层添加 `layui-form` 类
                    layero.find('.layui-layer-btn0').attr({ // 修改“保存”按钮的属性
                        'lay-filter': 'formVerify', // 添加 lay-filter 属性,设置为 'formVerify'
                        'lay-submit': '' // 添加 lay-submit 属性,启用 layui 表单提交功能
                    });
                    form.render(); // 渲染表单
                },
                yes: function () { // 点击“保存”按钮后的回调函数
                    form.on('submit(formVerify)', function (data) { // 绑定表单提交事件

完整版修改后的代码 

dept.jsp

<!DOCTYPE html>
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8" %>
<%@ include file="../common/taglibs.jsp" %>

<html lang="zh">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <%@ include file="../common/meta.jsp" %>
</head>
<body>
    <div class="layui-btn-group layui-row" id="btn_group">
        <button type="button" class="layui-btn" data-method="addDept">添加</button>
    </div>
    <table class="layui-hide" id="deptTable"></table>
</body>
<div hidden id="addDept">
    <form class="layui-form" action="" lay-filter="addDeptForm" id="addDeptForm">
        <div class="layui-form-item">
            <label class="layui-form-label">部门名称</label>
            <div class="layui-input-block">
                <input type="text" name="deptname" required  lay-verify="required" autocomplete="off" class="layui-input">
                <input type="text" name="id" hidden>
            </div>
        </div>
        <div>
            <%--该按钮绑定了弹出层里的"保存"按钮,主要是为了用该按钮触发弹出层的表单验证,该按钮已经隐藏--%>
            <button type="button" data-method="addDept" lay-filter="formVerify" lay-submit style="display: none">提交</button>
        </div>
    </form>
</div>
<script>
    layui.use(['table','layer','form','laydate'], function() {
        var table = layui.table;
        var layer = layui.layer;
        var $ = layui.$;
        var form = layui.form;
        var dept={};

        var deptTable =  table.render({
            elem: '#deptTable'
            ,url:'/dept/list'
            ,method:"post"
            ,data: JSON.stringify(dept)//传递json类型的参数
            ,contentType: 'application/json'
            ,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
            ,cols: [[
                {field:'deptname', width:200, title: '部门名称', sort: true}
                ,{width:137, title: '操作',templet:function(d){
                        return '<button type="button" class="layui-btn layui-btn-sm singleBtn" data-method="editDept" data-id="'
                            +d.id+'"><i class="layui-icon layui-icon-edit"/></button>'
                            +'<button type="button" class="layui-btn layui-btn-sm singleBtn" data-method="deleteDept" data-id="'
                            +d.id+'"><i class="layui-icon layui-icon-delete"/></button>'
                    }}
            ]],
            parseData: function(res){ //res 即为原始返回的数据
                return res
            },
            done: function(res, curr, count){
                //如果是异步请求数据方式,res即为你接口返回的信息。
                //如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度
                console.log(res);
                //得到当前页码
                console.log(curr);
                //得到数据总量
                console.log(count);
                $('.singleBtn').on('click', function(){
                    var othis = $(this), method = othis.data('method');
                    active[method] ? active[method].call(this, othis) : '';
                });
            },
            page: true
        });
        function layerForm(){
            //多窗口模式,层叠置顶
            layer.open({
                type: 1, // 弹出层类型为内容层(1: HTML内容)
                title: '添加部门', // 弹出层标题
                content: $('#addDept'), // 弹出层内容,从 id 为 `addDept` 的元素中获取
                btn: ['保存', '取消'], // 弹出层的按钮,显示“保存”和“取消”按钮
                area: ['600px', '300px'], // 弹出层的宽度和高度
                closeBtn: 0, // 关闭按钮设置为 0,表示隐藏关闭按钮
                success: function (layero, index) { // 弹出层打开后的回调函数
                    layero.addClass('layui-form'); // 为弹出层添加 `layui-form` 类
                    layero.find('.layui-layer-btn0').attr({ // 修改“保存”按钮的属性
                        'lay-filter': 'formVerify', // 添加 lay-filter 属性,设置为 'formVerify'
                        'lay-submit': '' // 添加 lay-submit 属性,启用 layui 表单提交功能
                    });
                    form.render(); // 渲染表单
                },
                yes: function () { // 点击“保存”按钮后的回调函数
                    form.on('submit(formVerify)', function (data) { // 绑定表单提交事件
                        var formData = form.val('addDeptForm'); // 获取表单数据
                        console.log(formData); // 输出表单数据到控制台
                        var layerui = layer; // 引用 layer 对象
                        var currentPage = deptTable.config.page.curr; // 获取当前页码
                        $.ajax({
                            url: "/dept/add", // 请求 URL
                            type: "POST", // 请求类型
                            data: JSON.stringify(formData), // 将表单数据转为 JSON 格式
                            contentType: "application/json; charset=utf-8", // 请求内容类型
                            dataType: "json", // 期望返回的数据类型
                            success: function (result) { // 请求成功后的回调函数
                                if(result.code == COMMON_SUCCESS_CODE){ // 判断请求结果
                                    layerui.msg('操作成功'); // 显示成功消息
                                    deptTable.reload({page: {curr: currentPage}}); // 重新加载数据表格
                                } else {
                                    layerui.alert('操作失败', {icon: 2}); // 显示失败消息
                                }
                                layerui.closeAll(); // 关闭所有弹出层
                                $("#addDeptForm")[0].reset(); // 重置表单
                                form.render(); // 重新渲染表单
                            }
                        });
                    });
                },
                btn2: function () { // 点击“取消”按钮后的回调函数
                    layer.closeAll(); // 关闭所有弹出层
                    $("#addDeptForm")[0].reset(); // 重置表单
                    form.render(); // 重新渲染表单
                }
            });
        }
        //触发事件
        var active = {
            addDept: function () {
                var that = this;
                layerForm();
            },
            editDept:function(){
                var othis = $(this), dataId = othis.data('id');
                var currentPage = deptTable.config.page.curr;//获取当前页码
                console.log(dataId);
                $.ajax({
                    url: "/dept/search/"+dataId,
                    type: "GET",
                    contentType: "application/json; charset=utf-8",
                    success: function (result) {
                        if(result.code == COMMON_SUCCESS_CODE){
                            var dept = result.data;
                            //给表单赋值
                            form.val("addDeptForm", { //addEmployeeForm 即 class="layui-form" 所在元素属性 lay-filter="" 对应的值
                                "deptname": dept.deptname // "name": "value"
                                ,"id": dept.id
                            });
                            layerForm();
                        }else{
                            layer.alert('数据获取失败', {icon: 2});
                        }
                    }
                })
            },
            deleteDept: function () {
                var othis = $(this), dataId = othis.data('id');
                var currentPage = deptTable.config.page.curr;//获取当前页码
                layer.confirm('确定删除?', {
                    btn: ['确定', '取消'],
                    yes: function (index, layero) {
                        var layDelete = layer;
                        $.ajax({
                            url: "dept/delete/"+dataId,
                            type: "DELETE",
                            contentType: "application/json; charset=utf-8",
                            success: function (result) {
                                if(result.code == COMMON_SUCCESS_CODE){
                                    deptTable.reload({page: {curr: currentPage}});
                                }else{
                                    layer.alert('删除失败',{icon: 2});
                                }
                                layDelete.closeAll();
                            }
                        })
                    },
                    btn2: function (index, layero) {
                        layer.closeAll();
                    }
                });
            }
        }
        $('#btn_group .layui-btn').on('click', function(){
            var othis = $(this), method = othis.data('method');
            active[method] ? active[method].call(this, othis) : '';
        });
    })
</script>
</html>

 完整版原代码

<!DOCTYPE html>
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8" %>
<%@ include file="../common/taglibs.jsp" %>

<html lang="zh">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <%@ include file="../common/meta.jsp" %>
</head>
<body>
    <div class="layui-btn-group layui-row" id="btn_group">
        <button type="button" class="layui-btn" data-method="addDept">添加</button>
    </div>
    <table class="layui-hide" id="deptTable"></table>
</body>
<div hidden id="addDept">
    <form class="layui-form" action="" lay-filter="addDeptForm" id="addDeptForm">
        <div class="layui-form-item">
            <label class="layui-form-label">部门名称</label>
            <div class="layui-input-block">
                <input type="text" name="deptname" autocomplete="off" class="layui-input">
                <input type="text" name="id" hidden>
            </div>
        </div>
    </form>
</div>
<script>
    layui.use(['table','layer','form','laydate'], function() {
        var table = layui.table;
        var layer = layui.layer;
        var $ = layui.$;
        var form = layui.form;
        var dept={};

        var deptTable =  table.render({
            elem: '#deptTable'
            ,url:'/dept/list'
            ,method:"post"
            ,data: JSON.stringify(dept)//传递json类型的参数
            ,contentType: 'application/json'
            ,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
            ,cols: [[
                {field:'deptname', width:200, title: '部门名称', sort: true}
                ,{width:137, title: '操作',templet:function(d){
                        return '<button type="button" class="layui-btn layui-btn-sm singleBtn" data-method="editDept" data-id="'
                            +d.id+'"><i class="layui-icon layui-icon-edit"/></button>'
                            +'<button type="button" class="layui-btn layui-btn-sm singleBtn" data-method="deleteDept" data-id="'
                            +d.id+'"><i class="layui-icon layui-icon-delete"/></button>'
                    }}
            ]],
            parseData: function(res){ //res 即为原始返回的数据
                return res
            },
            done: function(res, curr, count){
                //如果是异步请求数据方式,res即为你接口返回的信息。
                //如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度
                console.log(res);
                //得到当前页码
                console.log(curr);
                //得到数据总量
                console.log(count);
                $('.singleBtn').on('click', function(){
                    var othis = $(this), method = othis.data('method');
                    active[method] ? active[method].call(this, othis) : '';
                });
            },
            page: true
        });
        function layerForm(){
            //多窗口模式,层叠置顶
            layer.open({
                type: 1
                , title: '添加部门'
                , content: $('#addDept')
                , btn: ['保存', '取消'] //只是为了演示
                , area: ['600px', '300px'] //宽高
                ,closeBtn: 0
                , yes: function () {
                    var formData = form.val('addDeptForm');//form lay-filter属性
                    console.log(formData);
                    var layerui = layer;
                    var currentPage = deptTable.config.page.curr;//获取当前页码
                    $.ajax({
                        url: "/dept/add",
                        type: "POST",
                        data: JSON.stringify(formData),//传递json类型的参数
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function (result) {
                            if(result.code == COMMON_SUCCESS_CODE){
                                layerui.msg('操作成功');
                                deptTable.reload({page: {curr: currentPage}})
                            }else{
                                layerui.alert('操作失败', {icon: 2});
                            }
                            layerui.closeAll();
                            $("#addDeptForm")[0].reset();
                            form.render();
                        }
                    })

                }
                , btn2: function () {
                    layer.closeAll();
                    console.log($("#addDeptForm")[0])
                    $("#addDeptForm")[0].reset();
                    form.render();
                }
            });
        }
        //触发事件
        var active = {
            addDept: function () {
                var that = this;
                layerForm();
            },
            editDept:function(){
                var othis = $(this), dataId = othis.data('id');
                var currentPage = deptTable.config.page.curr;//获取当前页码
                console.log(dataId);
                $.ajax({
                    url: "/dept/search/"+dataId,
                    type: "GET",
                    contentType: "application/json; charset=utf-8",
                    success: function (result) {
                        if(result.code == COMMON_SUCCESS_CODE){
                            var dept = result.data;
                            //给表单赋值
                            form.val("addDeptForm", { //addEmployeeForm 即 class="layui-form" 所在元素属性 lay-filter="" 对应的值
                                "deptname": dept.deptname // "name": "value"
                                ,"id": dept.id
                            });
                            layerForm();
                        }else{
                            layer.alert('数据获取失败', {icon: 2});
                        }
                    }
                })
            },
            deleteDept: function () {
                var othis = $(this), dataId = othis.data('id');
                var currentPage = deptTable.config.page.curr;//获取当前页码
                layer.confirm('确定删除?', {
                    btn: ['确定', '取消'],
                    yes: function (index, layero) {
                        var layDelete = layer;
                        $.ajax({
                            url: "dept/delete/"+dataId,
                            type: "DELETE",
                            contentType: "application/json; charset=utf-8",
                            success: function (result) {
                                if(result.code == COMMON_SUCCESS_CODE){
                                    deptTable.reload({page: {curr: currentPage}});
                                }else{
                                    layer.alert('删除失败',{icon: 2});
                                }
                                layDelete.closeAll();
                            }
                        })
                    },
                    btn2: function (index, layero) {
                        layer.closeAll();
                    }
                });
            }
        }
        $('#btn_group .layui-btn').on('click', function(){
            var othis = $(this), method = othis.data('method');
            active[method] ? active[method].call(this, othis) : '';
        });
    })
</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ITextRenderer导出PDF后无法打开问题,提示‘无法打开此文件‘

依赖如下 <!-- https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf --> <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.22</version> &l…

96、QT 实现LED圆形指示灯控件

代码实现更改控件样式表的颜色和形状等 //QLabel控件变成圆形LED指示灯样式表 const QString QLabel_LED_Circle_SheetStyle_Red "min-width: 20px; min-height: 20px;max-width:20px; max-height: 20px;border-radius: 10px; background:red";//红色 const QStrin…

[C++][opencv]基于opencv实现photoshop算法色相和饱和度调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 HSL.hpp #ifndef OPENCV2_PS_HSL_HPP_ #define OPENCV2_PS_HSL_HPP_#include "opencv2/core.hpp" using namespace cv;namespace cv {enum HSL_COLOR {HSL_ALL,HSL_RED,HSL_YELLOW,HSL_GREEN,HS…

告别繁琐!2024年PDF转CAD工具大推荐

如果你是装修设计师收到的却是被阉割了的PDF&#xff0c;不要破防。现在有不少工具可以直接实现PDF转CAD再也不需要你费心重画哦。今天&#xff0c;我们就来聊聊2024年大家都在用的几款PDF转CAD工具&#xff0c;看看它们是如何改变我们的设计工作的。 1.福昕PDF转换大师 链接…

springboot整合mybatis以及mybatis-plus 开发

一、springboot整合mybatis 1.注解版 1.1 导入坐标 <dependencies><!--mybatis坐标--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</…

39、Python之面向对象:对象属性解析:MRO不够用,补充3个方法

引言 在前面的文章中&#xff0c;我们谈及Python在继承关系&#xff0c;尤其是多继承中&#xff0c;一个对象的属性的查找解析顺序。由于当时的语境聚焦于继承关系&#xff0c;所以只是简要提及了属性解析顺序同方法的解析顺序&#xff0c;而方法的解析顺序&#xff0c;在Pyth…

16.1 深度学习基础

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

Java 数据结构入门示例

通过我们适合初学者的数据结构指南&#xff08;包含说明性示例&#xff09;深入了解 Java 世界。 理解结构对于软件开发至关重要。Java是学习数据结构的理想选择&#xff0c;因为它的语法简单&#xff0c;应用范围广泛&#xff0c;从移动应用开发到大数据分析。 让我们仔细看看…

Lingo保姆级安装教程及新手快速入门指南

一、软件介绍 Lingo 18.0是一款功能强大的数学建模软件&#xff0c;功能齐全&#xff0c;建模速度快&#xff0c;是求解优化模型的最佳选择&#xff0c;深受广大用户的喜爱。它有一套完整继承的软件包&#xff0c;可以用于构建和编辑问题的完全功能环境&#xff0c;具有建模速…

【前端VUE】npm i 出现版本错误等报错 简单直接解决命令

前端vue npm i 安装时出现 报错原因 在新版本的npm中&#xff0c;默认情况下&#xff0c;npm install遇到冲突的peerDependencies时将失败。 解决办法 使用--force或--legacy-peer-deps可解决这种情况。 --force 会无视冲突&#xff0c;并强制获取远端npm库资源&#xff0…

【C++ 面试 - 基础题】每日 3 题(十五)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

React H5设置企业级v6版本路由的配置

路由配置是项目开发的必要一环&#xff0c;尤其是目前流行SPA&#xff0c;下面看看如何使用v6版本路由进行合理的H5路由配置 一、基本页面结构&#xff08;目录根据开发要求建&#xff0c;下面仅用于展示配置路由&#xff09; 二、具体文件实现 1. index.tsx import React f…

Java | Leetcode Java题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isSelfCrossing(int[] distance) {int n distance.length;// 处理第 1 种情况int i 0;while (i < n && (i < 2 || distance[i] > distance[i - 2])) {i;}if (i n) {return false;}// 处…

Adobe Substance 3D Painter v10.0.1 解锁版下载安装教程 (3D绘画软件)

前言 Adobe Substance 3D Painter 简称 Pt&#xff0c;是一款由adobe公司新研发的3D绘画软件。 Substance 3D Painter具有前所未有的功能和工作流程改进&#xff0c;使为 3D 资产创建纹理变得比以往更容易。 一、下载地址 下载链接&#xff1a;分享文件&#xff1a;Adobe Su…

Leetcode JAVA刷刷站(20)有效的括号

一、题目概述 二、思路方向 在Java中&#xff0c;要判断一个仅包含括号&#xff08;(, ), {, }, [, ]&#xff09;的字符串是否有效&#xff0c;你可以使用栈&#xff08;Stack&#xff09;数据结构来实现。栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的…

排序算法之梳排序

title: 梳排序 date: 2024-7-30 14:46:27 0800 categories: 排序算法 tags:排序算法梳排序 description: 梳排序&#xff08;Comb Sort&#xff09;是一种由弗拉基米尔多博舍维奇&#xff08;Wlodzimierz Dobosiewicz&#xff09;于1980年所发明的不稳定排序算法&#xff0c;并…

无字母绕过webshell

目录 代码 payload构造 php7 php5 构造payload 代码 不可以使用大小写字母、数字和$然后实现eval的注入执行 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code))…

工业边缘网关软件 NeuronEX 中基于角色的访问控制功能

随着企业数字化转型的不断深入&#xff0c;确保数据和信息安全变得日益重要。传统的访问控制方法往往需要为每个用户单独配置权限&#xff0c;这种方法管理复杂且漏洞百出&#xff0c;难以适应快速变化的业务需求。而基于角色的访问控制&#xff08;RBAC&#xff09;功能通过定…

主任务控制子任务通信流程

#define WM_TAKE_STOCK_CMD 172 //MAIN->TAKE 任务流程#define TAKE_STOCK_CMD_FIND_TRAY 1 // 找托盘 #define WM_TAKE_STOCK_CMD_EXC 173 //TAKE内部使用#define TAKE_STOCK_EXE_OK 0 #define WM_TAKE_STOCK_TASK_MSG 174 //MAIN->TAKE 发送…

数据结构+图的基本应用

一、问题描述 求有向图的简单路径 编写一个程序&#xff0c;设计相关算法完成以下功能。 &#xff08;1&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有简单路径。 &#xff08;2&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有长度为 3 的简单…