一般在 PC 端中使用 form 内嵌 input 输入框时,都知道在提交按钮(可以使用 type="submit" 的 input / button)来提交 form 前需要进行一些校验通过再把 form sumbit 给后端,或者给 form 绑定一个 onsumit 的事件然后,然后如果校验失败则使用 return false; 来阻止其提交。但如果在移动端呢?
移动端使用 form + input 输入框的那些坑
如果 form 内嵌 input 输入框时,如果 form 里面最后的一个输入项是 input 输入框,用户点击输入框会弹出虚拟键盘,键盘右下角会有 “前往” 按钮,如果用户不点你的 “提交” 按钮,直接点 “前往”,会发生什么事情呢?表单不经你对 “提交” 绑定的校验事件,直接触发 onsubmit 事件去提交表单了!
解决方案
兼容手动提交及虚拟键盘提交,加一个锁 lockSubmit 来防止重复提交,如果是虚拟键盘提交则人为 trigger 点击 “提交” 按钮统一处理
var lockSubmit = false; // 锁定 Submit 防止重复提交
$("#submit").click(function () { // 手动触发提交
if (lockSubmit) {
return false;
}
lockSubmit = true;
if (validateForm()) { // 自己定义的校验表单的函数
// 其他提交前的处理事件
$("#form").submit();
} else {
lockSubmit = false;
}
return false;
});
// 虚拟键盘提交
var $form = $('#form');
$form[0].onsubmit = function () {
if (!lockSubmit) { // 用户如果手动提交则 lockSubmit 为 true,不执行下面操作,直接提交
if (validateForm()) { // 校验成功则触发模拟点击提交
setTimeout(function () { // 触发提交
$("#submit").click();
}, 50);
}
return false;
}
}
function validateForm () {
// 自己定义的校验表单的函数
return true;
}