1. 什么是 layui?
layui 是一个基于 layui 的前端 UI 框架,注重极简、易用、标准三个特点。最主要的特征就是轻量级,尤其适合前后端分离的项目。该框架灵活,且易于扩展和维护。
本文将会讲解一个比较常见的问题 —— 表单提交为什么会有两次,接下来将深入探讨这个问题。
2. layui 中表单提交的原理是什么?
Layui 在表单提交中使用了原生的 Ajax 技术,先阻止了表单默认的提交操作,通过监听表单的 submit 事件,将表单数据进行加工后以 JSON 的格式封装到异步请求参数中,发起异步请求访问服务端,然后在回调函数中处理返回值并进行相应的提示等操作。
2.1 layui 的表单事件监听
Layui 中监听表单提交是通过 on 函数来实现的,主要代码如下:
// 提交
form.on('submit(formDemo)', function (data) {
console.log(data.field); // 当前容器的全部表单字段,名值对形式:{name: value}
layer.msg(JSON.stringify(data.field)); // 序列化表单值
return false; // 防止表单重载
});
在这个示例中,监听了一个名称为 formDemo 的表单提交事件,当表单提交时,会触发这个回调函数。其中,data.field 是提交表单时序列化的参数对象。
2.2 layui 的异步提交
这里是 layui 的异步提交代码实现:
var { form } = layui;
//提交表单
form.on('submit(formDemo)', function (data) {
var loadingIndex = layer.load(2, { shade: [0.3, '#fff'] }); // 加载动画
$.ajax({
url: '/api/addOrUpdate', // 服务端 url
type: 'POST', // 提交方式
contentType: 'application/json; charset=utf-8', // 请求类型
data: JSON.stringify(data.field), // 将对象转为 json 字符串,提交给服务端
dataType: 'json', // 预期返回的数据类型
success: function (res) { // 成功处理
layer.msg('保存成功');
}
error: function (res) { // 失败处理
layer.msg('保存失败');
},
complete: function () { // 完成处理
layer.close(loadingIndex); // 关闭加载动画
}
});
return false; // 阻止表单的行为
});
这段代码中,异步请求使用的是 jQuery 的 ajax 方法,请求头中指定了请求类型为 json,请求方式为 post。
3. 表单提交重复的原因
在 layui 中,表单提交会被多次提交的原因在于,在异步请求尚未响应的时候,用户再次使用提交按钮,导致异步请求加入请求队列,最终导致了表单重复提交。解决这一问题最简单的方法是防止异步请求重复提交,我们可以在代码中加入判断 —— 只有在当前异步请求完成后,才会重新生成异步请求,代码如下:
var { form } = layui;
//提交表单
var isSubmit = false; // 是否已提交
form.on('submit(formDemo)', function (data) {
if (isSubmit) return; // 如果已经提交过,则直接结束,并防止重复提交
isSubmit = true; // 标记当前提交已经执行
var loadingIndex = layer.load(2, { shade: [0.3, '#fff'] }); // 开启加载动画
$.ajax({
url: '/api/addOrUpdate',
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(data.field),
dataType: 'json',
success: function (res) {
layer.msg('保存成功');
},
error: function (res) {
layer.msg('保存失败');
},
complete: function () {
layer.close(loadingIndex); // 关闭加载动画
isSubmit = false; // 完成当前请求
}
});
return false;
});
对重复提交进行判断的变量 isSubmit 首先设置为 false,接着在正式提交时将其设置为 true,只有在异步完成后,才将其重新变为 false。
4. 总结
layui 是一个非常好用的前端框架,而表单的重复提交问题更是一个常见的问题,我们通过查看 layui 源码,找到了解决表单重复提交的原因,并提供了一个可行的解决方案。在实际项目中,我们应该避免表单重复提交产生的各种问题,提高用户体验。