Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

Element : méthode insertAdjacentHTML()

Baseline Large disponibilité

Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis avril 2018.

Attention : Cette méthode analyse son entrée en tant que HTML ou XML, écrivant le résultat dans le DOM. Les API de ce type sont connues sous le nom de points d'injection et constituent potentiellement un vecteur pour les attaques de scripts inter-sites (XSS), si l'entrée provient à l'origine d'un·e attaquant·e.

Vous pouvez réduire le risque en assignant des objets TrustedHTML au lieu de chaînes de caractères, et en appliquant des types de confiance en utilisant la directive CSP require-trusted-types-for. Cela garantit que l'entrée est passée par une fonction de transformation, qui a la possibilité d'assainir l'entrée pour supprimer les balises potentiellement dangereuses, telles que les éléments HTML <script> et les attributs de gestionnaire d'évènements.

La méthode insertAdjacentHTML() de l'interface Element analyse l'entrée définie en tant que HTML ou XML et insère les nœuds résultants dans l'arbre DOM à une position définie.

Syntaxe

js
insertAdjacentHTML(position, input)

Paramètres

position

Une chaîne de caractères représentant la position relative à l'élément. Doit être l'une des chaînes de caractères suivantes :

"beforebegin"

Avant l'élément. Valide uniquement si l'élément est dans l'arbre DOM et a un élément parent.

"afterbegin"

Juste à l'intérieur de l'élément, avant son premier enfant.

"beforeend"

Juste à l'intérieur de l'élément, après son dernier enfant.

"afterend"

Après l'élément. Valide uniquement si l'élément est dans l'arbre DOM et a un élément parent.

input

Une instance de TrustedHTML ou une chaîne de caractères définissant le HTML ou XML à analyser.

Valeur de retour

Aucune (undefined).

Exceptions

Cette méthode peut lever une DOMException de l'un des types suivants :

NoModificationAllowedError DOMException

Levée si position est "beforebegin" ou "afterend" et que l'élément n'a pas de parent ou que son parent est l'objet Document.

SyntaxError DOMException

Levée si :

  • position n'est pas l'une des quatre valeurs listées.
  • L'entrée est du XML qui n'est pas bien formé.
TypeError

Levée si la propriété est définie sur une chaîne de caractères lorsque les Trusted Types sont appliqués par une CSP et qu'aucune politique par défaut n'est définie.

Description

La méthode insertAdjacentHTML() ne réanalyse pas l'élément sur lequel elle est utilisée, et ne corrompt donc pas les éléments existants à l'intérieur de cet élément. Cela évite l'étape supplémentaire de sérialisation, ce qui la rend beaucoup plus rapide que la manipulation directe de innerHTML.

Lorsque <p> est l'élément, nous pouvons visualiser les positions possibles pour le contenu inséré "toto" comme suit :

html
<!-- beforebegin -->
<p>
  <!-- afterbegin -->
  toto
  <!-- beforeend -->
</p>
<!-- afterend -->

La méthode ne prévoit aucun traitement particulier pour les éléments <template>. Dans la plupart des cas, les développeur·euse·s doivent utiliser la fonction insertAdjacentHTML() sur la propriété content du modèle, plutôt que de manipuler directement les nœuds enfants d'un élément de modèle.

Considérations de sécurité

La méthode n'effectue aucun assainissement visant à supprimer les éléments présentant un risque de XSS, tels que <script> ou les attributs de contenu des gestionnaires d'évènements.

Lorsque vous insérez du code HTML dans une page à l'aide de insertAdjacentHTML(), vous devez passer des objets TrustedHTML plutôt que des chaînes de caractères, et imposer des types fiables à l'aide de la directive CSP require-trusted-types-for. Cela garantit que les données sont transmises par une fonction de transformation, qui a la possibilité d'assainir les données afin de supprimer tout balisage potentiellement dangereux avant leur injection.

La méthode Element.insertAdjacentText() ou Node.textContent doit être utilisée lorsque vous savez que le contenu fourni par l'utilisateur·ice doit être du texte brut. Cela permet d'insérer les données sous forme de texte brut au lieu de les analyser en HTML.

Exemples

Insérer du HTML

Cet exemple démontre les quatre positions d'insertion. Tout le texte inséré est en gras, tandis que le texte inséré à l'intérieur de l'élément est en plus mis en forme en monotype rouge (code).

HTML

html
<select id="position">
  <option>beforebegin</option>
  <option>afterbegin</option>
  <option>beforeend</option>
  <option>afterend</option>
</select>

<button id="inserer">Insérer du HTML</button>
<button id="reinitialiser">Réinitialiser</button>

<p>
  Du texte, avec un <code id="sujet">élément mis en forme en code</code>
  à l'intérieur.
</p>

CSS

css
code {
  color: red;
}

JavaScript

Les types de confiance ne sont pas pris en charge par tous les navigateurs, nous allons donc commencer par définir une prothèse d'émulation des types de confiance. Celle-ci sert de remplacement transparent à l'API JavaScript des types de confiance :

js
if (typeof typesDeConfiance === "undefined")
  typesDeConfiance = { createPolicy: (n, regles) => regles };

Ensuite, nous définissons une politique nommée contenu-de-la-politique pour créer des objets TrustedHTML à partir de l'entrée (nous devons également appliquer la contenu-de-la-politique en utilisant CSP). Le code implémente une politique sans effet afin de permettre à cet exemple de fonctionner sans dépendance tierce. Votre propre code applicatif doit utiliser une bibliothèque tierce telle que la bibliothèque « DOMPurify » pour retourner un contenu assaini à partir de l'entrée non fiable.

js
const politique = trustedTypes.createPolicy("contenu-de-la-politique", {
  createHTML(input) {
    return input; // Ne faites pas cela dans votre propre code !
    // À la place, faites quelque chose comme :
    // return DOMPurify.sanitize(input);
  },
});

const texteNonSecure = "<strong>texte inséré</strong>";
const HTMLDeConfiance = politique.createHTML(texteNonSecure);

Le code restant insère le HTML de confiance à la position sélectionnée par rapport à l'élément ayant l'id sujet.

js
const inserer = document.querySelector("#inserer");
inserer.addEventListener("click", () => {
  const sujet = document.querySelector("#sujet");
  const positionSelect = document.querySelector("#position");
  sujet.insertAdjacentHTML(positionSelect.value, HTMLDeConfiance);
});

const reinitialiser = document.querySelector("#reinitialiser");
reinitialiser.addEventListener("click", () => {
  document.location.reload();
});

Résultat

Spécifications

Spécification
HTML
# the-insertadjacenthtml()-method

Compatibilité des navigateurs

Voir aussi