W poniższym przykładowym kodzie dołączam onclick
procedurę obsługi zdarzeń do zakresu zawierającego tekst „foo”. Program obsługi to anonimowa funkcja, która wyświetla plik alert()
.
Jeśli jednak przypiszę do węzła nadrzędnego innerHTML
, ten onclick
program obsługi zdarzeń zostanie zniszczony - kliknięcie „foo” nie powoduje wyświetlenia okna alertu.
Czy można to naprawić?
<html>
<head>
<script type="text/javascript">
function start () {
myspan = document.getElementById("myspan");
myspan.onclick = function() { alert ("hi"); };
mydiv = document.getElementById("mydiv");
mydiv.innerHTML += "bar";
}
</script>
</head>
<body onload="start()">
<div id="mydiv" style="border: solid red 2px">
<span id="myspan">foo</span>
</div>
</body>
</html>
javascript
html
innerhtml
dom-events
mikrofon
źródło
źródło
Odpowiedzi:
Niestety przypisanie do
innerHTML
powoduje zniszczenie wszystkich elementów podrzędnych, nawet jeśli próbujesz dołączyć. Jeśli chcesz zachować węzły potomne (i ich programy obsługi zdarzeń), musisz użyć funkcji DOM :Edycja: rozwiązanie Boba, z komentarzy. Opublikuj swoją odpowiedź, Bob! Zdobądź uznanie. :-)
źródło
Używanie
.insertAdjacentHTML()
zachowuje detektory zdarzeń i jest obsługiwane przez wszystkie główne przeglądarki . To prosty, jednoliniowy zamiennik.innerHTML
.W
'beforeend'
Określa argumentów gdzie w elemencie wstawić zawartość HTML. Dostępne są następujące opcje'beforebegin'
,'afterbegin'
,'beforeend'
, i'afterend'
. Ich odpowiednie lokalizacje to:źródło
Teraz jest rok 2012, a jQuery ma funkcje dołączania i poprzedzania, które robią dokładnie to, dodają zawartość bez wpływu na bieżącą zawartość. Bardzo przydatne.
źródło
.insertAdjacentHTML
istnieje od IE4Jako drobna (ale powiązana) pomoc, jeśli używasz biblioteki javascript, takiej jak jquery (v1.3), do manipulacji domem, możesz skorzystać z wydarzeń na żywo, w których skonfigurujesz procedurę obsługi, taką jak:
i będzie stosowany do tego selektora przez cały czas podczas jakiejkolwiek manipulacji jQuery. Aby zobaczyć wydarzenia na żywo, zobacz: docs.jquery.com/events/live, aby dowiedzieć się, jak manipulować jquery, patrz: docs.jquery.com/manipulation
źródło
Stworzyłem moje znaczniki do wstawiania jako ciąg znaków, ponieważ jest to mniej kodu i łatwiejsze do odczytania niż praca z fantazyjnymi rzeczami dom.
Następnie uczyniłem go innerHTML elementu tymczasowego, aby móc wziąć jedyne dziecko tego elementu i dołączyć do ciała.
źródło
cos.innerHTML + = 'dodaj cokolwiek chcesz';
to działało dla mnie. Dodałem przycisk do tekstu wejściowego za pomocą tego rozwiązania
źródło
Jest jeszcze jedna alternatywa: używanie
setAttribute
zamiast dodawania detektora zdarzeń. Lubię to:źródło
Tak, jest to możliwe, jeśli powiązasz zdarzenia za pomocą atrybutu tag
onclick="sayHi()"
bezpośrednio w szablonie, podobnie jak twój<body onload="start()">
- to podejście jest podobne do frameworków angular / vue / reag / etc. Możesz także użyć<template>
do operowania na „dynamicznym” html, jak tutaj . Nie jest to dyskretny js, ale jest akceptowalny w przypadku małych projektówźródło
Utrata obsługi zdarzeń jest, IMO, błędem w sposobie, w jaki Javascript obsługuje DOM. Aby uniknąć tego zachowania, możesz dodać następujące elementy:
źródło
mydiv.onclick
. Tylko onclick wewnętrznego zakresu jest zastępowany przezinnerHTML +=
.Możesz to zrobić tak:
źródło
Najłatwiejszym sposobem jest użycie tablicy i wpychanie do niej elementów, a następnie dynamiczne wstawianie kolejnych wartości do tablicy. Oto mój kod:
źródło
Dla dowolnej tablicy obiektów z nagłówkiem i danymi.
jsfiddle
https://jsfiddle.net/AmrendraKumar/9ac75Lg0/2/
źródło
Jestem leniwym programistą. Nie używam DOM, ponieważ wydaje mi się, że to dodatkowe wpisywanie. Według mnie im mniej kodu, tym lepiej. Oto jak dodałbym „bar” bez zastępowania „foo”:
źródło