Che succede con innerHTML e < embed > ;?
-
22-07-2019 - |
Domanda
Sto cercando di correggere un bug in un editor di testi avanzato che sto usando, che causa l'inserimento dei tag < embed >
senza il loro tag di chiusura (che rovina completamente l'output) . Ho isolato il problema con questa operazione:
// body is a <body> tag
body.innerHTML = '<embed src="http://example.com/whatever"></embed>';
Nessun codice elaborato, solo l'assegnazione innerHTML
di Firefox. Dovresti essere in grado di duplicare l'errore in Firebug in questo modo:
>>> document.body.innerHTML = "<embed></embed>"
"<embed></embed>"
>>> document.body.innerHTML
"<embed>"
Esiste una soluzione alternativa per questo? Ho bisogno del tag, ma non posso giustificare la ricostruzione / la sostituzione dell'intero rich text editor a causa di un caso merdoso.
Non posso convertirlo in qualcosa come document.createElement ('embed')
, perché l'input del mondo reale a questo editor può facilmente includere alcuni paragrafi di testo racchiusi nel < embed >
; innerHTML è, su carta, perfetto per questo caso d'uso, non riesco proprio a farlo funzionare con un < embed >
.
Soluzione
Questa potrebbe non essere una risposta al tuo problema, ma < embed > non faceva parte di alcuna versione standardizzata di HTML fino a HTML5, secondo W3C .
Altri suggerimenti
Anche se < embed > non fa parte di un html standard, è stato ampiamente implementato ed è quindi uno standard di fatto.
Detto questo, sto eseguendo Firefox 3 (MineField v3.0.0.5) e sto diventando leggermente inaspettato, ma completamente funzionante. Mi aspettavo che l'HTML esatto fosse inserito nell'elemento selezionato, ma invece ho ottenuto clean html.
Poiché < embed è un tag vuoto (ovvero non può avere contenuti, solo attributi), Firefox trasforma questo
<embed attribute="value"></embed>
in
<embed attribute="value"/>
, che è un tag chiuso perfettamente valido. Fa lo stesso su altri tag vuoti, come < input / > e < image >
Alla questa pagina puoi vederlo in azione. La versione senza script della pagina ha un video incorporato (youtube) all'interno di un div rosa brillante. La sceneggiatura ruba i suoi contenuti e li inserisce nel corpo come innerHTML.
Questo mi ricorda i problemi che document.write aveva / ha con < script / > tag.
bugie. Non rispondere alle domande SO prima di andare a letto.
Ho provato quanto segue in Firebug
//break up initial embed into single chunks
document.body.innerHTML = "<e"+"mbe"+"d></embed>"
e mi sono aspettato che comparisse quando ho verificato il valore di innerHTML. L'idea qui è quella di spezzare la stringa iniziale in più stringhe concatenate. Stupido, ma un possibile rimedio.