У меня есть сомнения относительно производительности в JS.
Скажем, у меня есть следующий код:
var divContainer = document.createElement("div"); divContainer.id="container";
var divHeader = document.createElement("div"); divHeader.id="header";
var divData = document.createElement("div"); divData.id="data";
var divFooter = document.createElement("div"); divFooter.id="footer";
divContainer.appendChild( divHeader );
divContainer.appendChild( divData );
divContainer.appendChild( divFooter );
document.getElementById("someElement").appendChild( divContainer );
Этот код просто создает оболочку для некоторых других функций для создания сетки, процесс создания сетки очень сложный и со многими проверками, и в настоящее время я использую 2 метода для заполнения сетки, один из которых создает весь html в переменную массива, а другую - создание элементов и добавление их к documentFragment
.
Мой вопрос в том, действительно ли улучшается производительность при использовании фрагментов, как я их понимаю, - они управляют элементами в памяти, поэтому они не привязаны к документу, поэтому не запускают перерасчет DOM и другие неприятные вещи. Но так, как я создаю свои переменные, они не привязаны ни к одному DOM-элементу, пока я не добавлю контейнер к фактической странице.
Итак, мне было интересно, имеет ли предыдущий код лучшую производительность, чем использование фрагмента документа, который обертывает все так:
var fragment = document.createDocumentFragment();
var divContainer = document.createElement("div"); divContainer.id="container";
var divHeader = document.createElement("div"); divHeader.id="header";
var divData = document.createElement("div"); divData.id="data";
var divFooter = document.createElement("div"); divFooter.id="footer";
divContainer.appendChild( divHeader );
divContainer.appendChild( divData );
divContainer.appendChild( divFooter );
fragment.appendChild( divContainer )
document.getElementById("someElement").appendChild( fragment.cloneNode(true) );
Как я уже сказал, речь идет о производительности, я знаю, что в качестве лучшей практики рекомендуется использовать фрагменты, но я не могу сообразить из головы, что это просто создает новый объект в памяти и ничего не делает, поэтому я предполагаю, что отрыв фрагмента в этом случае действителен.
Надеюсь, что какой-нибудь js-гуру/бог будет светить здесь свет надежды и помочь нам в этом вопросе.
Изменить. Итак, я искал вещи, связанные с этой проблемой, и кажется, что documentFragments не обязательно означает лучшую производительность.
Это просто контейнер "в памяти" узлов. Разница между фрагментом и, скажем, a <div>
заключается в том, что фрагмент не имеет родителя, и он никогда не будет на DOM, только в памяти, а это означает, что операции, выполняемые над фрагментом, быстрее, поскольку нет манипуляций с DOM.
Документация W3C на documentFragments очень расплывчата, но, к тому же, каждый любимый браузер не использует реальные фрагменты, вместо этого он создает новый документ в соответствии с эту документацию MSDN. Это означает, что фрагменты в IE медленнее.
Итак, вопрос превалирует, , если я создаю элемент (a <div>
, например) в переменной, но НЕ ПРИНИМАЙТЕ В DOM, добавьте элементы (divs, tables и т.д.) и т.д. и после выполнения всей работы (циклы, проверки, стилизация элементов), этот элемент добавлен, то же самое, что и фрагмент?
Учитывая тот факт, что IE использует "фальшивый" фрагмент, я бы сказал, по крайней мере, в IE, используя этот подход (используя такой элемент, как div, а не фрагмент), лучше, я действительно не забочусь о IE, но Мне нужно проверить его (офисная политика).
Кроме того, если я создам все html в массиве, например:
var arrHTML = ["<table>","<tr>", ....];
а затем сделайте это
document.getElementById("someElement").innerHTML = arrHTML.join("");
Он быстрее работает в IE, но другие основные браузеры (FF, Chrome, Safari и Opera) работают лучше при использовании контейнера, а затем добавляют его (фрагмент или div).
Все это связано с тем, что процесс создания всех элементов выполняется очень быстро, около 8-10 секунд, чтобы создать до 20 000 строк с 24 столбцами, много элементов/тегов, но браузер, похоже, несколько секунд, когда все они добавлены сразу, если я попытаюсь добавить их один за другим, это ад.
Спасибо, ребята, это действительно интересно и весело.