Я бы предложил:
// retrieving the common ancestor element of the <img> elements:
let sideImage = document.querySelector('#side-img'),
// defining a named function, using arrow syntax; 'e' is a reference
// to the event object, passed automatically from the
// EventTarget.addEventListener() method:
imageChange = (e) => {
// we retrieve the element with the 'id' of 'main', and update
// its src property to be that of the clicked element;
// e.target retrieves the element upon which the event was
// originally triggered:
document.getElementById('main').src = e.target.src;
};
sideImage.addEventListener('click', imageChange);
let sideImage = document.querySelector('#side-img'),
imageChange = (e) => {
document.getElementById('main').src = e.target.src;
};
sideImage.addEventListener('click', imageChange);
<div id="container">
<div id="side-img">
<img id="side1" src="https://via.placeholder.com/100.png?text=image1">
<img id="side2" src="https://via.placeholder.com/100.png?text=image2">
<img id="side3" src="https://via.placeholder.com/100.png?text=image3">
<img id="side4" src="https://via.placeholder.com/100.png?text=image4">
</div>
<div id="main-img">
<img id="main" src="img0.jpeg">
</div>
</div>
JS Fiddle demo .
Применительно к вопросу, оставленному в комментариях, ОП:
Не могли бы вы объяснить, как контейнер #side-img
просматривал каждое изображение и добавлял к ним прослушиватель событий?
Конечно, в этом случае мы использовали event-Делегирование использует преимущества того, как события протекают через DOM.
Вместо того, чтобы связывать прослушиватель событий с несколькими <img>
элементами, мы воспользовались тем, как события протекают через DOM;это означает, что мы прослушали событие click
по мере его достижения #side-img
и взглянули на свойство target
объекта Event
, чтобы найти элемент, для которого событие было инициировано изначально.
Ссылки: