在运行时将 类 添加到 html 元素未按预期工作
Adding classes during runtime to html elements not working as expected
我正在尝试创建一个带有一些基本客户端验证的表单。在表单中,我有 3 个输入字段,用户名、电子邮件和密码。最初他们有一个共同的 class 输入。我还向这些输入元素附加了一个同级段落元素,这些段落元素包含一些输入规范,如果用户输入无效内容,则必须向用户显示这些规范。
在CSS我基本上创建了两个classes,有效和无效,有效只是将输入元素的边框变为绿色,无效将边框变为红色并设置段落元素不透明度从 0 到 1(初始样式)。
在用于检查用户输入有效性的脚本文件中,我有三个布尔变量,isUserNameValid、isEmailValid、isPasswordValid,所有这三个初始设置为 false。
现在我在运行时添加这些 CSS classes 作为用户输入。添加 classes(有效和无效)对于第一个输入元素(用户名输入元素)工作正常,但是一旦我转到下一个输入元素(电子邮件并键入)单个字母,脚本将 class valid 添加到电子邮件输入元素而不是 invalid,即使 isEmailValid 是假的。
我尽力弄清楚为什么它添加 class 有效,即使我明确地说 if the isEmailValid is equals to false add a class of invalid and remove class 有效,相反它在做相反的事情。
我附上了 fiddle link,而且我在 JavaScript 方面经验不多,所以,请用简单的英语进行解释。
if(username.length > 5) {
isUserNameValid = true
}
if(email.length > 10) {
isEmailValid = true
}
if(password.length > 10) {
isPasswordValid = true
}
if(isUserNameValid === true && isEmailValid === true && isPasswordValid === true) {
loginButton.disabled = false
loginButton.style.cursor = 'pointer'
} else {
console.log('username',username, isUserNameValid)
console.log('email',email, isEmailValid)
console.log('password',password, isPasswordValid)
loginButton.disabled = true
loginButton.style.cursor = 'default'
if(isUserNameValid === false) {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if(isEmailValid === false) {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if(isPasswordValid === false) {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if(isUserNameValid === true) {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if(isEmailValid === true) {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if(isPasswordValid === true) {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
}
FIDDLE LINK: https://jsfiddle.net/weg9jy0c/5/
这对你有用吗?
https://jsfiddle.net/gnca42xp/1/
const form = document.querySelector('.main-form')
form.addEventListener('keyup', (e) => {
const loginButton = document.querySelector('.login-btn')
const username = document.querySelector('#name').value
const email = document.querySelector('#email').value
const password = document.querySelector('#password').value
let isUserNameValid = false;
let isEmailValid = false;
let isPasswordValid = false;
currentUpdateField = e.target.getAttribute('id');
if (username.length > 5) {
isUserNameValid = true
}
if (email.length > 10) {
isEmailValid = true
}
if (password.length > 10) {
isPasswordValid = true
}
if (isUserNameValid === true && isEmailValid === true && isPasswordValid === true) {
e.target.classList.remove('invalid')
loginButton.disabled = false
loginButton.style.cursor = 'pointer'
} else {
console.log('username', username, isUserNameValid)
console.log('email', email, isEmailValid)
console.log('password', password, isPasswordValid)
loginButton.disabled = true
loginButton.style.cursor = 'default'
if (isUserNameValid === false && currentUpdateField === 'name') {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if (isEmailValid === false && currentUpdateField === 'email') {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if (isPasswordValid === false && currentUpdateField === 'password') {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if (isUserNameValid === true && currentUpdateField === 'name') {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if (isEmailValid === true && currentUpdateField === 'email') {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if (isPasswordValid === true && currentUpdateField === 'password') {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
}
})
.input {
outline: none;
}
.valid {
border: 1px solid rgb(89, 224, 89);
}
input+p {
opacity: 0;
}
.invalid {
border: 2px solid rgb(245, 101, 101);
}
input.invalid+p {
opacity: 1;
color: orange;
}
<html>
<title>Demo Form</title>
<body>
<form class="main-form" method="post">
<input class="input" type="text" name="username" id="name" placeholder="Username">
<p>Username must have more than 5 characters</p>
<input class="input" type="email" name="email" id="email" placeholder="Email">
<p>Email must of format <b>email@site.domain</b></p>
<input class="input" type="password" name="password" id="password" placeholder="Password">
<p>Password must have more than 5 characters and aplhanumeric with a special character</p><br>
<button type="submit" class="login-btn" disabled>Register</button>
</form>
</body>
</html>
你的情况会怎样
1) 第一次用户输入用户名5个字符后有效
2) 然后用户在电子邮件字段中输入数据,这里 e.target
是电子邮件字段,但从您的代码来看,isUsernameInvalid 定义为 false,并将 class 添加到电子邮件字段 e.target
。
这就是您的代码无法正常工作的原因
所以我所做的是,
我在当前更新字段上得到 id
,然后仅当 ID 匹配时才添加或删除 classes
我正在尝试创建一个带有一些基本客户端验证的表单。在表单中,我有 3 个输入字段,用户名、电子邮件和密码。最初他们有一个共同的 class 输入。我还向这些输入元素附加了一个同级段落元素,这些段落元素包含一些输入规范,如果用户输入无效内容,则必须向用户显示这些规范。
在CSS我基本上创建了两个classes,有效和无效,有效只是将输入元素的边框变为绿色,无效将边框变为红色并设置段落元素不透明度从 0 到 1(初始样式)。
在用于检查用户输入有效性的脚本文件中,我有三个布尔变量,isUserNameValid、isEmailValid、isPasswordValid,所有这三个初始设置为 false。
现在我在运行时添加这些 CSS classes 作为用户输入。添加 classes(有效和无效)对于第一个输入元素(用户名输入元素)工作正常,但是一旦我转到下一个输入元素(电子邮件并键入)单个字母,脚本将 class valid 添加到电子邮件输入元素而不是 invalid,即使 isEmailValid 是假的。
我尽力弄清楚为什么它添加 class 有效,即使我明确地说 if the isEmailValid is equals to false add a class of invalid and remove class 有效,相反它在做相反的事情。
我附上了 fiddle link,而且我在 JavaScript 方面经验不多,所以,请用简单的英语进行解释。
if(username.length > 5) {
isUserNameValid = true
}
if(email.length > 10) {
isEmailValid = true
}
if(password.length > 10) {
isPasswordValid = true
}
if(isUserNameValid === true && isEmailValid === true && isPasswordValid === true) {
loginButton.disabled = false
loginButton.style.cursor = 'pointer'
} else {
console.log('username',username, isUserNameValid)
console.log('email',email, isEmailValid)
console.log('password',password, isPasswordValid)
loginButton.disabled = true
loginButton.style.cursor = 'default'
if(isUserNameValid === false) {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if(isEmailValid === false) {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if(isPasswordValid === false) {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if(isUserNameValid === true) {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if(isEmailValid === true) {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if(isPasswordValid === true) {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
}
FIDDLE LINK: https://jsfiddle.net/weg9jy0c/5/
这对你有用吗?
https://jsfiddle.net/gnca42xp/1/
const form = document.querySelector('.main-form')
form.addEventListener('keyup', (e) => {
const loginButton = document.querySelector('.login-btn')
const username = document.querySelector('#name').value
const email = document.querySelector('#email').value
const password = document.querySelector('#password').value
let isUserNameValid = false;
let isEmailValid = false;
let isPasswordValid = false;
currentUpdateField = e.target.getAttribute('id');
if (username.length > 5) {
isUserNameValid = true
}
if (email.length > 10) {
isEmailValid = true
}
if (password.length > 10) {
isPasswordValid = true
}
if (isUserNameValid === true && isEmailValid === true && isPasswordValid === true) {
e.target.classList.remove('invalid')
loginButton.disabled = false
loginButton.style.cursor = 'pointer'
} else {
console.log('username', username, isUserNameValid)
console.log('email', email, isEmailValid)
console.log('password', password, isPasswordValid)
loginButton.disabled = true
loginButton.style.cursor = 'default'
if (isUserNameValid === false && currentUpdateField === 'name') {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if (isEmailValid === false && currentUpdateField === 'email') {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if (isPasswordValid === false && currentUpdateField === 'password') {
e.target.classList.add('invalid')
e.target.classList.remove('valid')
}
if (isUserNameValid === true && currentUpdateField === 'name') {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if (isEmailValid === true && currentUpdateField === 'email') {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
if (isPasswordValid === true && currentUpdateField === 'password') {
e.target.classList.add('valid')
e.target.classList.remove('invalid')
}
}
})
.input {
outline: none;
}
.valid {
border: 1px solid rgb(89, 224, 89);
}
input+p {
opacity: 0;
}
.invalid {
border: 2px solid rgb(245, 101, 101);
}
input.invalid+p {
opacity: 1;
color: orange;
}
<html>
<title>Demo Form</title>
<body>
<form class="main-form" method="post">
<input class="input" type="text" name="username" id="name" placeholder="Username">
<p>Username must have more than 5 characters</p>
<input class="input" type="email" name="email" id="email" placeholder="Email">
<p>Email must of format <b>email@site.domain</b></p>
<input class="input" type="password" name="password" id="password" placeholder="Password">
<p>Password must have more than 5 characters and aplhanumeric with a special character</p><br>
<button type="submit" class="login-btn" disabled>Register</button>
</form>
</body>
</html>
你的情况会怎样
1) 第一次用户输入用户名5个字符后有效
2) 然后用户在电子邮件字段中输入数据,这里 e.target
是电子邮件字段,但从您的代码来看,isUsernameInvalid 定义为 false,并将 class 添加到电子邮件字段 e.target
。
这就是您的代码无法正常工作的原因
所以我所做的是,
我在当前更新字段上得到 id
,然后仅当 ID 匹配时才添加或删除 classes