ограничение размера innerHTML - PullRequest
1 голос
/ 24 декабря 2009

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

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

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

- Dave

Ответы [ 6 ]

4 голосов
/ 18 декабря 2014

Я не знаю ни о каких ограничениях размера браузера, но если вы назначите строку длиннее 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 не разбивает содержимое на множество узлов: (FF версия 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.

1 голос
/ 24 декабря 2009

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

1 голос
/ 24 декабря 2009

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

0 голосов
/ 24 декабря 2009

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

0 голосов
/ 24 декабря 2009

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

0 голосов
/ 24 декабря 2009

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

...