Comment ajouter cette chaîne HTML
var str = '<p>Just some <span>text</span> here</p>';
au DIV avec l'ID 'test'
qui se trouve dans le DOM?
(Btw div.innerHTML += str;
n'est pas acceptable.)
javascript
html
dom
browser
Šime Vidas
la source
la source
innerHTML
met la chaîne dans l'élément (en remplaçant tous les enfants), alorsinsertAdjacentHTML
qu'elle la met (1) avant l'élément, (2) après l'élément, (3) à l'intérieur de l'élément avant le premier enfant, ou (4) à l'intérieur de l'élément après le dernier enfant.insertAdjacentHTML
est plus rapide que l'ajout deinnerHTML
, carinsertAdjacentHTML
il ne sérialise pas et n'analyse pas les enfants existants de l'élément.insertAdjacentHTML
conserve les valeurs des éléments de formulaire modifiés, tandis que l'ajout àinnerHTML
reconstruit l'élément et perd tout contexte de formulaire.Est-ce acceptable?
jsFiddle .
Mais , la réponse de Neil est une meilleure solution.
la source
innerHTML
?insertAdjacentHTML
.Performance
AppendChild
(E) est plus de 2x plus rapide que les autres solutions sur Chrome et Safari,insertAdjacentHTML
(F) est plus rapide sur Firefox. LeinnerHTML=
(B) (ne pas confondre avec+=
(A)) est la deuxième solution rapide sur tous les navigateurs et il est beaucoup plus pratique que E et F.Détails
Configuration de l'environnement (2019.07.10) MacOs High Sierra 10.13.4 sur Chrome 75.0.3770 (64 bits), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64 bits)
Vous pouvez rejouer le test sur votre machine ici
Afficher l'extrait de code
la source
L'idée est d'utiliser
innerHTML
sur un élément intermédiaire, puis de déplacer tous ses nœuds enfants là où vous le souhaitez vraiment viaappendChild
.Cela évite d'effacer les gestionnaires d'événements sur
div#test
mais vous permet toujours d'ajouter une chaîne de HTML.la source
La bonne façon est d'utiliser
insertAdjacentHTML
. Dans Firefox antérieur à 8, vous pouvez revenir à l'utilisationRange.createContextualFragment
si votrestr
ne contient aucunescript
balise.Si votre
str
contient desscript
balises, vous devez supprimer desscript
éléments du fragment renvoyé parcreateContextualFragment
avant d'insérer le fragment. Sinon, les scripts s'exécuteront. (insertAdjacentHTML
marque les scripts comme non exécutables.)la source
createContextualFragment
. Je cherchais un moyen de créer des inclusions HTML avec des scripts exécutés uniquement si l'utilisateur accepte de définir un cookie.Hack rapide :
Cas d'utilisation :
1: Enregistrez en tant que fichier .html et exécutez-le dans Chrome, Firefox ou Edge. (IE ne fonctionnera pas)
2: Utilisation dans http://js.do
En action: http://js.do/HeavyMetalCookies/quick_hack
Décomposé avec des commentaires:
Raison pour laquelle j'ai publié:
JS.do a deux incontournables:
Mais n'affiche pas les messages console.log. Je suis venu ici à la recherche d'une solution rapide. Je veux juste voir les résultats de quelques lignes de code de bloc-notes, les autres solutions sont trop de travail.
la source
Pourquoi n'est-ce pas acceptable?
document.getElementById('test').innerHTML += str
serait la manière classique de le faire.
la source
#test
cependant. Ce n'est généralement pas souhaitable.Cela peut résoudre
la source
InnerHTML efface toutes les données comme l'événement pour les nœuds existants
append child avec firstChild ajoute uniquement le premier enfant à innerHTML. Par exemple si nous devons ajouter:
seul text1 apparaîtra
Et ça:
ajoute une balise spéciale à innerHTML en ajoutant un enfant, puis modifiez externalHTML en supprimant la balise que nous avons créée. Je ne sais pas à quel point c'est intelligent mais cela fonctionne pour moi ou vous pourriez changer externalHTML en innerHTML afin qu'il n'ait pas à utiliser la fonction de remplacement
la source
Le plus court - 18 caractères (à ne pas confondre
+=
(mention par OP) avec=
plus de détails ici )Afficher l'extrait de code
la source