Layui数据表格如何实现单元格在编辑失去焦点时自动进行数据验证

老敏姑娘_2133

老敏姑娘_2133

2026-06-20

264人浏览

原创

Layui表格编辑需在edit事件首行调用e.preventDefault()实现事前拦截,校验失败时手动恢复输入框值并用table.updateCell更新,避免数据不一致。

edit 事件里不能只监听,必须 e.preventDefault() 拦住默认写入

单元格编辑后失焦(比如按 tab 或点其他地方),layui 默认会立刻把新值写进 dom 和数据源。验证不是“事后检查”,而是“事前拦截”——不拦住,值已经落库,再校验就晚了。

  • 必须在 table.on('edit(test)', ...) 回调里第一行就写 e.preventDefault()
  • e.value 是用户刚输的字符串,e.oldValue 是原始值,别混淆
  • 校验失败时,得手动恢复输入框内容:e.tr.find("td[data-field='"+e.field+"'] input").val(e.oldValue)
  • 不恢复会导致表格显示和内部数据不一致,比如用户输错后没提示、还留着非法值

数字/邮箱/非空这类常见验证,正则要覆盖边界情况

内置没有验证规则,全靠自己写逻辑。但容易漏掉细节:空格没 trim、负号被忽略、邮箱里允许中文域名、小数点后多于两位等。

  • 非空判断别用 !e.value,应写 !e.value.trim()
  • 数字校验别直接 isNaN(+e.value),因为 "123 " 会被转成 123,但用户可能真想输带空格的字符串
  • 邮箱正则至少包含 ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$,否则 user@sub.example.com 会失败
  • 验证通过后,要用 table.updateCell(e.id, e.field, e.value.trim()) 显式更新,而不是改 e.data[e.field] —— 那只是快照,不生效

失焦验证失效?先查 e.id 是否对得上真实主键

表格每行的 e.id 默认是自增数字,但如果你在 cols 里写了 id: 'uid',那 e.id 就是该行 uid 字段的值。如果数据源里没这个字段,或字段名拼错,updateCell 就找不到目标行。

  • 检查 table.render() 的 cols 配置,确认是否声明了 id: 'xxx'
  • 打印 console.log(e.id, e.data),看 e.id 值是否和 e.data 中对应字段一致
  • 避免重复绑定 table.on('edit(...)', ...),重载表格后没清理旧监听,会导致一次编辑触发多次验证
  • 动态重绘表格(如 table.reload())后,必须重新绑定 edit 事件,且只绑一次

想统一处理多个字段?别逐个写 lay-verify,用 edit 事件 + 字段映射表

十几个可编辑列,每个都写独立验证逻辑太冗余。可以预先定义一个验证规则映射:

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载
const fieldRules = {
  price: (v) => /^(\d+\.?\d{0,2}|\.?\d{1,2})$/.test(v.trim()) || '请输入最多两位小数',
  email: (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v.trim()) || '邮箱格式错误',
  name: (v) => v.trim().length >= 2 || '姓名至少2个字符'
};

然后在 edit 回调里复用:

table.on('edit(test)', function(e){
  e.preventDefault();
  const rule = fieldRules[e.field];
  if (rule) {
    const msg = rule(e.value);
    if (msg !== true) {
      layer.msg(msg, {icon: 5});
      e.tr.find("td[data-field='"+e.field+"'] input").val(e.oldValue);
      return;
    }
  }
  table.updateCell(e.id, e.field, e.value.trim());
});

真正难的不是写正则,而是每次 e.id 和后端返回的数据结构不一致,或者忘记 trim() 导致前后端校验结果不一致——这种问题往往要翻好几层日志才能定位。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

layui

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5443

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6470

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6098

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

863

5

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2115

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3222

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1096

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3679

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 12.9万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 11.1万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习