Im folgenden Beispielcode füge ich onclick
dem Bereich, der den Text "foo" enthält, einen Ereignishandler hinzu. Der Handler ist eine anonyme Funktion, die eine anzeigt alert()
.
Wenn ich jedoch den übergeordneten Knoten zuweise innerHTML
, wird dieser onclick
Ereignishandler zerstört. Wenn Sie auf "foo" klicken, wird das Warnfeld nicht angezeigt.
Ist das reparabel?
<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>
Antworten:
Leider führt die Zuweisung zu
innerHTML
zur Zerstörung aller untergeordneten Elemente, selbst wenn Sie versuchen, sie anzuhängen. Wenn Sie untergeordnete Knoten (und deren Ereignishandler) beibehalten möchten, müssen Sie DOM-Funktionen verwenden :Edit: Bobs Lösung, aus den Kommentaren. Poste deine Antwort, Bob! Holen Sie sich Kredit dafür. :-)
quelle
Die Verwendung
.insertAdjacentHTML()
bewahrt Ereignis-Listener und wird von allen gängigen Browsern unterstützt . Es ist ein einfacher einzeiliger Ersatz für.innerHTML
.Das
'beforeend'
Argument gibt an, wo im Element der HTML-Inhalt eingefügt werden soll. Die Optionen sind'beforebegin'
,'afterbegin'
,'beforeend'
, und'afterend'
. Ihre entsprechenden Standorte sind:quelle
Jetzt ist es 2012, und jQuery verfügt über Funktionen zum Anhängen und Voranstellen, die genau dies tun. Fügen Sie Inhalte hinzu, ohne die aktuellen Inhalte zu beeinflussen. Sehr hilfreich.
quelle
.insertAdjacentHTML
gibt es seit IE4Wenn Sie eine Javascript-Bibliothek wie jquery (v1.3) verwenden, um Ihre Dom-Manipulation durchzuführen, können Sie Live-Ereignisse verwenden, bei denen Sie einen Handler wie den folgenden einrichten:
und es wird zu jeder Zeit während jeder Art von Abfrage-Manipulation auf diesen Selektor angewendet. Live-Ereignisse finden Sie unter: docs.jquery.com/events/live. Informationen zur Manipulation von Abfragen finden Sie unter: docs.jquery.com/manipulation
quelle
Ich habe mein Markup erstellt, um es als Zeichenfolge einzufügen, da es weniger Code enthält und leichter zu lesen ist als die Arbeit mit dem ausgefallenen Dom-Zeug.
Dann habe ich es innerHTML eines temporären Elements gemacht, nur damit ich das einzige Kind dieses Elements nehmen und an den Körper binden kann.
quelle
Something.innerHTML + = 'füge hinzu, was immer du willst';
es hat bei mir funktioniert. Mit dieser Lösung habe ich einem Eingabetext eine Schaltfläche hinzugefügt
quelle
Es gibt noch eine andere Alternative: Verwenden
setAttribute
eines Ereignis-Listeners , anstatt ihn hinzuzufügen. So was:quelle
Ja, es ist möglich, wenn Sie Ereignisse mithilfe des Tag-Attributs
onclick="sayHi()"
direkt in einer Vorlage binden, die Ihrer ähnlich ist<body onload="start()">
- dieser Ansatz ähnelt den Frameworks Angular / Vue / React / etc. Sie können auch verwenden<template>
, um 'dynamisches' HTML wie hier zu bearbeiten . Es ist nicht streng unauffällig, aber es ist akzeptabel für kleine Projektequelle
Der Verlust von Ereignishandlern ist, IMO, ein Fehler in der Art und Weise, wie Javascript mit dem DOM umgeht. Um dieses Verhalten zu vermeiden, können Sie Folgendes hinzufügen:
quelle
mydiv.onclick
. Nur der Onclick der inneren Spanne wird von überschriebeninnerHTML +=
.Sie könnten es so machen:
quelle
Am einfachsten ist es, ein Array zu verwenden und Elemente darin zu verschieben und dann die nachfolgenden Werte des Arrays dynamisch in das Array einzufügen. Hier ist mein Code:
quelle
Für jedes Objektarray mit Header und Daten.
jsfiddle
https://jsfiddle.net/AmrendraKumar/9ac75Lg0/2/
quelle
Ich bin ein fauler Programmierer. Ich benutze DOM nicht, weil es wie zusätzliches Tippen erscheint. Je weniger Code, desto besser für mich. So würde ich "bar" hinzufügen, ohne "foo" zu ersetzen:
quelle