Получить все данные из api и вставить в HTML

#javascript #html #arrays #api #dom

#javascript #HTML #массивы #API #dom

Вопрос:

У меня есть 7 карточек в моем HTML-формате с изображением, заголовком, описанием и столбцом источника. Я пытаюсь получить данные из gnews api, а затем заполнить свои карточки данными, которые я получаю из api. Я бы хотел, чтобы данные из api заменили мои тексты-заполнители и изображения. Но я могу только поменять местами детали в первой карточке в моем HTML.

JSON из API выглядит следующим образом:

 "articles": [
        {
            "title": "xxx xxx",
            "description": "xxx xxx xxx",
            "content": "xxx xxx xxx xxx... [1514 chars]",
            "url": "xxx xxx",
            "image": "xxx.jpg",
            "publishedAt": "xxx",
            "source": {
                "name": "xxx",
                "url": "xxx.com/"
            }
        }
    ]
 

Я попробовал forEach, но он получил только первую карту

    const title = document.querySelectorAll(".title"),
   image = document.querySelector(".image"),
   source = document.querySelector(".source"),
   url = document.querySelector(".url"); 
   
   .........
   .then(function(data){
   data.articles.forEach(article => {
            title.innerHTML = article.title;
            image.style.backgroundImage = article.image;
           source.innerHTML = article.source.name;
           url.setAttribute('href', article.url);
            url.setAttribute('target', '_blank');
          });
}


// And also i tried to target every card individually which worked but that means i would have
// to target all 7 html cards that i have which would be quite cumbersome and repetitive to write.
// Below is the code for the individual targetting..

           news.title = data.articles[0].title;
           news.image = data.articles[0].image;
           news.source = data.articles[0].source.name;
           news.url = data.articles[0].url;
           news.description = data.articles[0].description;

 

Как я могу написать код, чтобы иметь возможность получать данные из всех статей в формате JSON и одновременно заполнять все остальные карточки разными новостями??

Ответ №1:

Привет и добро пожаловать в сообщество.

Похоже, вам еще предстоит проделать большую работу. Ну, вы должны сначала продумать это: вам нужно перебрать все карты и все компоненты, чего вы не делаете.

Это означало бы что-то вроде:

    .then(function(data){
   data.articles.forEach(article => {
            title.innerHTML = article.title;
            image.style.backgroundImage = article.image;
           source.innerHTML = article.source.name;
           url.setAttribute('href', article.url);
            url.setAttribute('target', '_blank');
          //some code to skip to another card
          });
 

Имейте в виду, что

    const title = document.querySelectorAll(".title"),
   image = document.querySelector(".image"),
   source = document.querySelector(".source"),
   url = document.querySelector(".url"); 
 

все они извлекают массивы элементов, поскольку у вас их семь, верно?
В вашем коде вы продолжаете указывать на изображение, источник заголовка и URL-адрес без указания индекса. Если это так, вы постоянно обновляете первый.

Попробуйте сделать это:

    .then(function(data){
   let x=0;
   data.articles.forEach(article => {
            title[x].innerHTML = article.title;
            image[x].style.backgroundImage = article.image;
           source[x].innerHTML = article.source.name;
           url[x].setAttribute('href', article.url);
            url[x].setAttribute('target', '_blank');
          x  
          });
 

Однако это не идеальное решение.

Взгляните на эту страницу и внимательно прочитайте ее. Потратьте на это немного времени — я сделал это! Если вы все еще не поняли, дайте мне знать!

Комментарии:

1. спасибо за ответ. К счастью, карты теперь обновляются, но в консоли есть ошибка. Uncaught (in promise) TypeError: Cannot set property 'innerHTML' of undefined at news.js:26 at Array.forEach (<anonymous>) at news.js:20 Я записал в консоль описание, которое я объявил в const, и оно показало, что оно получает данные с 6 из 7 карт, но для последней карты показано undefined … Пожалуйста, обратите внимание , что все 7 карт имеют тег p с классом описания. Как вы думаете, в чем может быть проблема?

2. извините за задержку … вы проверили, что stuff[x] не равен null? Когда я говорю stuff [x], это может быть заголовок [x], изображение [x] или любой другой элемент, который вы пытаетесь изменить.