Исключение DOM при назначении сущностей HTML для innerHTML - PullRequest
7 голосов
/ 12 ноября 2010

На этой странице http://blog.zacharyvoase.com/2010/11/11/sockets-and-nodes-i/, выполнение следующего кода в консоли javascript вызовет исключение.

var div = document.createElement('div'); div.innerHTML = "»";
  • Chrome 8.0.552.28 Mac: ошибка: INVALID_STATE_ERR: исключение DOM 11
  • Firebug в Firefox 3.6.12 Mac: NS_ERROR_DOM_SYNTAX_ERR Указана неверная или недопустимая строка
  • Safari 5.0.2 Mac: ошибка: NO_MODIFICATION_ALLOWED_ERR: исключение DOM 7
    Опера: отлично работает

Но он отлично работает на всех других страницах, которые я пробовал. Мои вопросы Что особенного в странице и , почему Chrome и Firefox выдают исключение ?

Написание символа напрямую без использования сущностей работает нормально.

var div = document.createElement('div'); div.innerHTML = "»";

Использование других объектов также работает, например,

var div = document.createElement('div'); div.innerHTML = "<";

Ответы [ 2 ]

16 голосов
/ 12 ноября 2010

Я отвечаю на свой вопрос.

Короткий ответ: это из-за ограничений браузера.

Если страница определена как XHTML некоторыми браузерами, только подмножество именованных символовсущности, разрешенные стандартом, поддерживаются для присвоения innerHTML.

В частности, в моем тестировании, похоже, что в Mozilla и Webkit, только ", &, < и > разрешены в innerHTMLназначение.

Мой тестовый код доступен здесь: https://gist.github.com/673901

XHTML - «лучшая» и более чистая версия HTML, переформулированная в XML.XHTML 1.1 должен был стать преемником и будущим HTML.Однако это вряд ли произойдет с принятием HTML5.

В отличие от HTML, для которого требуется выделенный анализатор HTML, документ XHTML может быть проанализирован обычным анализатором XML.По крайней мере, в mozilla и webkit XHTML и HTML проходят разные пути кода.Понятно, что путь к коду HTML - это то место, куда направляются основные усилия, а также лучше тестируется, потому что там гораздо больше документов HTML, чем XHTML.

Стоит отметить, что то, распознается ли документ как XHTML, определяетсяэффективный тип MIME, а не содержимое документа.

Вывод таков: если вы работаете с XHTML, убедитесь, что преобразовали именованные сущности в числовые (например,   ->  ), прежде чем присваивать.innerHTML.

1 голос
/ 12 ноября 2010

Кажется, что вы ожидаете, что вы пытаетесь добавить закодированный HTML, но он обнаруживает, что он искажен.
var div = document.createElement('div'); div.innerHTML = "»"; делает то, что вам нужно?

На комментарий: var dv = document.createElement('div'); dv.innerHTML = "»"; document.getElementById('test').appendChild(dv);

Я получил закодированный символ здесь .

Вы правы в том, что » является верным закодированным HTML.Я могу только догадываться, что это ограничение браузера.

...