J'ai eu ce problème avec innerHTML, j'ai dû ajouter un script Hotjar à la balise "head" de mon application Reactjs et elle devrait s'exécuter juste après l'ajout.
L'une des bonnes solutions pour l'importation dynamique de nœuds dans la balise "head" est le module React-helment .
Il existe également une solution utile au problème proposé:
Pas de balises de script dans innerHTML!
Il s'avère que HTML5 n'autorise pas l'ajout dynamique de balises de script à l'aide de la propriété innerHTML. Donc, ce qui suit ne s'exécutera pas et il n'y aura pas d'alerte disant Bonjour tout le monde!
element.innerHTML = "<script>alert('Hello World!')</script>";
Ceci est documenté dans la spécification HTML5:
Remarque: les éléments de script insérés à l'aide de innerHTML ne s'exécutent pas lorsqu'ils sont insérés.
Mais attention, cela ne signifie pas que innerHTML est à l'abri des scripts intersites. Il est possible d'exécuter JavaScript via innerHTML sans utiliser de balises comme illustré sur la page innerHTML de MDN .
Solution: ajout dynamique de scripts
Pour ajouter dynamiquement une balise de script, vous devez créer un nouvel élément de script et l'ajouter à l'élément cible.
Vous pouvez le faire pour les scripts externes:
var newScript = document.createElement("script");
newScript.src = "http://www.example.com/my-script.js";
target.appendChild(newScript);
Et des scripts en ligne:
var newScript = document.createElement("script");
var inlineScript = document.createTextNode("alert('Hello World!');");
newScript.appendChild(inlineScript);
target.appendChild(newScript);