Что случилось с innerHTML и <embed>?

Я пытаюсь исправить ошибку в используемом мною редакторе форматированного текста, из-за которой теги <embed> вставляются без закрывающего тега (что полностью портит вывод). Я выделил проблему для этой операции:

// body is a <body> tag
body.innerHTML = '<embed src = "http://example.com/whatever"></embed>';

Никакого причудливого кода, просто назначение Firefox innerHTML. Вы должны иметь возможность продублировать ошибку в Firebug следующим образом:

>>> document.body.innerHTML = "<embed></embed>"
"<embed></embed>"
>>> document.body.innerHTML
"<embed>"

Есть ли обходной путь для этого? Мне нужен тег, но я не могу оправдать перестройку / замену всего редактора форматированного текста из-за одного дерьмового крайнего случая.

Я не могу преобразовать это во что-то вроде document.createElement('embed'), потому что реальный ввод в этот редактор может легко включать несколько абзацев текста, обернутых вокруг <embed>; innerHTML на бумаге идеально подходит для этого варианта использования, я просто не могу заставить его работать с <embed>.

Будет ли у вас работать, если вы создадите <object><embed> </object>? Будет ли он по-прежнему мешать вашему контенту?

mark 13.01.2009 00:49

mfn - обертывание <embed> в <object> сделало его вообще не отображаемым в Google Chrome, но (как ни странно) оборачивания его в <p> было достаточно, чтобы исправить проблемы с отображением в программах для чтения RSS. Если вы опубликуете это как ответ, я дам вам кредит.

ojrac 13.01.2009 02:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
3 697
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Возможно, это не ответ на вашу проблему, но, согласно W3C, <embed> не был частью какой-либо стандартизированной версии HTML до HTML5.

Совершенно верно, так что +1. Но, к сожалению, люди его используют, и это источник неприятной ошибки, которая в определенных обстоятельствах отключает весь контент после незакрытого <embed>. ;)

ojrac 13.01.2009 00:58

Это уже не совсем правда; <embed> был добавлен в спецификацию HTML5. dev.w3.org/html5/spec/Overview.html#the-embed-element

Yahel 17.09.2010 01:37

Хотя <embed> не является частью стандартного HTML, он получил широкое распространение и, следовательно, является стандартом де-факто.

Тем не менее, я запускаю Firefox 3 (MineField v3.0.0.5) и получаю несколько неожиданную, но в целом правильную функциональность. Я ожидал, что HTML-код точный будет помещен в выбранный мной элемент, но вместо этого я получил HTML-код чистый.

Поскольку <embed является пустым тегом (то есть у него не может быть содержимого, только атрибуты), Firefox превращает это

<embed attribute = "value"></embed>

в

<embed  attribute = "value"/>

, который является полностью допустимым закрытым тегом. То же самое с другими пустыми тегами, такими как <input /> и <image>.

На эта страница вы можете увидеть это в действии. Версия страницы без скриптов имеет встроенное видео (youtube) внутри ярко-розового div. Скрипт крадет его содержимое и помещает его в тело как innerHTML.

У меня создалось впечатление, что стандарт де-факто - это почти универсальный стандарт. Однако, учитывая, что этот объект (стандартная версия) так же широко поддерживается и используется довольно часто, я бы не стал считать встраивание стандартом де-факто.

Powerlord 13.01.2009 01:19

Это напоминает мне о проблемах, которые у document.write были / есть с тегами <script />.

Ложь. Не отвечайте на ТАК вопросы прямо перед сном.

Я пробовал следующее в Firebug

//break up initial embed into single chunks
document.body.innerHTML = "<e"+"mbe"+"d></embed>" 

и получил ожидаемое появление, когда я проверил значение innerHTML. Идея здесь состоит в том, чтобы разбить исходную строку на несколько сцепленных строк. Глупо, но возможный обходной путь.

Проблема, о которой вы говорите, заключается в том, что теги сценария не могут содержать никаких тегов и что синтаксический анализатор видит начало конечного тега: «</». Если вы использовали формат «<element> <\ / element>» в своем документе.write, это сработало.

some 13.01.2009 14:16

Насколько я понимаю, перед присваиванием это просто оценивается как "<embed> </embed>", то же самое, что не удается. Я также пробовал такие вещи, как innerHTML + = "</embed>". Попытка разбить назначение на несколько строк (например, innerHTML += "</embe") просто вызывает ошибки.

ojrac 13.01.2009 18:24

Странно, извините за это. Думал пройти кучу тестов, но сейчас не работает. Я уволен.

Alan Storm 13.01.2009 21:52

Но ты дал мне проверить еще одну идею. Это всегда хорошо. Мы всегда можем добавить запрос функции в стиле «Mail Goggles». ТАК: Решите некоторые задачи добавления / программирования менее чем за 60 секунд, чтобы опубликовать! ;)

ojrac 14.01.2009 01:46

Другие вопросы по теме