#javascript
Вопрос:
Я хочу удалить отключенный атрибут с кнопки, когда каждое поле заполнено. Мой код работает, когда заполнен один ввод. Что я здесь делаю не так?
Вот HTML и JS
checkInput()
function checkInput() {
let input = document.querySelectorAll('.form-control')
const button = document.querySelector('.submit-btn')
input.forEach(function (e) {
let disabled = true;
e.addEventListener('keyup', function () {
if (e.value !== '') {
disabled = false
} else {
disabled = true
return false
}
if(disabled) {
button.setAttribute('disabled', 'disabled')
} else {
button.removeAttribute('disabled')
}
})
})
}
<div class="form-group">
<label for="name">Name*</label>
<input class="form-control" type="text" id="name" placeholder="Name">
</div>
<div class="form-group">
<label for="lastName">lastName*</label>
<input class="form-control" type="text" id="lastName" placeholder="lastName">
</div>
<div class="form-group">
<label for="fiscalCode">fiscalCode*</label>
<input class="form-control" type="text" id="fiscalCode" placeholder="fiscalCode">
</div>
<button type="submit" disabled="disabled" class="submit-btn">Continue</button>
Ответ №1:
Это не работает, потому что вы хотите, чтобы все входные данные влияли на состояние кнопки, однако вы проверяете только одну переменную на добавление/удаление отключенного свойства.
Вот фрагмент рабочего кода с примером, в котором я создал массив свойств, по одному для каждого ввода, на которые я могу ссылаться в каждом событии запуска ключа
checkInput()
function checkInput() {
let input = document.querySelectorAll('.form-control')
const button = document.querySelector('.submit-btn')
const disabled = Array(input.length).fill(true);
input.forEach(function (e, index) {
e.addEventListener('input', function () {
disabled[index] = e.value === ''; // simplified if/else statement of yours
if(disabled.some(Boolean)) {
button.setAttribute('disabled', 'disabled')
} else {
button.removeAttribute('disabled')
}
})
})
}
<div class="form-group">
<label for="name">Name*</label>
<input class="form-control" type="text" id="name" placeholder="Name">
</div>
<div class="form-group">
<label for="lastName">lastName*</label>
<input class="form-control" type="text" id="lastName" placeholder="lastName">
</div>
<div class="form-group">
<label for="fiscalCode">fiscalCode*</label>
<input class="form-control" type="text" id="fiscalCode" placeholder="fiscalCode">
</div>
<button type="submit" disabled="disabled" class="submit-btn">Prosegui</button>
Кроме того, остановка выполнения функции при назначении disabled = true в первом операторе else также является неправильным подходом, так как вы, скорее всего, захотите назначить не только значение disable, но и свойство disabled кнопки.
РЕДАКТИРОВАТЬ: как упоминалось в комментарии CID, разумно изменить прослушиватель событий на ввод, чтобы мы также могли обрабатывать события копирования и вставки
Комментарии:
1. Я бы изменил прослушиватель событий с
keyup
наinput
, в случае, если пользователь щелкнет правой кнопкой мыши -> вставить2. Каков был бы правильный подход, если бы я добавил флажок?
3. просто создайте отдельную переменную, хранящую проверенное значение флажка, или добавьте проверку этого свойства в инструкцию изменения свойства кнопки
Ответ №2:
Вы добавляете событие keyup для каждого поля ввода. это событие проверяет текущее поле ввода только на то, пустое оно или нет. он сам не проверяет 3 поля ввода
это должно сработать:
checkInput()
function checkInput() {
let input = document.querySelectorAll('.form-control')
const button = document.querySelector('.submit-btn')
input.forEach(function (e) {
let disabled = true;
e.addEventListener('keyup', function () {
const emptyFields = Array.from(input).filter( input => input.value === "");
disabled = emptyFields.length > 0;
if(disabled) {
button.setAttribute('disabled', 'disabled')
} else {
button.removeAttribute('disabled')
}
})
})
}
Комментарии:
1. Каков был бы правильный подход, если бы я добавил флажок?
Ответ №3:
- Вы включаете кнопку «Отправить» в
keyup
случае любых 3 входов. Таким образом, он включается на любых 3 входах. - Удалите кнопку «
return
Включить отключенный поток для отключения» после очистки.
checkInput()
function checkInput() {
let input = document.querySelectorAll('.form-control')
const button = document.querySelector('.submit-btn')
input.forEach(function (e) {
let disabled = true;
e.addEventListener('keyup', function () {
if (e.value !== '') {
disabled = false
} else {
disabled = true
// return false <-- this makes function exit before your disable button
}
if(disabled) {
button.setAttribute('disabled', 'disabled')
} else {
button.removeAttribute('disabled')
}
})
})
}
<div class="form-group">
<label for="name">Name*</label>
<input class="form-control" type="text" id="name" placeholder="Name">
</div>
<div class="form-group">
<label for="lastName">lastName*</label>
<input class="form-control" type="text" id="lastName" placeholder="lastName">
</div>
<div class="form-group">
<label for="fiscalCode">fiscalCode*</label>
<input class="form-control" type="text" id="fiscalCode" placeholder="fiscalCode">
</div>
<button type="submit" disabled="disabled" class="submit-btn">Continue</button>
Комментарии:
1. завершит
return
обратный вызов прослушивателя событий, а не вызываемой функции с циклом2. @Cid да, он также хотел отключить, если пользователь очистит какой-либо конкретный выбор. Этот код включит кнопку только при вводе любого поля и не отключит ее снова, если пользователь очистит ее.
Ответ №4:
Другое решение состоит в том, чтобы проверить, заполнены ли все входные данные при каждом изменении любого ввода.
addHandlers();
// Return true if all fields are not empty
function areAllFieldsFilledOut() {
let inputs = document.querySelectorAll('.form-control');
let result = true;
inputs.forEach(e => {
if (e.value === "")
result = false;
});
return resu<
}
// Add keyup event handlers to all input fields
function addHandlers() {
let inputs = document.querySelectorAll('.form-control');
const button = document.querySelector('.submit-btn');
inputs.forEach(e => {
// On each change in any input, check if all inputs are
// not empty, and if true, enable the button
e.addEventListener('keyup', e => {
let result = areAllFieldsFilledOut();
if (result) {
button.removeAttribute('disabled');
} else {
button.setAttribute('disabled', 'disabled');
}
});
});
}
<div class="form-group">
<label for="name">Name*</label>
<input class="form-control" type="text" id="name" placeholder="Name">
</div>
<div class="form-group">
<label for="lastName">lastName*</label>
<input class="form-control" type="text" id="lastName" placeholder="lastName">
</div>
<div class="form-group">
<label for="fiscalCode">fiscalCode*</label>
<input class="form-control" type="text" id="fiscalCode" placeholder="fiscalCode">
</div>
<button type="submit" disabled="disabled" class="submit-btn">Prosegui</button>
Ответ №5:
Вот мой ответ:
function checkInput() {
document.querySelectorAll('input').forEach(input => {
input.addEventListener('keyup', function () {
let emptyFieldsCount = Array.from(input).filter(input => input.value == "").length;
if (emptyFieldsCount > 0) {
button.setAttribute('disabled', 'disabled')
} else {
button.removeAttribute('disabled')
}
})
});
}