javascript - 尽管返回了错误的 Vanilla Javascript,但表单仍在提交
问题描述
这是我的 App.js
errorMessage=(validator, input, value)=> {
const valid=validator(value)
if (value==="") {
input.nextElementSibling.style.display="inherit"
return false
} else if (!valid && value!=="") {
input.nextElementSibling.nextElementSibling.style.display="inherit"
return false
}
return true
}
const checkedCheckboxes=Array.from(checkboxes).filter(checkbox=> checkbox.checked);
validateCheckboxes=()=> {
const checked=checkedCheckboxes.length;
if (!checked) {
fieldSetActivity.nextElementSibling.style.display="block"
return false
}
return true
}
validateForm=()=> {
if (!validateCheckboxes()) {
return false
}
return true
}
// validateForm=()=> {
// Array.from(inputElements).forEach(element=> {
// let value=element.value;
// let input=element;
// if (input===name) {
// errorMessage(isValidName, input, value)
// } else if (element===email) {
// errorMessage(isValidEmail, input, value);
// } else if (element===creditNumber) {
// errorMessage(isValidCreditCard, input, value);
// } else if (element===zip) {
// errorMessage(isValidZipCode, input, value);
// } else if (element===cvv) {
// errorMessage(isValidCvv, input, value);
// } else if (element==fieldSetActivity) {
// validateCheckboxes()
// }
// });
// }
form.addEventListener('submit', validateForm);
这是我的 JS 小提琴以获取更多信息:https ://jsfiddle.net/apasric4/9t03muy2/1/
我研究了类似于这个问题的答案,并且注释掉的代码,我意识到布尔值没有到达父validateForm函数。
所以我决定测试一个函数,即validateCheckboxes函数,并在我的表单提交处理程序中实现一个可能的工作解决方案。但是不,尽管验证复选框函数返回 false,但表单仍会提交。
为什么会这样?
解决方案
编辑:
您的代码中有两件事需要修复
- 如果您的属性
onSubmit=return fun()
中有一个,则返回 true/false 有效。<form>
由于您使用的是侦听器,因此您需要event.preventDefault()
从验证功能 - 你
checkedCheckboxes
是一个const
,这意味着当复选框被选中/取消选中时,它不会被动态填充。将其移动到您的复选框验证方法中,并使用使其成为局部变量let
通过这些更改,您的验证位将如下所示:
validateCheckboxes=()=> {
// 2. Local variable
let checkedCheckboxes=Array.from(checkboxes).filter(checkbox=> checkbox.checked);
const checked=checkedCheckboxes.length;
if (!checked) {
fieldSetActivity.nextElementSibling.style.display="block"
return false;
}
return true;
}
validateForm=()=> {
if (!validateCheckboxes()) {
// 1. preventDefault instead of 'false'
event.preventDefault();
}
return;
}
JSFiddle:https ://jsfiddle.net/raghav_s/3e6s5tw8/
旧答案:
提供通用的“如何验证您的表单”
您需要在提交表单之前调用您的 JS 验证为此,请使用表单的onSubmit
属性,如下所示
<form action="index.html" method="post" onSubmit="return validateForm()">
JSFiddle:https ://jsfiddle.net/raghav_s/3e6s5tw8/
您也可以使用表单事件侦听器并event.preventDefault()
按照此MDN 文章中的说明进行调用
引用该页面中的示例:
JS:
function logSubmit(event) {
log.textContent = `Form Submitted! Time stamp: ${event.timeStamp}`;
event.preventDefault();
}
const form = document.getElementById('form');
const log = document.getElementById('log');
form.addEventListener('submit', logSubmit);
HTML:
<form id="form">
<label>Test field: <input type="text"></label>
<br><br>
<button type="submit">Submit form</button>
</form>
<p id="log"></p>
推荐阅读
- python - 如何返回 Chrome 中的所有元素?
- authentication - Heroku 在 Plotly Dash 网站上遵循 Basic Auth 示例时崩溃
- html - ASP.NET 页面中的活动导航栏
- flutter - 如何在 PaginatedDataTable Flutter Web 中实现搜索
- api - spring批处理API动态创建任务和步骤
- c# - Line Trace / Raycasting 如何在游戏引擎中工作以测试交叉点?
- javascript - 如何根据数据条件更改 React Native 样式颜色
- typescript - 此条件将始终返回 'false',因为类型 '"development" | “生产” | "test"' 和 '"local"' 没有重叠。ts(2367)
- wpf - Style.Triggers 中的 MouseLeave 路由事件的等价物是什么?
- c++ - 在 C++ 中,2D 数组的整体操作是否比 1D 数组的行为像 2D 数组慢?