У меня есть этот макет, который был создан динамически:
for (let i = 1; i < 10; i++) {
document.querySelector('.card-body').innerHTML += `<div class="row" id="img_div">
<div class="col-12 col-sm-12 col-md-2 text-center">
<img src="http://placehold.it/120x80" alt="prewiew" width="120" height="80">
</div>
<div id="text_div" class="col-12 text-sm-center col-sm-12 text-md-left col-md-6">
<h4 class="name"><a href="#" id="title` + i + `">Name</a></h4>
<h4>
<small>state</small>
</h4>
<h4>
<small>city</small>
</h4>
<h4>
<small>zip</small>
</h4>
</div>
<div class="col-12 col-sm-12 text-sm-center col-md-4 text-md-right row">
</div>
</div>
`
document.getElementById("title" + i).addEventListener('click', function() {
console.log(i)
});
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<div class="card-body">
<!-- person -->
</div>
И я хочу, чтобы на каждом событии щелкнуло мышью h4 class="name"
и показать журнал с соответствующим номером i
.
Тем не менее, console.log
показывает только последний i
связанный ( i=9
в этом случае), и не работает с другими i
числами. Почему это происходит? Что мне нужно сделать?
javascript
html
innerhtml
Луис Адорно
источник
источник
for
цикл вызвал метод для применения событий к этим элементам, но я не знаю. будет jsFiddle для тестирования..card-body
и проверил, является ли element (target
) привязкой с идентификатором, который начинается сtitle
.innerHTML += ...
убить ранее установленные прослушиватели событий, а не замыкание. Используйтеdocument.createElement
вместо этого. Посмотри эту темуОтветы:
innerHTML
перерисовывает полный html, в результате все ранее прикрепленные события теряются. использованиеinsertAdjacentHTML()
источник
insertAdjacentHTML
- Каждый день в школе, очень мило.document.getElementById
сразу после добавления HTML. Если вы добавляете сотни элементов, это очень трудоемкая работа.name
более эффективной, если использование класса и привязка события только к этому классу при прохождении через элемент (или, может быть, просто чтение из самого события)?document.createElement
можно использовать, я думаю, что в целом это лучший базовый подход. Еще одно возможное улучшение этого поста - использовать два цикла: один для построения всего HTML-кода, а другой - для захвата всех элементов с помощью класса за одинdocument.querySelectorAll
вызов и добавления прослушивателей событий.Использование
+=
oninnerHTML
уничтожает слушатели событий на элементах внутри HTML. Правильный способ сделать это - использоватьdocument.createElement
. Вот минимальный, полный пример:Конечно, в
document.getElementById
этом нет необходимости, поскольку мы только что создали объект в блоке цикла. Это спасает потенциально дорогие прогулки по деревьям.Если у вас есть произвольные куски строкового HTML, как в вашем примере, вы можете использовать его
createElement("div")
, установите егоinnerHTML
один раз на кусочек и добавьте слушателей по мере необходимости. Затем добавьте div как дочерний элемент вашего контейнера.источник
<div>
, тогдаdiv.innerHTML += yourHugeChunkOfHTML
. Так что нет никаких причин, по которым это не должно работать ни для одного варианта использования.