javascript - 相同表单的多个版本的 Vanilla JavaScript 表单验证
问题描述
我的网站上有一个表单,我使用一些自定义 JavaScript 进行了验证(见下文)。问题是,我现在需要在页脚中创建相同表单的第二个版本。唯一的区别是样式之一,否则-它们是具有相同功能的完全相同的形式。
因此,我现在需要重新调整我的表单的用途,以便它可以验证两种表单,但我很难弄清楚如何做到这一点。
这是我目前使用的代码:
const signupForm = document.querySelector('#signup-form')
const signupName = document.querySelector('#signup-form input[name="name"]')
const signupEmail = document.querySelector('#signup-form input[name="email"]')
let validName = false
let validEmail = false
const emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
signupForm.addEventListener('submit', function(e) {
let canSubmit = false
if (validName === true && validEmail === true) {
canSubmit = true
}
if (canSubmit === false) {
e.preventDefault()
}
checkNameInput()
checkEmailInput()
})
signupName.addEventListener('blur', () => checkNameInput())
signupEmail.addEventListener('blur', () => checkEmailInput())
function checkNameInput() {
let nameValue = signupName.value.trim()
if (nameValue === '' || nameValue == null) {
setErrorState(signupName, 'Name is required')
} else {
validName = true
setSuccessState(signupName)
}
}
function checkEmailInput() {
let emailValue = signupEmail.value.trim()
if (emailValue === '' || emailValue == null) {
setErrorState(signupEmail, 'Email is required')
} else if (!emailRegex.test(emailValue)) {
setErrorState(signupEmail, 'Please enter a valid email address')
} else {
validEmail = true
setSuccessState(signupEmail)
}
}
function setErrorState(input, message) {
const errorDiv = input.nextElementSibling
input.classList.add('input-error')
errorDiv.classList.remove('hidden')
errorDiv.textContent = message
}
function setSuccessState(input) {
const errorDiv = input.nextElementSibling
input.classList.remove('input-error')
errorDiv.classList.add('hidden')
errorDiv.textContent = ''
}
我显然需要更改querySelector
并querySelectorAll
添加一个forEach
循环。这正是我试图做的——如下:
const signupForm = document.querySelectorAll('#signup-form')
const signupName = document.querySelectorAll('#signup-form input[name="name"]')
const signupEmail = document.querySelectorAll('#signup-form input[name="email"]')
let validName = false
let validEmail = false
const emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
signupForm.forEach(form => {
form.addEventListener('submit', function(e) {
let canSubmit = false
if (validName === true && validEmail === true) {
canSubmit = true
}
if (canSubmit === false) {
e.preventDefault()
}
checkNameInput()
checkEmailInput()
})
})
signupName.forEach(name => {
name.addEventListener('blur', () => checkNameInput())
})
signupEmail.forEach(email => {
email.addEventListener('blur', () => checkEmailInput())
})
function checkNameInput() {
let nameValue = signupName.value.trim()
if (nameValue === '' || nameValue == null) {
setErrorState(signupName, 'Name is required')
} else {
validName = true
setSuccessState(signupName)
}
}
function checkEmailInput() {
let emailValue = signupEmail.value.trim()
if (emailValue === '' || emailValue == null) {
setErrorState(signupEmail, 'Email is required')
} else if (!emailRegex.test(emailValue)) {
setErrorState(signupEmail, 'Please enter a valid email address')
} else {
validEmail = true
setSuccessState(signupEmail)
}
}
function setErrorState(input, message) {
const errorDiv = input.nextElementSibling
input.classList.add('input-error')
errorDiv.classList.remove('hidden')
errorDiv.textContent = message
}
function setSuccessState(input) {
const errorDiv = input.nextElementSibling
input.classList.remove('input-error')
errorDiv.classList.add('hidden')
errorDiv.textContent = ''
}
但这不起作用。知道为什么不?
谢谢。
更新
这是两种形式的html:
// Sidebar Form
<form class="signup-form sidebar-signup-form dark-form" novalidate>
<input
class="sidebar-signup-input"
name="name"
placeholder="Name"
type="text"
/>
<div class="hidden input-error-text"></div>
<input
class="sidebar-signup-input"
name="email"
placeholder="Email"
type="email"
/>
<div class="hidden input-error-text"></div>
<button class="sidebar-signup-button" type="submit">Signup Today</button>
</form>
// Footer Form
<form class="signup-form footer-signup-form dark-form" novalidate>
<input
class="footer-signup-input"
name="name"
placeholder="Name"
type="text"
/>
<div class="hidden input-error-text"></div>
<input
class="footer-signup-input"
name="email"
placeholder="Email"
type="email"
/>
<div class="hidden input-error-text"></div>
<button class="footer-signup-button" type="submit">
Signup Today
</button>
</form>
解决方案
推荐阅读
- angular - 角度 5 中的表单数据在 console.log() 时显示为空
- reactjs - Threejs在使用React时使用fontloader加载字体会抛出错误
- analytics - Grafana 登录页面的默认用户名和密码是什么?
- node.js - 在 mocha 测试期间尝试进行猫鼬查询时承诺超时
- c# - 如何在 QnA Maker v4.0 中以编程方式获取一对的 id?
- c# - 将 void 方法重构为可测试
- pandas - 组上的矢量化函数
- javascript - 如何从容器外部创建并连接到 docker 容器中的 TTY?
- video - ffmpeg concat 去除视频声音
- swift - 鼠标事件不会路由到 Cocoa 应用程序中的 NSButtons