setAttribute с циклом

#javascript #html #for-loop #setattribute

#javascript #HTML #для цикла #setattribute

Вопрос:

Я пытаюсь установить атрибут src для нескольких изображений с помощью цикла. У меня есть 8 изображений, и я хотел бы вставить эти 8 изображений в свой html. Я использую цикл for of для массива, который поступает из файлов JSON. Мой JSON, кажется, в порядке, потому что я могу утешать.регистрируйте правильные значения источника атрибута. Значения выглядят следующим образом: «images/img1.png». img1 становится img2… Проблема в том, что он помещает images/img8.png для всех изображений в консоль и только одно изображение в html.

Я попытался поместить querySelectorAll(‘.image’), но он говорит TypeError: img.setAttribute is not a function .

Я попытался вставить еще один цикл в цикл for of, но это создает бесконечный цикл, по-прежнему с изображениями/img8.png.

Вот мой код :

   .then(response => response.json())
    .then(data => {
      let img = document.querySelectorAll('.image') 
      for (const item of data) {
        img.setAttribute('src', item.source)
        console.log(img)
      }
    }).catch(err => console.error("Une erreur est survenue", err))
 

Вот мой массив

 [
  {
    "image_name": "Image1",
    "image_id": "1",
    "source": "images/img1.png"
  },
  {
    "image_name": "Image2",
    "image_id": "2",
    "source": "images/img2.png"
  },
  {
    "image_name": "Image3",
    "image_id": "3",
    "source": "images/img3.png"
  },
  {
    "image_name": "Image4",
    "image_id": "4",
    "source": "images/img4.png"
  },
  {
    "image_name": "Image5",
    "image_id": "5",
    "source": "images/img5.png"
  },
  {
    "image_name": "Image6",
    "image_id": "6",
    "source": "images/img6.png"
  },
  {
    "image_name": "Image7",
    "image_id": "7",
    "source": "images/img7.png"
  },
  {
    "image_name": "Image8",
    "image_id": "8",
    "source": "images/img8.png"
  }
]
 

У вас есть идея, где ошибка?
Спасибо.

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

1. document.querySelectorAll('.image') возвращает список элементов. Вероятно, вам следует сделать это по индексу.

2. Было бы ОЧЕНЬ полезно увидеть пример данных

Ответ №1:

Попробуйте это

 const images = document.querySelectorAll('.image'); // a collection 

....
.then(response => response.json())
.then(data => data.forEach(({source,image_name},i) => {
    images[i].src = source;
    images[i].alt = image_name;
  })
).catch(err => console.error("Une erreur est survenue", err))
 

https://jsfiddle.net/mplungjan/sehx2bc4/

если у изображений есть идентификаторы, соответствующие image_id, вы можете использовать их вместо collection и [i]

 .then(response => response.json())
.then(data => data.forEach(({source,image_name, image_id}) => {
    const image = document.getElementById(image_id);
    image.src = source;
    image.alt = image_name;
  })
).catch(err => console.error("Une erreur est survenue", err))
 

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

1. Я поместил свой массив. Извини, что не сделал этого раньше. Итак, ваш код не работает, потому что у меня нет того же массива, который вы ввели в const data . Как вы думаете, я должен изменить свой массив или есть другой способ сделать с моим стилем массива?

Ответ №2:

querySelectorAll возвращает список, подобный массиву. Предположительно, вам нужно повторить этот список вместе с вашим списком изображений

 .then(response => response.json())
.then(data => {
  let img = document.querySelectorAll('.image') 
  for (var i =0;i<data.length;i  ) {
    img[i].setAttribute('src', item[i].source)
  }
}).catch(err => console.error("Une erreur est survenue", err))