В моем коде ничего не происходит, хотя это может быть правильно

Я понятия не имею, что мне добавить или изменить в моем коде. Считается, что эта программа выводит «правильно», когда вы отправляете текст в текущем году «2023», но я не получаю никаких ошибок или чего-либо еще. Это просто не работает. P.S выводит "неправильно", даже если это правда

const date = new Date();
const input = document.querySelector('.js-input').value;
const button = document.querySelector('.js-button');
const body = document.querySelector('body');

button.addEventListener('click', yearfunc);

function yearfunc(event) {
  if (input == date.getFullYear()) {
    const div = document.createElement('div');
    button.insertAdjacentElement('afterend', div);
    div.innerText = 'Correct';
  } else {
    const div = document.createElement('div');
    button.insertAdjacentElement('afterend', div);
    div.innerText = 'Incorrect';
  }
  event.preventDefault();
}
<p>What the year is it right now?</p><br><br>
<input type = "text" class = "js-input">
<button class = "js-button">Send</button>

Попробуйте получить значение .js-input из обработчика событий.

robertklep 13.02.2023 18:54

Также обратите внимание: если вы хотите всегда отменять событие в функции, делайте это в самом начале функции, чтобы даже ошибки в функции все равно отменяли событие. Это в основном полезно при проверке отправки формы или AJAX. В ВАШЕМ случае, если кнопки не в форме не нужно предотвращать дефолт в функции. Однако, чтобы быть в безопасности на случай, если вы позже завернете их в форму, всегда делайте кнопки, которые не нужны для отправки type = "button"

mplungjan 18.02.2023 07:50
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему &apos;[] instanceof Object&apos; возвращает &quot;true&quot;?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
1
2
81
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Разница в том, что вы присвоили '.value' слишком рано в коде. Присвоение его непосредственно в функции и сравнение с использованием новой переменной решает проблему, попробуйте это:

const date = new Date();
const input = document.querySelector(".js-input");
const button = document.querySelector(".js-button");

button.addEventListener("click", yearfunc);

function yearfunc(event) {
  const value = input.value;
  console.info(`VALUE: `, value);
  console.info(`YEAR: `, date.getFullYear());
  if (value == date.getFullYear()) {
    const div = document.createElement("div");
    button.insertAdjacentElement("afterend", div);
    div.innerText = "Correct";
  } else {
    const div = document.createElement("div");
    button.insertAdjacentElement("afterend", div);
    div.innerText = "Incorrect";
  }

  event.preventDefault();
}
<p>What year is it right now?</p>
<br /><br />
<input type = "number" class = "js-input" />
<button class = "js-button">Send</button>

<script src = "javascript.js"></script>

Вы получаете ввод вне события, поэтому, когда событие действительно происходит, вы просто сравниваете предварительно загруженное значение "". Решение состоит в том, чтобы получить входные данные внутри обработчика событий:

// JavaScript code
const button = document.querySelector('.js-button');
const body = document.querySelector('body');
button.addEventListener('click', yearfunc);

function yearfunc(event) {
  const date = new Date();
  const input = document.querySelector('.js-input').value; 
    if (input == date.getFullYear()) {
        const div = document.createElement('div');
        button.insertAdjacentElement('afterend', div);
        div.innerText = 'Correct';
    }

    else {
        const div = document.createElement('div');
        button.insertAdjacentElement('afterend', div);
        div.innerText = 'Incorrect';
    }

    event.preventDefault();
}
  1. Если вы определяете CONST, вы не хотите, чтобы значение менялось (поскольку его нельзя переназначить). Ваш код не работал, потому что вы прочитали входное значение один раз. В вашей функции вы обработали входную переменную, которая вернула фиксированное первое значение, прочитанное селектором вне функции. Таким образом, функция НИКОГДА не получит текущее значение. Таким образом, чтобы исправить это, вы должны:
  2. Поместите входной запрос в yearfunc

Руан Мендес был прав. Спасибо за подсказку. Этот ответ должен быть лучше. Это расширенная версия с объяснением ;-)

Рабочий пример:

<!DOCTYPE html>
<html lang = "en">
<head>
    <title></title>
    <meta charset = "UTF-8">
    <meta name = "description" content = "">
</head>

<body>
    <p>What the year is it right now?</p><br><br>
    <input type = "text" class = "js-input">
    <button class = "js-button">Send</button>

    <script>
        const date = new Date();
        const button = document.querySelector('.js-button');
        const body = document.querySelector('body');

        button.addEventListener('click', yearfunc);

        function yearfunc(event) {
            // input = document.querySelector('.js-input').value // global variable, if "let" or "var" not used. this variable can be accessed outside of the function
            var input = document.querySelector('.js-input').value // using var makes variable only accessible inside of function
            if (input == date.getFullYear()) {
                const div = document.createElement('div');
                button.insertAdjacentElement('afterend', div);
                div.innerText = 'Correct';
            }

            else {
                const div = document.createElement('div');
                button.insertAdjacentElement('afterend', div);
                div.innerText = 'Incorrect';
            }

            event.preventDefault();
        }
    </script> 
</body>
</html>

Большое спасибо, но у меня есть еще один вопрос. Почему вы не добавили «let» или «var» после ввода? Что это значит?

AlexanderRise 13.02.2023 19:11

Это потому, что это плохой ответ, который устраняет несвязанные проблемы и не объясняет, в чем проблема, и, кроме того, создает глобальную переменную, которая не будет работать в строгом режиме. Голосование против...

Ruan Mendes 13.02.2023 19:16

Это решение создает входное значение в yearfunc. Поскольку вы технически не меняете его, опции «const», «let», «var» не имеют значения. Обновлено: также имеет значение, если вы оставили переменную «ввод» вне функции, один шаг, который вам нужно сделать, это обновить переменную «ввод» при нажатии кнопки. Поэтому необходимо использовать «let» или «var».

Amanda 13.02.2023 19:20

Этот код должен работать. То, как значение бралось из класса js-input, не давало правильного входного значения.

const date = new Date();
const input1 = document.getElementsByClassName("js-input");
const button = document.querySelector('.js-button');
const body = document.querySelector('body');

button.addEventListener('click', yearfunc);

function yearfunc(event) {
  console.info("in the function")
  console.info(input1[0].value)
  console.info(date.getFullYear())
    if (input1[0].value == String(date.getFullYear())) {
        const div = document.createElement('div');
        button.insertAdjacentElement('afterend', div);
        div.innerText = 'Correct';
    }

    else {
        const div = document.createElement('div');
        button.insertAdjacentElement('afterend', div);
        div.innerText = 'Incorrect';
    }

  event.preventDefault();
}

Другие вопросы по теме