javascript - 如何禁用提交按钮,直到所有输入类都有 class="valid"
问题描述
我想创建一个注册表单。我有 6 个输入:名字、姓氏、电子邮件、密码、密码确认和用户协议复选框。如果输入有class="valid"
,则值有效,否则无效。我把所有的类都设为 default class="invalid"
。我想禁用我的提交按钮,直到所有输入字段都有class="valid"
. 根据我的研究,我看到应该首先使用事件监听器禁用该按钮window.onload
,但我仍然不知道该怎么做。
这是基本形式:
<form class="signup__form" action="/">
<input class="invalid" type="text" name="fname" placeholder="name"/> </br>
<input class="invalid" type="text" name='lname' placeholder="Last Name" /></br>
<input class="invalid" type="email" name='email' placeholder="E-mail" /></br>
<input class="invalid" type="password" name="password" placeholder="Password" />
<input class="invalid" type="password" name="password" placeholder="Password Confirm" />
<input class="invalid" type="checkbox" /> User Agreement</br>
<button type="submit" >Sign Up</button>
</form>
我正在使用事件监听器控制复选框验证:
checkbox.addEventListener('click', (e) => {
if (e.target.checked) {
checkbox.classList.remove('invalid');
checkbox.classList.add('valid');
} else {
checkbox.classList.remove('valid');
checkbox.classList.add('invalid');
}
})
其余的,我正在检查正则表达式:
// Regex values
const regexs = {
fname: /^[a-zA-Z0-9]{3,24}$/,
lname: /^[a-zA-Z0-9]{3,24}$/,
email: /^([a-z\d\.-]+)@([a-z\d-]+)\.([a-z]{2,8})$/,
password: /^[\w@-]{8,20}$/
};
// Regex Validation
const validation = (input, regex) => {
if (regex.test(input.value)) {
input.classList.remove('invalid');
input.classList.add('valid');
} else {
input.classList.remove('valid');
input.classList.add('invalid');
}
}
inputs.forEach((input) => {
input.addEventListener('keyup', (e) => {
validation(e.target,regexs[e.target.attributes.name.value])
})
})
解决方案
我会尝试原生使用 HTML 属性 ( pattern
& required
) 和 CSS,而不是屈服于 javascript。试一试,看看感觉如何。请注意,我在您的电子邮件输入中排除了一个模式。
我唯一会使用 javascript 是检查密码字段是否相同,但我会通过将第一个密码输入的密码注入确认密码输入的pattern
属性来做到这一点,替换^[\w@-]{8,20}$
.
粉红色的背景只是用来展示验证规则。
顺便说一句,您在某些 HTML 标记上得到了错误的格式。你不需要结束斜线input
,你应该输入<br/>
,而不是</br>
。
input:invalid {
background-color: pink;
}
form:invalid button[type="submit"] {
opacity: 0.5;
}
<form class="signup__form" action="/">
<input type="text" required pattern="^[a-zA-Z0-9]{3,24}$" placeholder="Name"> <br/>
<input type="text" required pattern="^[a-zA-Z0-9]{3,24}$" placeholder="Last Name"><br/>
<input type="email" required placeholder="E-mail"><br/>
<input type="password" required pattern="^[\w@-]{8,20}$" placeholder="Password"><br/>
<input type="password" required pattern="^[\w@-]{8,20}$" placeholder="Password Confirm"><br/>
<input type="checkbox" required>User Agreement<br/>
<button type="submit" >Sign Up</button>
</form>
推荐阅读
- javascript - 如何使用 JSON 在 Nextjs 中制作动态侧边栏
- github - 如果您归档 github pages 存储库,github.io 上的内容会持续存在吗?
- asp.net - 如何在asp.net中实现观察者模式
- c# - TypeLoadException:无法解析类型(来自 typeref、类/程序集 System.IO.Stream、System.Runtime、Version=4.2.2.0、Culture=neutral)
- arrays - 无法正确比较 bash 循环中定义的变量
- python - 我将如何在 tkinter 中创建一个菜单栏项来显示与之配套的热键?
- javascript - 如何获取和修改网格单元 CSS 中的数据
- javascript - 下拉菜单在 reactJS Bootstrap 中不起作用
- flutter - 如何将音频 url 转换为 Flutter Web 中的文件?
- rust - 当请求恐慌时,如何让我的 Rocket 应用程序响应错误?