@n199a
Java

Почему не срабатывает событие onchange?

Имеется валидация полей (input) с помощью JS. Имеется несколько полей для заполнения и кнопка "Submit". В JS прописано при загрузке страници устанавливать сразу для кнопки "Submit" псевдокласс :disabled. На каждом поле стоит событие onfocus, которое в режиме реального времени проверяет валидность введенных в поле данных и событие onchange, которое и проверяет, если все данные, введенные во все поля input (если все функции проверки возвращают true), то, по логике, к кнопке "Submit" должен примениться псевдокласс :disabled, но этого не происходит. Почему?

Форма для ввода:
<!-- ПОЛЯ ДЛЯ ВВОДА -->
<input type="text" id="freight" name="volume" value="${freight}" placeholder="<fmt:message key="offer.freight"/>" onfocus="validateFreight()" onchange="validateConfirm()" required>

<input type="text" id="volume" name="volume" value="${volume}" placeholder="<fmt:message key="offer.volume"/>" onfocus="validateVolume()" onchange="validateConfirm()" required>

<!-- КНОПКА -->
<button type="submit" id="confirm" class="btn-confirm" href="${pageContext.request.contextPath}/controller?command=go_to_create_offer_page">
    <fmt:message key="cargo.button.createOffer"/>
</button>


Проверка с помощью JS:
const regexpVolume = /^\p{Nd}{1,10}(?:\.\p{Nd}{0,2})?$/u;
const regexpFreight = /^\p{Nd}{1,20}(?:\.\p{Nd}{0,2})?$/u;

window.onload = function () {
    const confirmButton = document.getElementById("confirm");
    confirmButton.disabled = true;
}

function validateVolume() {
    const volume = document.getElementById("volume");
    const descriptionVolume = document.getElementById("description_volume");

    volume.oninput = function() {
        if (regexpVolume.test(volume.value)) {
            descriptionVolume.style.color = "#50C878";
            return true;
        } else {
            descriptionVolume.style.color = "#F00";
            return false;
        }
    }
}

function validateFreight() {
    const freight = document.getElementById("freight");
    const descriptionFreight = document.getElementById("description_freight");

    freight.oninput = function() {
        if (regexpFreight.test(freight.value)) {
            descriptionFreight.style.color = "#50C878";
            return true;
        } else {
            descriptionFreight.style.color = "#F00";
            return false;
        }
    }
}

function validateConfirm() {
    const confirmButton = document.getElementById("confirm");
    
    if(validateVolume() && validateFreight()) {
        confirmButton.disabled = false;
    }
}


https://jsfiddle.net/tLdg6kwp/
  • Вопрос задан
  • 973 просмотра
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
Короче, код конечно... давайте по пунктам, так проще будет.
1) onfocus="validateFreight()" onchange="validateConfirm()" - так делать не надо. Делаете биндинг события по загрузке документа, это аккуратнее и прозрачнее.
2) function validateFreight() и validateVolume() внутри себя каждый раз при вызове создают 2 константы, которые опять же можно было определить вне этой функции и один раз определять по загрузке документа, и так же каждый раз вешает биндинг на событие freight.oninput, НО НЕ ВЫЗЫВАЕТ НИКАКИХ ПРОВЕРОК в момент вызова, соответственно if(validateVolume() && validateFreight()) никогда срабатывать не будут, так как по сути нифига не проверяют.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 10:01
500 руб./за проект
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час