如何正确获取输入数据并在函数中调用?提交按钮调用函数无响应
解决PESEL验证函数点击无响应的问题
我仔细看了你的代码,发现几个核心问题导致点击提交按钮后isValidPesel函数没正常工作,咱们一步步拆解修复:
问题1:嵌套函数未调用,验证逻辑根本没执行
你在isValidPesel里定义了validatepesel这个核心验证函数,但从头到尾都没调用它!而且你获取了PESEL输入值后,也没把它传给这个嵌套函数,等于整个验证逻辑完全没跑起来。
问题2:Submit按钮的默认行为会刷新页面
你的按钮是type="submit",如果它在<form>标签里,点击后会默认触发表单提交,页面会立刻刷新,就算函数执行了,你也看不到错误提示就被刷新覆盖了。
问题3:代码里的逻辑小bug
- 拼写错误:输入框的
minlenght应该是minlength,这个小错误会导致输入长度验证不生效 - 日期验证后直接return false,但没给用户明确提示,而且错误提示和格式错误重复
- 校验和的计算逻辑有点绕,可读性差
修复后的完整代码
我重构了你的代码,解决了上述所有问题,同时让逻辑更清晰:
<!-- 修正minlength拼写错误,若需要隐藏输入框可保留display:none --> <input class="form-control col-md-5 col-8" id="pesel" minlength="11" maxlength="11" type="text" name="pesel" placeholder="PESEL" required> <!-- 用return isValidPesel()阻止默认提交行为 --> <p><input class="submit-button" type='submit' name='submit' value='Wyślij' onclick="return isValidPesel()"></p> <span id="error" style="color: red;"></span> <script> function isValidPesel() { // 获取输入值和错误提示元素 const pesel = document.getElementById("pesel").value; const errorElement = document.getElementById('error'); // 每次验证前清空旧提示 errorElement.innerHTML = ''; errorElement.style.color = 'red'; // 1. 验证格式:必须是11位数字 const reg = /^[0-9]{11}$/; if (!reg.test(pesel)) { errorElement.innerHTML = 'Niepoprawny numer pesel (wymagane 11 cyfr)'; return false; // 阻止表单提交 } // 2. 验证日期部分(PESEL的月份有特殊规则,这里做基础验证,可扩展) const month = parseInt(pesel.substring(2, 4)); const day = parseInt(pesel.substring(4, 6)); // 处理不同世纪的月份规则:21-32对应2000-2099,41-52对应2100-2199等 let validMonth = (month >= 1 && month <= 12) || (month >= 21 && month <= 32) || (month >= 41 && month <= 52); // 基础日期验证,更精确的话可以考虑月份天数和闰年 const validDay = day >= 1 && day <= 31; if (!validMonth || !validDay) { errorElement.innerHTML = 'Niepoprawna data w numerze PESEL'; return false; } // 3. 验证校验和 const digits = pesel.split('').map(Number); const weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3]; let sum = 0; for (let i = 0; i < 10; i++) { sum += digits[i] * weights[i]; } const checksum = sum % 10 === 0 ? 0 : 10 - (sum % 10); if (checksum !== digits[10]) { errorElement.innerHTML = 'Niepoprawny numer pesel (suma kontrolna nie zgadza się)'; return false; } // 所有验证通过 errorElement.innerHTML = 'PESEL jest prawidłowy!'; errorElement.style.color = 'green'; return true; // 允许表单提交(如果需要的话) } </script>
关键修改说明
- 去掉了冗余的嵌套函数,直接在
isValidPesel里执行所有验证步骤,逻辑更直观 - 用
return isValidPesel()绑定到按钮点击事件,验证失败时阻止表单默认提交,避免页面刷新 - 修正了
minlength的拼写错误,确保输入框的长度验证生效 - 拆分了不同错误场景的提示,用户能清楚知道哪里错了
- 优化了校验和的计算逻辑,可读性更强
- 增加了验证通过的成功提示,提升用户体验
如果你的输入框不在<form>标签里,或者不需要提交表单,可以把按钮类型改成type="button",这样就不用处理默认提交行为了。
内容的提问来源于stack exchange,提问作者enc
相关产品推荐
相关产品推荐

