Как обновить DOM с помощью метода выборки JavaScript для фильтрации пользовательских данных из API?

Я хочу получить данные из API и отобразить их на странице HTML с помощью функции выборки JavaScript. Коды JavaScript подробно описаны ниже. Я могу прочитать console.info пользовательских данных из API. Однако на HTML-странице ничего не отображается должным образом.


    <script>
      fetch('https://dummyjson.com/user')
        .then(response => response.json())
        .then(data => console.info(data));
    </script>

Я не могу понять, чего не хватает.

Я добавил функцию цикла для получения и фильтрации данных API и вставки результата в тег HTML, как описано ниже:

    <script>
      fetch('https://dummyjson.com/user')
        .then(result => {
          return result.json();
        })
        .then(data => console.info(data))
        .then(data => {
          data.forEach(user => {
            const show = `<p>${user.firstName}</p>`;
            let html = document.querySelector('item');
            html.insertAdjacentHTML('after begin', show);
          });
        });
    </script>

Ожидаемым результатом должны были быть имена (firstName) всех пользователей.

Когда код выполняется, выходные данные не отображают ожидаемый результат на странице HTML. Журнал консоли не показывает никаких ошибок. Просто пустая страница.

Полный код ниже:


<!DOCTYPE html>
<html lang = "en">
  <head>
    <meta charset = "UTF-8" />
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
    <style>
          body {
        background: transparent;
        color: #2c0493;
        padding: 44px;
        margin: 0;
        height: 100vh;
        align-items: center;
        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
          Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
      }

      h3,
      h2 {
        margin: 0;
      }
    </style>
  </head>
  <body>
    <h2 id = "header">GET Data from API</h2>
    <h3>And display in HTML with JavaScript</h3>
    <hr />
    <div id = "item"></div>
    <script>
      fetch('https://dummyjson.com/user')
        .then(result => {
          return result.json()
        })
        .then(data => console.info(data))
        .then(data => {
          data.forEach(user => {
            const show = `<p>${user.firstName}</p>`
            let html = document.querySelector('item')
            html.insertAdjacentHTML('afterbegin', show)
          });
        });
    </script>
  </body>
</html>

Больше скриншотов здесь:

Ожидаемый результат:

Кажется, никто не указал, что это не html.insertAdjacentHTML('after begin', show); это html.insertAdjacentHTML('afterbegin', show);

Jaromanda X 07.09.2024 06:03

@JaromandaX - Да, спасибо, что указали на это. Изначально я использовал «после начала» с пробелом. Однако я заметил и исправил это, пытаясь проверить и отладить свой код. Я обновил код со всеми рекомендациями. За два месяца я многому научился. Высоко оценен.

Mr CEO 07.09.2024 08:04
Поведение ключевого слова "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
2
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Согласно документации querySelector():

Метод querySelector() документа возвращает первый элемент внутри документ, соответствующий указанному селектору CSS или группе CSS селекторы. Если совпадений не найдено, возвращается ноль. Цитата

https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector

Вы можете использовать getElementById() для достижения желаемого результата с помощью чего-то вроде

let html = document.getElementById("item");
html.innerHTML = "<p>whatever you want<p>"

https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById

Помимо четырех других ошибок в коде ОП, которые вы не устранили, ваш код будет отображать только последний элемент цикла forEach.

Jaromanda X 07.09.2024 06:05

@PekosoG - Да, getElementById предпочтительнее.

Mr CEO 07.09.2024 08:26

Вы выполняете array foreach, но не в правильном массиве.

должно быть что-то вроде:

fetch('https://dummyjson.com/user')
  .then(result => {
    return result.json()
  })
  .then(data => console.info(data))
  .then(data => {
    data.users.forEach(user => {
      const show = `<p>${user.firstName}</p>`
      let html = document.querySelector('item')
      html.insertAdjacentHTML('afterbegin', show)
    });
  });

Вы не смогли решить как минимум три другие проблемы в коде ОП... главная из них - каким будет результат .then(data => console.info(data)) :p

Jaromanda X 07.09.2024 06:06
Ответ принят как подходящий

Во-первых, давайте решим проблемы в вашем коде.

  1. .then(data => console.info(data)) означает, что следующий .then получает undefined в качестве аргумента
  2. data — это не массив, это массив data.users
  3. при получении id в .querySelector, поскольку это синтаксис CSS, вам нужен # в селекторе, например #item
  4. в .insertAdjacentHTML первый аргумент - один из beforebegin|afterbegin|beforeend|afterend ... в этом значении нет пробела

Следует отметить одну вещь: поскольку вы используете .afterbegin, список будет отображаться в порядке, обратном полученным вами данным — возможно, это и было вашим намерением, если нет, вы бы использовали beforeend в .insertAdjacentHTML

Исправляем ваш код, чтобы он работал:

fetch('https://dummyjson.com/user')
  .then(result => result.json())
  .then(data => {
    console.info(data);
    return data;
  }) // 1. keep the data flowing in the chain
  .then(data => {
    data.users.forEach(user => { // 2. data.users is the array you are after
      const show = `<p>${user.firstName}</p>`;
      let html = document.querySelector('#item'); // 3. note the `#`
      html.insertAdjacentHTML('afterbegin', show); // 4. no space in afterbegin
      // note, this will display users in reverse order w.r.t. data.users
    });
  })
<p id = "item"></p>

Давайте сделаем современную версию, обратите внимание, что функция async не понадобится в <script type = "module">, поскольку это позволяет ожидать верхнего уровня.

async function getData() {
  const target = document.querySelector('#item');
  const result = await fetch('https://dummyjson.com/user');
  const data = await result.json();
  console.info(data);
  // remove the this     .reverse() below if you didn't mean to reverse the order
  const html = data.users.reverse().map(({firstName}) =>`<p>${firstName}</p>`).join("");
  target.insertAdjacentHTML('afterbegin', html);
}
getData();
<p id = "item"></p>

Код обновлен. Теперь работает отлично, как и ожидалось. Я изменил querySelector на: getElementsById. Я вижу случай: в этом случае нужно выбрать один элемент. Также буду читать о функции Async.

Mr CEO 07.09.2024 08:21

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