Я нашел несколько разных и противоречивых ответов на эту тему.
Я создаю приложение, которое работает в основном с html, динамически генерируемым jQuery, на основе результатов, полученных из базового API в виде данных JSON.
Мне сказали некоторые из моих коллег (лично), что лучший способ - сделать что-то вроде этого:
var ul = $("<ul>").addClass("some-ul");
$.each(results, function(index) {
ul.append($("<li>").html(this).attr("id", index));
});
$("body").append($("<div>").attr("id", "div-id").addClass("some-div").append(ul));
и т.д.. Причина, по которой мне говорили, что "обновляет DOM напрямую, а не анализирует html для достижения этого".
Однако, я вижу много кода, подобного этому (тот же пример):
var toAppend = '<div class="some-div" id="div-id"><ul>';
$.each(results, function(index) {
toAppend += '<li id="' + index + '">' + this + '</li>';
});
toAppend += '</ul></div>'
Что я лично считаю не таким элегантным, но лучше ли? Я просмотрел этот вопрос за пару минут и нашел эту статью. В основном, речь идет об увеличении производительности, используя конкатенацию строк - мой "второй способ".
Основная проблема этой статьи в том, что она была выпущена в 2009 году и обсуждена версия jQuery 1.3. Сегодня текущая версия - версия 1.6.4, которая может вести себя совершенно по-другому. И это вопрос большинства статей по теме, которые я уже нашел, и я также как-то подозрительно отношусь к их достоверности.
Вот почему я решил задать здесь вопрос и спросить - какой метод генерации DOM на самом деле является правильным, исходя из производительности?
ВАЖНАЯ ИНФОРМАЦИЯ:
Я написал небольшой ориентир, чтобы проверить, какой подход лучше рассматривает производительность.
jsFiddle - версия конкатенации
jsFiddle - версия объединения массивов
код:
var text = "lorem ipsum";
var strings = $("#strings");
var objects = $("#objects");
var results = $("#results");
// string concatenation
var start = new Date().getTime();
var toAppend = ['<div class="div-class" id="div-id1"><ul class="ul-class" id="ul-id1">'];
for (var i = 1; i <= 20000; i++) {
toAppend[i] = '<li class="li-class" id="li-id1-' + i + '">' + text + '</li>';
}
toAppend[i++] = '</ul></div>';
results.append(toAppend.join(""));
strings.html(new Date().getTime() - start);
// jquery objects
var start = new Date().getTime();
var ul = $("<ul>").attr("id", "ul-id2").addClass("ul-class");
for (var i = 0; i < 20000; i++) {
ul.append($("<li>").attr("id", "li-id2-" + i).addClass("li-class"));
}
results.append($("<div>").attr("id", "div-id2").addClass("div-class").append(ul));
objects.html(new Date().getTime() - start);
Кажется, что работа с строками выполняется быстрее (в Firefox 7 примерно 7 раз), чем с использованием объектов и методов jQuery. Но я могу ошибаться, особенно если в этом "контрольном" коде есть ошибки или снижение производительности. Не стесняйтесь вносить какие-либо изменения.
Примечание. Я использовал Array join
из-за статьи, упомянутой ранее, вместо фактической конкатенации.
EDIT: на основе предложения от @hradac я использовал фактическую конкатенацию строк в эталонном тесте, и он действительно улучшил время.