为何必填输入项未全部填写时,表单提交按钮仍会被启用?
为何必填输入项未全部填写时,表单提交按钮仍会被启用?
嘿,我来帮你拆解这个问题~
问题根源:你的验证逻辑漏了下拉框的判断!
你现在的JS代码里,只检查了必填项的值是否为空字符串,但你的下拉框默认值是"select",不是空字符串啊!
举个例子:当用户填完文本框后,你遍历所有必填项时,文本框的值不为空,而下拉框的value是"select"——这个值并不满足== ""的判断,所以requiredCreateDigestInputs会一直保持true,直接就把提交按钮启用了,完全没考虑下拉框还没选有效选项的情况!
快速修复:完善你的验证逻辑
你只需要修改循环里的判断条件,把下拉框的情况也加进去就行。这里给你两种实现方式:
方式1:精准区分输入类型判断
const enableSubmitBtn = () => { $(createDigestFormContainer).on("input change", () => { // 把keyup click换成input change,更精准 let createDigestInputs = createDigestFormContainer.find(".required"); let requiredCreateDigestInputs = true; for (let i = 0; i < createDigestInputs.length; i++) { const input = createDigestInputs[i]; // 文本框:值为空;下拉框:值为默认的"select" const isUnfilled = (input.type === "text" && input.value.trim() === "") || (input.tagName === "SELECT" && input.value === "select"); if (isUnfilled) { requiredCreateDigestInputs = false; break; // 发现未填项直接跳出循环,不用白跑剩下的 } } createDigestModalSubmitBtn.prop("disabled", !requiredCreateDigestInputs); }); };
方式2:更通用的判断逻辑
如果之后还要加其他类型的必填项(比如单选框),可以把判断逻辑拆得更灵活:
const enableSubmitBtn = () => { $(createDigestFormContainer).on("input change", () => { let createDigestInputs = createDigestFormContainer.find(".required"); let requiredCreateDigestInputs = true; for (let i = 0; i < createDigestInputs.length; i++) { const input = createDigestInputs[i]; let isInvalid = false; if (input.tagName === "SELECT") { isInvalid = input.value === "select"; } else if (input.type === "text") { isInvalid = input.value.trim() === ""; } // 之后加其他类型的话,在这里加判断就行,比如单选框 // else if (input.type === "radio" && !input.checked) { ... } if (isInvalid) { requiredCreateDigestInputs = false; break; } } createDigestModalSubmitBtn.prop("disabled", !requiredCreateDigestInputs); }); };
更优实践:用浏览器原生/Bootstrap内置表单验证
你后来提到的重构思路太对了!自己从零写所有验证逻辑很容易踩坑,用浏览器原生的表单验证(或者Bootstrap封装好的)才是最佳选择:
- 如果你用Bootstrap,直接给表单元素加上
required属性,下拉框的默认选项设为disabled selected(比如<option value="" disabled selected>Select</option>),再用几行JS控制按钮状态就行:
const form = document.getElementById('create-digest-modal-form-container'); const submitBtn = document.getElementById('create-digest-modal-btn'); form.addEventListener('input', () => { submitBtn.disabled = !form.checkValidity(); });
这种方式既不用自己写复杂的判断逻辑,还能获得浏览器原生的验证提示,体验更统一。
备注:内容来源于stack exchange,提问作者Mickey Vershbow
相关产品推荐
相关产品推荐

