Лучший способ справиться с этим - делегировать событие: зацепить click
на ul
, а затем использовать e.target
, чтобы обратиться к конкретному img
, по которому щелкнули.Сохраните любую информацию, которая вам нужна для этого элемента:
<ul id="list">
<li class="card" id="c0"><img data-card="i0" data-index="0" src="images\westren_wall.jpg"></li>
<li class="card" id="c1"><img data-card="i1" data-index="0" src="images\westren_wall.jpg"></li>
<li class="card" id="c2"><img data-card="i2" data-index="1" src="images\idf.jpg"></li>
<!-- ... -->
</ul>
Тогда только один обработчик:
document.getElementById("list").addEventListener("click", function(e) {
openCard(e.target.getAttribute("data-card"), +e.target.getAttribute("data-index"));
});
Или, если вы предпочитаете .onclick
(но нет причин, если вам не нужна поддержкадействительно устаревшие браузеры, такие как IE8):
document.getElementById("list").onclick = function(e) {
openCard(e.target.getAttribute("data-card"), +e.target.getAttribute("data-index"));
};
Live Пример:
document.getElementById("list").addEventListener("click", function(e) {
openCard(e.target.getAttribute("data-card"), +e.target.getAttribute("data-index"));
});
function openCard(card, index) {
console.log("card = " + card + ", index = " + index);
}
<ul id="list">
<li class="card" id="c0"><img data-card="i0" data-index="0" src="images\westren_wall.jpg"></li>
<li class="card" id="c1"><img data-card="i1" data-index="0" src="images\westren_wall.jpg"></li>
<li class="card" id="c2"><img data-card="i2" data-index="1" src="images\idf.jpg"></li>
<!-- ... -->
</ul>
На самом деле, если взглянуть на разметку еще раз, вам вообще не понадобится data-card
;это родительский элемент img
, поэтому:
<ul id="list">
<li class="card"><img data-index="0" src="images\westren_wall.jpg"></li>
<li class="card"><img data-index="0" src="images\westren_wall.jpg"></li>
<li class="card"><img data-index="1" src="images\idf.jpg"></li>
<!-- ... -->
</ul>
и
document.getElementById("list").addEventListener("click", function(e) {
openCard(e.target.parentNode, +e.target.getAttribute("data-index"));
});
... где вы измените openCard
, поэтому он ожидает сам элемент, а неid
.
Живой пример:
document.getElementById("list").addEventListener("click", function(e) {
openCard(e.target.parentNode, +e.target.getAttribute("data-index"));
});
function openCard(element, index) {
// use `element` and `index` here, the following code is just for the demo:
element.appendChild(document.createTextNode(" opened, index = " + index));
}
<ul id="list">
<li class="card"><img data-card="i0" data-index="0" src="images\westren_wall.jpg"></li>
<li class="card"><img data-card="i1" data-index="0" src="images\westren_wall.jpg"></li>
<li class="card"><img data-card="i2" data-index="1" src="images\idf.jpg"></li>
<!-- ... -->
</ul>