Элементы не отображаются в массиве после нажатия

Я хочу добавить книги в библиотеку. После ввода информации для ввода и отправки массив книг остается пустым. Я выложу фотографии, чтобы вы могли лучше понять. Также извините за грязный код. Я уберу после того, как заставлю его работать. console.info после добавления книги

const books = [];

const submitBook = () => {
  const bookName = document.querySelector('#title').value;
  const bookAuthor = document.querySelector('#author').value;
  const bookYear = document.querySelector('#year').value;

  // let book = new Book(bookName.value, bookAuthor.value, bookYear.value);

  books.push({
    'name':bookName,
    'author':bookAuthor,
    'year':bookYear
  });

  alert("Book added.");
}
<label for = "title">Title:</label><br>
<input type = "text" id = "title" name = "title" required><br>
<label for = "author">Author:</label><br>
<input type = "text" id = "author" name = "author" required><br>
<label for = "year">Year:</label><br>
<input type = "number" id = "year" name = "year" required><br>
<button onclick = "submitBook()">Add book</button>

Но ваш код работает! Просто попробуйте заменить alert("Book added.") на console.info(books), и вы увидите, что массив добавляется.

Michael Beeson 13.12.2020 11:25

Код в вашем вопросе не воспроизводит описанную вами проблему. Пожалуйста, измените его соответствующим образом. Также причина скорее всего в этом: stackoverflow.com/questions/23667086/… (или ваша переменная локальна для функции и вы пытаетесь логировать ее снаружи)

user5734311 13.12.2020 11:25

@MichaelBeeson Вы правы, на самом деле в коде нет ничего плохого. Просто когда я нажимаю кнопку отправки, в консоли появляется что-то и сразу же исчезает, а массив остается пустым. Он сбрасывает массив книг каждый раз, когда я отправляю книгу. У меня есть пример страницы, с которой я записываю код. Наши коды в основном идентичны, и другие страницы работают нормально, вся информация остается в массиве. Это странно

Henri 13.12.2020 11:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
512
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваш код, кажется, работает. Я взял на себя смелость несколько упростить вам код. Как правило, не очень хорошая идея использовать встроенную обработку событий (onclick=... внутри html), поэтому обработчик перемещен в раздел кода. Также добавлена ​​кнопка для отображения добавленных книг.

let books = [];
let to = null;
const clearAfter = (delay = 2) => setTimeout(() => console.clear(), delay * 1000);
const format = obj => JSON.stringify(obj).split("},{").join("},\n{");
const submitBook = () => {
  let book = {};
  document.querySelectorAll("input")
    .forEach(inp => book[inp.name] = inp.value);
  books.push(book);
  console.clear();
  // console.info here to see the result immediately,
  // otherwise there may not be any result yet
  console.info(`Added:\n${format(book)}`);
}

document.addEventListener("click", evt => {
  if (evt.target.id === "addbook") {
    submitBook();
  } else if (evt.target.id === "showbooks") {
    console.clear();
    console.info(`${books.length || "No"} added books\n${
      books.length < 1 ? "-" : format(books)}`);
  }
  // remove the log (to make buttons visible again in the SO-run window)
  clearTimeout(to);
  to = clearAfter();
});
<label for = "title">Title:</label><br>
<input type = "text" id = "title" name = "title" required><br>
<label for = "author">Author:</label><br>
<input type = "text" id = "author" name = "author" required><br>
<label for = "year">Year:</label><br>
<input type = "number" id = "year" name = "year" required><br>
<p>
  <button id = "addbook">Add book</button>
  <button id = "showbooks">Show books added</button>
</p>

Почему бы вам просто не добавитьEventListener к элементу с идентификатором addbook вместо того, чтобы прослушивать весь документ, а затем каждый раз проверять оператор if? Document.getElementById(‘addbook’).addEventListener(‘click’, submitBook)

KienHT 13.12.2020 11:45

Это называется делегирование события, и оно более универсально, если вам нужно больше обработчиков.

KooiInc 13.12.2020 11:48

Ладно, чувак, ты крут. Благодарю вас за ваше усилие. Почему вы поместили кнопки в <p>? Ваше здоровье

Henri 13.12.2020 12:07

Рад, что смог помочь ). <p> для некоторого дополнительного пробела (чтобы кнопки не приклеивались к последнему полю ввода).

KooiInc 13.12.2020 12:32

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