0

Я хотел сделать modal zoom для нескольких изображении но у меня не работает getElementsByClassName. но если брать каждого отдельно то скрипт работает(через getElementById). Буду очень благодарен за помощь.

var modal = document.getElementById('myModal');
var elem = document.getElementsByClassName('myIm');
var modalImg = document.getElementById("img01");
var captionText = document.getElementById("caption");
elem.onclick = function(){
    modal.style.display = "block";
    modalImg.src = this.src;
    modalImg.alt = this.alt;
    captionText.innerHTML = this.alt;
}

var span = document.getElementsByClassName("close")[0]; span.onclick = function() { modal.style.display = "none"; }

<img class="myIm" src="d1.jpg" alt="Northern Lights, Norway" width="300" height="200">
<img class="myIm" src="d2.jpg" alt="Northern Lights, Norway" width="300" height="200">
<img class="myIm" src="d3.jpg" alt="Northern Lights, Norway" width="300" height="200">

<div id="myModal" class="modal">
<span class="close">X</span>
<img class="modal-content" id="img01">
<div id="caption"></div>
</div>
mymedia
  • 8,602
Mr.Iron
  • 55

1 Answers1

2

getElementsByClassName возвращает массив, поэтому elem.onclick работать не будет. Нужно назначать обработчик отдельно для каждого элемента, можно просто циклом:

for (var i = 0; i < elem.length; i++) elem[i].onclick = ...

а можно, например, так:

elem.forEach((div) => { div.onclick = ... });
Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
Юрий
  • 834
  • 3
    getElementsByClassName возвращает HTMLCollection, у которой нет метода forEach, поэтому итерировать нужно так: [].forEach.call(items, (div) => { div.onclick = ... }); – Алексей Уколов May 05 '16 at 01:51
  • @АлексейУколов, данный метод есть не везде, например в хроме он присутствует – Grundy Mar 10 '17 at 19:07