@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/
  • Вопрос задан
  • 1112 просмотров
Решения вопроса 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()) никогда срабатывать не будут, так как по сути нифига не проверяют.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы