Element.innerHTML

Lit ou remplace le contenu d’un élément sous forme de code HTML.

Renvoie
Une chaîne avec le code HTML du contenu de l’élément.
Sur cette page

Exemple

#
JavaScript
const menu = document.querySelector('#menu')
console.log(menu.innerHTML)

const items = ['Cours', 'Classement', 'Profil']
menu.innerHTML = items.map((item) => `<li>${item}</li>`).join('')

console.log(menu.children.length)
console.log(menu.innerHTML)
Console
<li>Accueil</li>
3
<li>Cours</li><li>Classement</li><li>Profil</li>

Définition et utilisation

#

La propriété innerHTML renvoie le code HTML de tous les enfants de l’élément sous forme de chaîne. Affecter une nouvelle chaîne supprime le contenu existant, et le navigateur analyse le texte comme du HTML pour en créer de nouveaux éléments.

C’est un moyen pratique d’insérer un fragment plus grand, par ex. construit dans un template literal. Rappelez-vous cependant que chaque affectation détruit les anciens éléments, avec les écouteurs d’événements qui leur étaient attachés et le texte saisi dans les champs de formulaire. De même, innerHTML += reconstruit tout le contenu depuis le début.

Le plus grand risque concerne la sécurité. Insérer du texte venant de l’utilisateur via innerHTML ouvre la voie à une attaque XSS : quelqu’un peut glisser des balises contenant du code qui s’exécutera sur votre page. Insérez les données externes via textContent, ou créez les éléments avec la méthode createElement().

Syntaxe

#
Syntaxe
const html = element.innerHTML
element.innerHTML = htmlString

Plus d’exemples

#
L’affectation détruit les anciens éléments
JavaScript
const box = document.querySelector('#box')
const oldButton = document.querySelector('#buy')

box.innerHTML += '<p>Promotion : 20 % moins cher</p>'

console.log(document.querySelector('#buy') === oldButton)
console.log(oldButton.isConnected)
Console
false
false

Après +=, le navigateur a reconstruit le contenu depuis le début. Le nouveau bouton a la même apparence, mais c’est un élément différent, et l’écouteur d’événement attaché à l’ancien a cessé de fonctionner.

HTML et texte brut
JavaScript
const greeting = document.querySelector('#greeting')
const userName = '<em>Lucas</em>'

greeting.innerHTML = `Salut, ${userName} !`
console.log(greeting.querySelector('em') !== null)

greeting.textContent = `Salut, ${userName} !`
console.log(greeting.querySelector('em') !== null)
Console
true
false

Avec innerHTML, les balises de la chaîne deviennent de vrais éléments. textContent les affiche comme du texte brut, c’est pourquoi il est sûr pour des données venant de l’utilisateur.

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • N’insérez jamais via innerHTML des données venant de l’utilisateur ou d’une API sans les nettoyer. Pour du texte, utilisez textContent.
  • Évitez innerHTML += dans une boucle, car chaque étape reconstruit tout le contenu. Construisez d’abord la chaîne complète, ou utilisez insertAdjacentHTML().
  • Pour vider un élément, element.innerHTML = "" ou element.replaceChildren() suffit.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.