¿Qué pasa con innerHTML y < embed > ;?
-
22-07-2019 - |
Pregunta
Estoy tratando de corregir un error en un editor de texto enriquecido que estoy usando, lo que hace que las etiquetas < embed >
se inserten sin su etiqueta de cierre (lo que arruina la salida por completo) . He aislado el problema de esta operación:
// body is a <body> tag
body.innerHTML = '<embed src="http://example.com/whatever"></embed>';
Sin código sofisticado, solo la asignación innerHTML
de Firefox. Debería poder duplicar el error en Firebug de esta manera:
>>> document.body.innerHTML = "<embed></embed>"
"<embed></embed>"
>>> document.body.innerHTML
"<embed>"
¿Hay alguna solución para esto? Necesito la etiqueta, pero no puedo justificar la reconstrucción / reemplazo de todo el editor de texto enriquecido debido a un caso de borde horrible.
No puedo convertir esto en algo como document.createElement ('embed')
, porque la entrada del mundo real a este editor puede incluir fácilmente unos pocos párrafos de texto alrededor del < incrustar >
; innerHTML es, en papel, perfecto para este caso de uso, simplemente no puedo hacer que funcione con un < embed >
.
Solución
Esto podría no ser una respuesta a su problema, pero < embed > no formaba parte de ninguna versión estandarizada de HTML hasta HTML5, según W3C .
Otros consejos
Aunque < incrustar > no es parte de un html estándar, se ha implementado ampliamente y, por lo tanto, es un estándar de facto.
Dicho esto, estoy ejecutando Firefox 3 (MineField v3.0.0.5) y obtengo una funcionalidad ligeramente inesperada, pero totalmente correcta. Esperaba que el HTML exacto se pusiera en el elemento que seleccioné, pero en su lugar obtuve clean html.
Dado que < embed es una etiqueta vacía (es decir, no puede tener contenido, solo atributos), Firefox lo convierte
<embed attribute="value"></embed>
en
<embed attribute="value"/>
, que es una etiqueta cerrada perfectamente válida. Hace lo mismo en otras etiquetas vacías, como < input / > y < image >
En la esta página puede ver esto en acción. La versión sin guión de la página tiene un video incrustado (youtube) dentro de un div rosa brillante. El script roba su contenido y lo coloca en el cuerpo como innerHTML.
Esto me recuerda los problemas que document.write tenía / tiene con < script / > Etiquetas
Mentiras. No responda preguntas SO justo antes de acostarse.
Intenté lo siguiente en Firebug
//break up initial embed into single chunks
document.body.innerHTML = "<e"+"mbe"+"d></embed>"
y obtuve el resultado esperado cuando verifiqué el valor de innerHTML. La idea aquí es dividir la cadena inicial en múltiples cadenas concatenadas. Estúpido, pero una posible solución.