Layui表格备注编辑功能代码详解
Layui 表格备注编辑功能详细解析
我将逐行详细解释这段代码的每个部分,包括语法、功能和工作原理:
第一部分:监听备注单元格点击事件
// 监听备注单元格点击事件
$(document).on('click', '.remark-cell', function() {// 获取当前行的索引值var index = $(this).closest('tr').attr('data-index');// 从表格缓存中获取该行数据var data = table.cache['product-table'][index];// 调用打开编辑表单函数openEditRemarkForm(data);
});
详细解析:
事件委托机制:
$(document).on('click', '.remark-cell', ...)
:使用事件委托监听所有具有remark-cell
类的元素点击事件- 语法:
$(selector).on(event, childSelector, function)
- 优点:适用于动态生成的元素,无需重复绑定
获取行索引:
$(this)
:指代当前被点击的元素(.remark-cell
).closest('tr')
:向上查找最近的<tr>
元素(表格行).attr('data-index')
:获取 Layui 自动添加的行索引属性值
获取行数据:
table.cache
:Layui 表格的数据缓存对象'product-table'
:表格的 ID(与table.render
中的elem
对应)[index]
:通过索引获取具体行数据对象
打开编辑表单:
- 将获取的行数据传递给
openEditRemarkForm
函数
- 将获取的行数据传递给
第二部分:打开编辑备注表单函数
// 打开编辑备注表单
function openEditRemarkForm(data) {// 使用layer.open创建弹窗layer.open({type: 1, // 页面层类型title: '编辑备注', // 弹窗标题area: ['500px', '300px'], // 弹窗尺寸(宽×高)content: '<div class="edit-form-container">' + // 开始构建表单HTML'<form class="layui-form" lay-filter="remarkForm" >' + // 表单定义' <div class="layui-form-item">' + // 表单项1' <label class="layui-form-label">产品名称</label>' + // 标签' <div class="layui-input-block">' + // 输入区域' <input type="text" value="' + data.name + '" class="layui-input" readonly>' + // 只读输入框' </div>' +' </div>' +' <div class="layui-form-item">' + // 表单项2' <label class="layui-form-label">备注内容</label>' + ' <div class="layui-input-block">' +' <textarea name="remark" placeholder="请输入备注内容" class="layui-textarea">' + (data.remark || '') + '</textarea>' + // 文本域' </div>' +' </div>' +' <div class="layui-form-item">' + // 按钮区域' <div class="layui-input-block">' +' <button class="layui-btn" lay-submit lay-filter="saveRemark">保存</button>' + // 提交按钮' <button type="button" class="layui-btn layui-btn-primary" onclick="layer.closeAll()">取消</button>' + // 取消按钮' </div>' +' </div>' +' <input type="hidden" name="id" value="' + data.id + '">' + // 隐藏字段'</form></div>', // 结束表单success: function() { // 弹窗成功打开回调form.render(); // 渲染Layui表单组件}});
}
详细解析:
函数定义:
function openEditRemarkForm(data) {...}
:定义打开表单的函数data
参数:包含当前行数据的对象
layer.open() 方法:
type: 1
:自定义HTML内容弹窗title
:弹窗标题area
:弹窗尺寸(宽×高)content
:弹窗内容(HTML字符串)
表单结构:
- 外层容器:
<div class="edit-form-container">
用于样式控制 - 表单元素:
<form class="layui-form" lay-filter="remarkForm">
lay-filter="remarkForm"
:表单过滤器名称(用于后续监听提交)
- 外层容器:
产品名称字段:
- 使用
<input type="text">
显示产品名称 value="' + data.name + '"
:从行数据获取名称readonly
:设置为只读,不可编辑
- 使用
备注内容字段:
- 使用
<textarea>
支持多行输入 name="remark"
:标识字段名(提交时使用)(data.remark || '')
:显示现有备注,空时显示空字符串
- 使用
按钮区域:
- 保存按钮:
class="layui-btn"
:Layui 按钮样式lay-submit
:标记为提交按钮lay-filter="saveRemark"
:设置过滤器名称(用于监听提交)
- 取消按钮:
type="button"
:防止表单提交onclick="layer.closeAll()"
:点击关闭所有弹窗
- 保存按钮:
隐藏字段:
<input type="hidden" name="id" value="' + data.id + '">
- 存储产品ID,提交时使用
success 回调:
success: function() {...}
:弹窗成功打开后执行form.render()
:重新渲染表单元素(确保Layui样式生效)
第三部分:监听表单提交事件
// 监听表单提交
form.on('submit(saveRemark)', function(formData) {// 构造请求体var requestBody = {"remark": formData.field.remark};$.ajax({url: '/FSProduct/update/' + formData.field.id,type: 'POST',contentType: 'application/json',data: JSON.stringify(requestBody),success: function(res) {if (res.code === 200) {layer.msg('备注更新成功', {icon: 1});// 刷新表格tableIns.reload();// 关闭所有弹层layer.closeAll();} else {layer.msg('更新失败: ' + res.message, {icon: 2});}},error: function() {layer.msg('请求失败,请重试', {icon: 2});}});return false; // 阻止表单跳转
});
详细解析:
表单提交监听:
form.on('submit(saveRemark)', ...)
:监听lay-filter="saveRemark"
按钮的提交事件function(formData)
:回调函数,参数包含表单数据
构造请求体:
var requestBody = { "remark": formData.field.remark };
- 只包含需要更新的备注字段
AJAX 请求配置:
url: '/FSProduct/update/' + formData.field.id
- 动态拼接产品ID(来自隐藏字段)
type: 'POST'
:HTTP方法contentType: 'application/json'
:请求内容类型data: JSON.stringify(requestBody)
:序列化请求体
success 回调:
if (res.code === 200)
:判断响应状态码- 成功时:
layer.msg('备注更新成功', {icon: 1})
:显示成功提示tableIns.reload()
:刷新表格数据layer.closeAll()
:关闭所有弹窗
- 失败时:
layer.msg('更新失败: ' + res.message, {icon: 2})
:显示错误信息
error 回调:
- 处理请求失败情况(网络错误等)
layer.msg('请求失败,请重试', {icon: 2})
:显示通用错误提示
阻止默认行为:
return false
:阻止表单默认提交行为(页面跳转)
完整工作流程
用户交互:
- 用户点击表格中的备注单元格(
.remark-cell
) - 事件监听器捕获点击事件
- 用户点击表格中的备注单元格(
数据获取:
- 获取被点击行的索引(
data-index
) - 从表格缓存中获取该行完整数据
- 获取被点击行的索引(
表单展示:
- 打开弹窗显示编辑表单
- 预填充当前备注内容
用户编辑:
- 用户修改备注内容
- 点击"保存"按钮提交表单
数据处理:
- 表单提交监听器捕获事件
- 构造AJAX请求发送到后端
响应处理:
- 成功:刷新表格、关闭弹窗、显示成功提示
- 失败:显示错误信息
安全注意事项
XSS 风险
value="' + data.name + '"
风险:如果 data.name
包含恶意脚本,会被执行
解决方案:
function escapeHtml(str) {return str.replace(/</g, '<').replace(/>/g, '>');
}// 使用转义
value="' + escapeHtml(data.name) + '"
表单验证缺失
风险:用户可能输入过长内容
解决方案:
// 在success回调中添加
form.verify({remark: function(value) {if(value.length > 500) {return '备注不能超过500字';}}
});
代码优化建议
- 使用模板字符串:
content: `<div class="edit-form-container"><form class="layui-form" lay-filter="remarkForm"><!-- 表单内容 --></form></div>
`
- 事件委托优化:
// 使用事件委托代替内联onclick
$(document).on('click', '.cancel-btn', function() {layer.closeAll();
});
- 错误处理增强:
error: function(xhr) {var msg = xhr.status + ' ' + xhr.statusText;layer.msg('请求失败: ' + msg, {icon: 2});
}
总结
这段代码实现了完整的表格备注编辑功能:
- 事件监听:使用事件委托监听备注单元格点击
- 数据获取:从表格缓存获取行数据
- 表单展示:使用Layer弹窗展示编辑表单
- 表单提交:通过AJAX提交数据到后端
- 响应处理:根据结果刷新表格或显示提示
关键点:
- 使用
table.cache
获取行数据 - 通过
layer.open
创建编辑表单 - 使用
form.on('submit')
监听表单提交 - AJAX 请求更新后端数据
- 成功时刷新表格 (
tableIns.reload()
)
这种实现方式在Layui框架中非常典型,展示了如何结合表格操作、弹窗表单和AJAX通信来实现数据编辑功能。