本文详解如何通过 jquery 验证多个数字输入框(范围 1–20、两位数格式),确保仅当全部输入合法时才关闭全屏搜索弹层,避免单个字段验证通过即误触发关闭的问题。
在构建全屏搜索交互时,一个常见但易被忽视的逻辑缺陷是:按钮点击行为未对所有输入做全局有效性校验。原始代码中,.send_btn 的 click 事件使用 .each() 遍历每个输入框,并对每个字段单独执行样式更新与弹层开关操作——这导致最终状态仅由最后一个输入框的验证结果决定,而非整体一致性。
要实现“仅当所有输入均有效时才关闭搜索弹层”,核心在于 收集全部验证结果并进行聚合判断,而非逐个处理。以下是经过优化的专业解决方案:
首先,将 handleChange() 函数改造为有明确返回值的纯验证函数,统一返回 true(有效)或 false(无效),便于后续聚合判断:
function handleChange(input) {
const val = input.value.trim();
// 清空非法前置负号或空值
if (val === '' || val === '-' || val === '0') {
input.value = '';
input.style.borderColor = 'red';
return false;
}
const num = Number(val);
// 检查是否为 1–20 的整数,且长度为 1 或 2 位(允许 "1" 但禁止 "05" 类前导零?此处按业务需明确)
// 注意:type="number" 已自动过滤非数字字符,故只需数值逻辑校验
if (isNaN(num) || num < 1 || num > 20 || !Number.isInteger(num)) {
input.style.borderColor = 'red';
return false;
}
input.style.borderColor = '';
return true;
}? 关键改进点:return false/true 显式反馈验证状态,取代副作用式样式操作。
接着,在搜索按钮点击事件中,批量收集所有 .search__input 的验证结果,并使用 Array.prototype.every() 进行全量校验(比 !result.includes(false) 更语义清晰且高效):
$('.send_btn').click(function(e) {
e.preventDefault(); // 阻止默认提交行为(即使 button type="submit")
const allValid = $('.search__input').toArray().every(input => handleChange(input));
if (allValid) {
$('#search').removeClass('open');
$('html').removeC
lass('noScrollSimple');
} else {
// 可选:聚焦首个错误项提升体验
const firstInvalid = $('.search__input').filter(function() {
return this.style.borderColor === 'red';
}).first();
if (firstInvalid.length) firstInvalid.focus();
}
});$(this).prop('disabled', true).text('Searching...');
// ...验证通过后
$(this).prop('disabled', false).text('Search');通过以上重构,搜索按钮的行为完全解耦于单个字段状态,转而依赖全体输入的联合有效性断言,既符合用户直觉,也提升了代码健壮性与可维护性。