element.innerHTML = element.innerHTML меняет макет в Firefox 4 - PullRequest
1 голос
/ 27 апреля 2011

Я обнаружил странную проблему при просмотре старой документации Ext, http://extjs.cachefly.net/ext-3.2.1/docs/?class=Ext.grid.PropertyGrid

Расположение окна наследования (вверху справа) несколько разрушено.

ломаная раскладка http://img339.imageshack.us/img339/374/bildschirmfoto20110427u.png

Но после выполнения

var resblock = document.getElementById('docs-Ext.grid.PropertyGrid').getElementsByClassName('res-block-inner')[0];
resblock.innerHTML = resblock.innerHTML; // should be a no-op(?)

все в порядке.

в порядке макета http://img204.imageshack.us/img204/374/bildschirmfoto20110427u.png

Как это может быть? Ошибка в Firefox 4?


Редактировать Минимальный тестовый пример: http://jsfiddle.net/uZ3eC/

1 Ответ

4 голосов
/ 27 апреля 2011

Да, похоже, ошибка в в том, как Firefox 4 , в обработке , обрабатывает окончания строк.

Элемент resblock - это элемент <pre>, содержащий несколько текстовых узлов, которые имеют дело с новыми строками и отступами.Когда они создаются с помощью сценариев, они содержат ВОЗВРАТ КАРЬЕРЫ (U + 000D), за которым следует последовательность неразрывных пробелов.

Однако после выполнения resblock.innerHTML = resblock.innerHTML; они теперь содержат LINE FEED (U +000A), за которыми следуют неразрывные пробелы.

Похоже, что Firefox 4 обрабатывает только символ перевода строки как разрыв строки и отображает части иерархии классов на новых строках.

Редактировать: то, что сказал Борис.

Проект спецификации HTML5 Раздел 8.2.2.3 Предварительная обработка входного потока говорит:

U + 000D ВОЗВРАТ ЗАРЯДА (CR)символы и символы U + 000A LINE FEED (LF) обрабатываются специально.Любые символы CR, за которыми следуют символы LF, должны быть удалены, а любые символы CR, за которыми не следуют символы LF, должны быть преобразованы в символы LF.Таким образом, новые строки в HTML DOM представлены символами LF, и на входе на этапе токенизации никогда не бывает символов CR.

...