Быстрый DOM |
|
Работа с DOM-деревом в JavaScript является самым проблематичным местом. Его можно сравнить только разве что с базой данных для серверных приложений. Если JavaScript выполняется очень долго, скорее всего, дело именно в DOM-методах. Ниже рассмотрено несколько прикладных моментов, то есть способов максимально ускорить этот «затор».
|
|
Браузер |
Нормальный |
Fragment |
|
Firefox 3.0.1 |
90 |
47 |
|
Safari 3.1.2 |
156 |
44 |
|
Opera 9.51 |
208 |
95 |
|
IE 6 |
401 |
140 |
|
IE 7 |
230 |
61 |
|
IE 8b1 |
120 |
40 |
А если еще быстрее?
Давайте подумаем еще немного. Зачем нам каждый раз создавать фрагмент документа, если мы для этой цели можем использовать обычный его узел (фактически, создавать кэш нашего узла, который мы собираемся везде менять)? Так можно прийти к следующему фрагменту кода:
var div = document.getElementsByTagName("div");
var child = document.createElement("div");
var parent = div[0].parentNode;
for ( var e = 0; e < elems.length; e++ ) {
child.appendChild( elems[e].cloneNode(true) );
}
for ( var i = 0; i < div.length; i++ ) {
// для IE
if (IE) {
parent.replaceChild(child.cloneNode(true),div[i]);
// для других браузеров
} else {
div[i] = child.cloneNode(true);
}
}
В нем соответствующие узлы документа заменяются на клонированный вариант кэшированной версии (без создания DocumentFragemnt). Это работает еще быстрее (везде, кроме IE - примерно на порядок, в IE - в полтора-два раза).
innerHTML нам поможет
Чтобы уменьшить отрисовку отдельных частей документа в процессе добавления какого-либо большого фрагмента, мы можем сохранять HTML-код в виде текста и лишь на финальном этапе вставлять его в DOM-дерево. Давайте рассмотрим следующий пример:
var i, j, el, table, tbody, row, cell;
el = document.createElement("div");
document.body.appendChild(el); table = document.createElement("table");
el.appendChild(table);
tbody = document.createElement("tbody");
table.appendChild(tbody);
for (i = 0; i < 1000; i++) {
row = document.createElement("tr");
for (j = 0; j < 5; j++) {
cell = document.createElement("td");
row.appendChild(cell);
}
tbody.appendChild(row);
}
Его можно значительно ускорить, если добавлять узлы не последовательно один за другим, а сначала создав HTML-строку со всем необходимым кодом, которая будет вставлена через innerHTML в конце всех операций.
В данном примере кроме уже указанного ускорения еще используется первоначальное создание массива элементов, которые можно объединить через свойство join в строку. Для больших строк это работает быстрее, чем последовательная конкатенация отдельных частей.
var i, j, el, idx, html;
idx = 0; html = [];
html[idx++] = "<table>";
for (i = 0; i < 1000; i++) {
html[idx++] = "<tr>";
for (j = 0; j < 5; j++) {
html[idx++] = "<td></td>";
}
html[idx++] = "</tr>";
}
html[idx++] = "</table>";
el = document.createElement("div");
document.body.appendChild(el);
el.innerHTML = html.join("");
| < Предыдущая | Следующая > |
|---|
Алгоритм НаходкаТестирование новой версии алгоритма Яндекса началось 9 июля 2008 года. По заявлениям Яндекса, «основные изменения в программе связаны с новым подходом к машинному обучению и, как следствие, отличиями в способе учета факторов ранжирования в формуле». Читать полностью |
Поисковики фильтруют ссылкиНепот - это нелегальная "взаимовыручка" среди оптимизаторов сайтов. Например, веб-ресурс А поставил ссылку на сайт Б по дружбе или за деньги, а тот в ответ разместил ссылку на свой сайт. Врезультате оба ресурса стали "более весомыми". Скажите, что этокольцевой линкообмен? Это не так. При кольцевом обмене, прежде всего,учитывается контент - сайты обмениваются ссылками, потому что считают,что... Читать полностью |
Алгоритм Арзамас10 апреля 2009, сразу в основном поиске, без выкладки на тестовый, в Яндексе заработала поисковая программа Арзамас. Читать полностью |
Навигационные запросыПримерно каждый десятый запрос к Яндексу – «навигационный», то есть состоит из названия организации или сайта и пользователь хочет перейти на сайт этой организации. В этом случае поисковая строка Яндекса используется вместо адресной строки браузера и остальные девять поисковых результатов пользователя, как правило, не интересуют. Не отвлекая пользователя от главной цели, мы добавили после... Читать полностью |
