Mam ten układ, który został utworzony dynamicznie:
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>
I chcę, aby zdarzenie kliknęło na każde z nich h4 class="name"
i pokazało dziennik z i
powiązanym numerem .
Jednak console.log
pokazuje tylko ostatni i
pokrewnych ( i=9
w tym przypadku), i nie działa z innymi i
numerami. Dlaczego to się dzieje? Co mam do zrobienia?
javascript
html
innerhtml
Luiz Adorno
źródło
źródło
for
wywołaniu przez pętlę metody zastosowania zdarzeń do tych elementów, ale nie wiem. będzie jsFiddle do testowania..card-body
i sprawdź, czy element (target
) jest zakotwiczeniem i identyfikatorem rozpoczynającym się odtitle
.innerHTML += ...
zabicie wcześniej ustawionych detektorów zdarzeń, a nie zamknięcie. Użyjdocument.createElement
zamiast tego. Zobacz ten wątekOdpowiedzi:
innerHTML
przerysowuje pełny HTML, w wyniku czego wszystkie wcześniej dołączone zdarzenia zostaną utracone. Posługiwać sięinsertAdjacentHTML()
źródło
insertAdjacentHTML
- codziennie schoolday, naprawdę miło.document.getElementById
natychmiast po dodaniu HTML. Jeśli dodajesz setki elementów, jest to dużo pracy w ruchu.name
i przypisanie zdarzenia do tej klasy podczas przechodzenia przez element (a może po prostu czytanie z samego wydarzenia) byłoby bardziej wydajne?document.createElement
można go zastosować, myślę, że jest to ogólnie najlepsze podejście podstawowe. Innym możliwym ulepszeniem tego postu jest użycie dwóch pętli: jednej do zbudowania całego kodu HTML, a drugiej do pobrania wszystkich elementów za pomocą klasy w jednymdocument.querySelectorAll
wywołaniu i dodania detektorów zdarzeń.Użycie
+=
oninnerHTML
niszczy detektory zdarzeń dotyczące elementów wewnątrz HTML. Prawidłowym sposobem na to jest użyciedocument.createElement
. Oto minimalny, kompletny przykład:Oczywiście
document.getElementById
nie jest to konieczne, ponieważ właśnie utworzyliśmy obiekt w bloku pętli. Oszczędza to potencjalnie drogie spacery po drzewach.Jeśli masz dowolne fragmenty strunowego HTML, tak jak w twoim przykładzie, możesz go użyć
createElement("div")
, ustaw goinnerHTML
raz na fragment i dodaj słuchacze w razie potrzeby. Następnie dołącz div jako dzieci elementu kontenera.źródło
<div>
, potemdiv.innerHTML += yourHugeChunkOfHTML
. Więc nie ma powodu, dla którego nie powinno to działać w żadnym przypadku użycia.