Я нашел несколько разных и противоречивых ответов на эту тему.
Я создаю приложение, которое работает в основном с 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.Но я могу ошибаться, особенно если в коде этого «эталонного теста» есть ошибки или ошибки, снижающие производительность.Не стесняйтесь вносить любые изменения.
Примечание: я использовал массив join
из-за статьи, упомянутой ранее, вместо фактической конкатенации.
РЕДАКТИРОВАТЬ: Основываясь на предложении @hradac, я использовал фактическийконкатенация строк в тесте, и это действительно улучшило время.