Que se passe-t-il avec innerHTML et < embed > ;?
-
22-07-2019 - |
Question
J'essaie de corriger un bogue dans un éditeur de texte enrichi que j'utilise, ce qui entraîne l'insertion de balises < Embed >
sans leur balise de fermeture (ce qui visse complètement la sortie) . J'ai isolé le problème de cette opération:
// body is a <body> tag
body.innerHTML = '<embed src="http://example.com/whatever"></embed>';
Pas de code de fantaisie, juste l'affectation de innerHTML
de Firefox. Vous devriez pouvoir dupliquer l’erreur dans Firebug comme ceci:
>>> document.body.innerHTML = "<embed></embed>"
"<embed></embed>"
>>> document.body.innerHTML
"<embed>"
Existe-t-il une solution de contournement? J'ai besoin de la balise, mais je ne peux pas justifier de reconstruire / remplacer l'éditeur de texte enrichi complet à cause d'un cas d'extrême merde.
Je ne peux pas convertir cela en quelque chose comme document.createElement ('embed')
, car les entrées réelles de cet éditeur peuvent facilement inclure quelques paragraphes de texte entourant . < intégrer >
; innerHTML est, sur le papier, parfait pour ce cas d'utilisation, je ne peux tout simplement pas le faire fonctionner avec un < embed >
.
La solution
Cela pourrait ne pas être une réponse à votre problème, mais < embed > ne faisait pas partie d'une version normalisée du code HTML jusqu'à HTML5, selon W3C .
Autres conseils
Bien que < incorporer > ne fait pas partie d'un code HTML standard, il a été largement implémenté et constitue donc un standard de facto.
Cela étant dit, j'utilise Firefox 3 (MineField v3.0.0.5) et je reçois un fonctionnement légèrement inattendu, mais tout à fait correct. Je m'attendais à ce que le code HTML exact soit placé dans l'élément que j'ai sélectionné, mais au lieu de cela, j'ai obtenu le code clean .
Comme < embed est une balise vide (c’est-à-dire qu’elle ne peut pas avoir de contenu mais uniquement des attributs), Firefox la retourne
.<embed attribute="value"></embed>
dans
<embed attribute="value"/>
, qui est une balise fermée parfaite. Il en va de même pour d’autres balises vides, telles que < input / > et < image &
Sur la cette page , vous pouvez le voir en action. La version sans script de la page contient une vidéo intégrée (youtube) à l'intérieur d'un div rose vif. Le script vole son contenu et le place dans le corps en tant que innerHTML.
Cela me rappelle les problèmes que document.write avait / avait avec < script / > Mots clés.
Mensonges. Ne répondez pas aux questions SO juste avant de vous coucher.
J'ai essayé ce qui suit dans Firebug
//break up initial embed into single chunks
document.body.innerHTML = "<e"+"mbe"+"d></embed>"
et a été attendu à apparaître lorsque j'ai vérifié la valeur de innerHTML. L'idée ici est de diviser la chaîne initiale en plusieurs chaînes concaténées. Stupide, mais une solution possible.