предельный размер внутреннего HTML

Я хочу использовать AJAX для загрузки html-файла в <div>. Затем мне нужно будет запустить для этого jsMath. Все, что я до сих пор делал с innerHTML, было парой абзацев, возможно, таблицей и/или изображением. Ничего особенного.

Какие потенциальные проблемы могут возникнуть, когда я задаю innerHTML внешний файл размером 25 КБ со всеми видами сложного форматирования CSS? (спасибо jsMath) Я не могу придумать другого способа сделать это, но мне нужно знать, есть ли какие-либо ограничения.

Заранее спасибо.

--Дэйв


person the Hampster    schedule 24.12.2009    source источник
comment
Напоминаем, что вы должны принять ответы на свои вопросы. Это ТАК путь.   -  person Justin Johnson    schedule 13.01.2010


Ответы (6)


Я не знаю о каких-либо конкретных ограничениях размера браузера, но если вы назначаете строку длиннее 65536, Chrome разбивает ее на множество elem.childNodes, поэтому вам, возможно, придется перебирать эти узлы и объединять их.

Запустите приведенный ниже фрагмент в Chrome Dev Tools. Он создает строку размером 160 КБ, но theDivElement.childNodes[0] обрезается до 65536 символов.

var longString = '1234567890';
for (var i = 0; i < 14; ++i) {
  longString = longString + longString;
}
console.log('The length of our long string: ' + longString.length);
var elem = document.createElement('div');
elem.innerHTML = longString;
var innerHtmlValue = elem.childNodes[0].nodeValue;
console.log('The length as innerHTML-childNodes[0]: ' + innerHtmlValue.length);
console.log('Num child nodes: ' + elem.childNodes.length);

Результат: (версия Chrome 39.0.2171.95 (64-разрядная версия), Linux Mint 17)

The length of our long string: 163840
The length as innerHTML-childNodes[0]: 65536
Num child nodes: 3

Но в Firefox innerHTML не разбивает содержимое на множество узлов: (версия Firefox 34.0, Linux Mint 17)

"The length of our long string: 163840"
"The length as innerHTML-childNodes[0]: 163840"
"Num child nodes: 1"

Таким образом, вам нужно принять во внимание, что разные браузеры обрабатывают childNodes по-разному и, возможно, перебирают все дочерние узлы и объединяют их. (Я заметил это, потому что пытался использовать innerHTML для отмены экранирования > 100k HTML-кодированной строки.)

Фактически, в Firefox я могу создать innerHTML-childNodes[0] длиной 167 772 160, зациклившись на i < 24 выше. Но где-то выше этой длины возникает ошибка InternalError: allocation size overflow.

person KajMagnus    schedule 18.12.2014
comment
Вместо того, чтобы перебирать все дочерние узлы, мы можем вызвать node.normalize () метод. - person Kevin Yue; 27.12.2018

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

person Alex Reisner    schedule 24.12.2009

В приложении, над которым я сейчас работаю, у меня не было проблем ни в одном браузере, устанавливающем для innerHTML строку размером 30 КБ или более. (Не знаю, какой предел)

person Roland Bouman    schedule 24.12.2009

Единственные ограничения, которые существуют для этого типа вещей, связаны исключительно с пропускной способностью и процессором. Вы должны убедиться, что в вашем запросе ajax не установлен низкий тайм-аут. Вы также должны проверить на некоторых компьютерах с более низкой скоростью, чтобы увидеть, есть ли проблема с памятью. Некоторые старые браузеры могут не прощать больших объектов в памяти.

person Alex Sexton    schedule 24.12.2009

Вы, вероятно, захотите профилировать это с помощью такого инструмента, как dynatrace ajax или трассировщик скорости, чтобы понять, как большое значение для innerHTML влияет на производительность. Возможно, вы захотите сравнить его с другим подходом, например, с размещением нового контента в iframe или разбиением контента на страницы.

person Annie    schedule 24.12.2009
comment
Я не думал об этом ‹i›как таковом‹/i› я использую AJAX, чтобы выбирать между обзором главы 6, обзором главы 7 и т. д., но я не подумал разделить каждый обзор. Спасибо - person the Hampster; 24.12.2009

ваш лимит, скорее всего, будет лимитом загрузки, установленным с вашего веб-сервера. обычно несколько МБ. Несколько веб-фреймворков позволяют увеличить этот размер, но вы не можете просто сделать это, потому что это будет означать увеличение размера буфера, что не очень хорошо.

person Eugene Ramirez    schedule 24.12.2009