76 votes

"innerHTML += ..." contre "appendChild(txtNode)".

La question est de savoir si l'on peut comparer la concaténation en utilisant innerHTML et l'ajout d'un nœud de texte à un nœud existant. Que se passe-t-il derrière la scène ?

Ce que j'en pense jusqu'à présent :

  • Je suppose que les deux causent un ReFlow ".
  • Le dernier cas (ajout d'un nœud de texte), d'après ce que je sais, entraîne également une reconstruction complète du DOM (correct ? Les deux font-ils cela ?).
  • La première semble avoir d'autres effets secondaires désagréables, comme le fait que les références précédemment enregistrées aux nœuds enfants du nœud que je modifie innerHTML, ne pointent plus vers "le DOM actuel"/"la version correcte du nœud enfant". En revanche, lors de l'ajout d'enfants, les références semblent rester intactes. Comment cela se fait-il ?

J'espère que vous pourrez m'éclairer, merci !

114voto

T.J. Crowder Points 285826

Ce dernier ( appendChild ) fait no provoquer une reconstruction complète du DOM, voire de tous les éléments/nœuds de la cible.

La première (fixation innerHTML ) entraîne une reconstruction complète du contenu de l'élément cible, ce qui n'est pas nécessaire dans le cas d'un ajout.

Ajout par innerHTML += content permet au navigateur de parcourir tous les nœuds de l'élément pour construire une chaîne HTML à transmettre à la couche JavaScript. Votre code ajoute ensuite du texte à cette chaîne et définit le paramètre innerHTML Le navigateur abandonne alors tous les anciens nœuds de la cible, réanalysant tout le HTML et créant de nouveaux nœuds. Donc, dans ce sens, cela peut ne pas être efficace. (Cependant, l'analyse du HTML est ce que font les navigateurs et ils sont vraiment, vraiment rapides à le faire).

Réglage de innerHTML invalide en effet toutes les références à des éléments de l'élément cible que vous détenez -- parce que ces éléments n'existent plus, vous les avez supprimés et en avez mis de nouveaux (qui ressemblent beaucoup) lorsque vous avez activé la commande innerHTML .

En bref, si vous êtes ajout de j'utiliserais appendChild (ou insertAdjacentHTML (voir ci-dessous). Si vous remplacez, il y a des situations très valables où l'utilisation de l'option innerHTML est une meilleure option que de créer soi-même l'arbre via l'API DOM (la rapidité étant la principale).

Enfin, il convient de mentionner insertAdjacentHTML Il s'agit d'une fonction que vous pouvez utiliser pour insérer des nœuds et des éléments dans ou à côté d'un élément à l'aide d'une chaîne HTML. Elle permet également d'ajouter des éléments à un élément : theElement.insertAdjacentHTML("beforeend", "the HTML goes here"); Le premier argument est l'endroit où placer le HTML ; vos choix sont les suivants "beforebegin" (en dehors de l'élément, juste devant), "afterbegin" (à l'intérieur de l'élément, au début), "beforeend" (à l'intérieur de l'élément, à la fin), et "afterend" (en dehors de l'élément, juste après celui-ci). Notez que "afterbegin" y "beforeend" dans l'élément lui-même, alors que "beforebegin" y "afterend" dans l'élément parent . Supporté par tous les principaux navigateurs de bureau, je n'ai aucune idée de la qualité du support mobile (bien que je sois sûr que iOS Safari et Android 2.x et plus l'ont, au moins), mais la cale est minuscule.

8voto

oliferna Points 171

J'ai créé un petit gist avec une comparaison des performances entre innerHTML et appendChild.

Le dernier l'emporte haut la main

https://gist.github.com/oliverfernandez/5619180

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X