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.)
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.)
Réponses:
Utilisez-le insertAdjacentHTML
s'il est disponible, sinon utilisez une sorte de solution de secours. insertAdjacentHTML est pris en charge dans tous les navigateurs actuels .
div.insertAdjacentHTML( 'beforeend', str );
Démo en direct: http://jsfiddle.net/euQ5n/
insertAdjacentHTML
est plus rapide que l'ajout de innerHTML
, car insertAdjacentHTML
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?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
jsFiddle .
Mais , la réponse de Neil est une meilleure solution.
innerHTML
?
insertAdjacentHTML
.
AppendChild
(E) est plus de 2x plus rapide que les autres solutions sur Chrome et Safari, insertAdjacentHTML
(F) est plus rapide sur Firefox. Le innerHTML=
(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.
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
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 via appendChild
.
var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';
var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
target.appendChild(temp.firstChild);
}
Cela évite d'effacer les gestionnaires d'événements sur div#test
mais vous permet toujours d'ajouter une chaîne de HTML.
La bonne façon est d'utiliser insertAdjacentHTML
. Dans Firefox antérieur à 8, vous pouvez revenir à l'utilisation Range.createContextualFragment
si votre str
ne contient aucune script
balise.
Si votre str
contient des script
balises, vous devez supprimer des script
éléments du fragment renvoyé par createContextualFragment
avant d'insérer le fragment. Sinon, les scripts s'exécuteront. ( insertAdjacentHTML
marque les scripts comme non exécutables.)
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 :
<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>
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:
<script>
//: The message "QUICK_HACK"
//: wrapped in a header #1 tag.
var text = "<h1>QUICK_HACK</h1>";
//: It's a quick hack, so I don't
//: care where it goes on the document,
//: just as long as I can see it.
//: Since I am doing this quick hack in
//: an empty file or scratchpad,
//: it should be visible.
var child = document.children[0];
//: Set the html content of your child
//: to the message you want to see on screen.
child.innerHTML = text;
</script>
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.
Pourquoi n'est-ce pas acceptable?
document.getElementById('test').innerHTML += str
serait la manière classique de le faire.
#test
cependant. Ce n'est généralement pas souhaitable.
Cela peut résoudre
document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');
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:
<p>text1</p><p>text2</p>
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
function append(element, str)
{
var child = document.createElement('someshittyuniquetag');
child.innerHTML = str;
element.appendChild(child);
child.outerHTML = child.outerHTML.replace(/<\/?someshittyuniquetag>/, '');
// or Even child.outerHTML = child.innerHTML
}
<div id="testit">
This text is inside the div
<button onclick="append(document.getElementById('testit'), '<button>dadasasdas</button>')">To div</button>
<button onclick="append(this, 'some text')">to this</button>
</div>
Le plus court - 18 caractères (à ne pas confondre +=
(mention par OP) avec =
plus de détails ici )
test.innerHTML=str
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.