Каков наиболее эффективный способ создания HTML-элементов с использованием jQuery?

379

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

$("<div></div>");

Однако у меня возникает ощущение, что это не лучший или самый эффективный способ сделать это. Каков наилучший способ создания элементов в jQuery с точки зрения производительности?

В этом ответе приведены ориентиры ниже.

  • 1
    Поэкспериментируйте также с удалением стилей и посмотрите, ускоряет ли это процесс. Я считаю, что CSS-приложения и обновления больше всего меня замедляют на больших страницах.
  • 3
    Остерегайтесь преждевременной оптимизации - если вы не делаете это для сотен элементов DOM одновременно или используете ОЧЕНЬ старые браузеры, то вы, вероятно, не заметите никакой разницы в производительности браузера.
Показать ещё 7 комментариев
Теги:
dom

13 ответов

281
Лучший ответ

Я использую $(document.createElement('div')); Бенчмаркинг показывает, этот метод является самым быстрым. Я предполагаю, что это потому, что jQuery не нужно идентифицировать его как элемент и создать сам элемент.

Вы должны действительно запускать тесты с разными механизмами Javascript и взвешивать свою аудиторию с результатами. Примите решение оттуда.

  • 14
    jQuery «добавляет» его в DOM? Куда? Это не имеет большого смысла для меня - куда делись div?
  • 25
    созданный div в jquery должен быть добавлен так же, как в javascript. $ ('<div>') сам по себе не присоединен к DOM, пока вы не добавите его к чему-либо.
Показать ещё 9 комментариев
164

лично я бы предложил (для читаемости):

$('<div>');

некоторые цифры в предложениях (сафари 3.2.1/mac os x):

var it = 50000;

var start = new Date().getTime();
for (i = 0; i < it; ++i)  {
  // test creation of an element 
  // see below statements
}
var end = new Date().getTime();
alert( end - start );                

var e = $( document.createElement('div') );  // ~300ms
var e = $('<div>');                          // ~3100ms
var e = $('<div></div>');                    // ~3200ms
var e = $('<div/>');                         // ~3500ms              
  • 14
    Из документации jquery: «При создании отдельных элементов используйте закрывающий тег или формат XHTML. Например, чтобы создать диапазон, используйте $ ("<span />") или $ ("<span> </ span>") вместо закрывающей косой черты / тега. '
  • 1
    я предположил, что это было устаревшим, поскольку метод, который я описываю, создает так же, как действительный XHTML например: var e = $ ('<div>'). append ($ ('<div>')). html (); оповещение (е); Есть ли другие метрики, которые сделали бы этот метод неблагоприятным для использования?
Показать ещё 6 комментариев
130

Вопрос:

Каков наиболее эффективный способ создания элементов HTML с помощью jQuery?

Ответ:

Так как это около jQuery, то я думаю, что лучше использовать этот (чистый) подход (вы используете)

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'text':'Text Only',
}).on('click', function(){
    alert(this.id); // myDiv
}).appendTo('body');

DEMO.

Таким образом, вы можете даже использовать обработчики событий для определенного элемента, например

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'style':'cursor:pointer;font-weight:bold;',
    'html':'<span>For HTML</span>',
    'click':function(){ alert(this.id) },
    'mouseenter':function(){ $(this).css('color', 'red'); },
    'mouseleave':function(){ $(this).css('color', 'black'); }
}).appendTo('body');

DEMO.

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

$(document).on('click', '.myClass', function(){
    alert(this.innerHTML);
});

var i=1;
for(;i<=200;i++){
    $('<div/>', {
        'class':'myClass',
        'html':'<span>Element'+i+'</span>'
    }).appendTo('body');
}

DEMO.

Итак, если вы создаете и добавляете сотни элементов с одним классом, то есть (myClass), то для обработки событий будет потребляться меньше памяти, так как для всех динамически вставленных элементов будет выполняться только один обработчик.

Обновление:. Поскольку мы можем использовать следующий подход для создания динамического элемента

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    'size': '30'
}).appendTo("body");

Но атрибут size не может быть установлен с использованием этого подхода с использованием jQuery-1.8.0 или более поздней версии, а вот старый отчет об ошибке, посмотрите этот пример, используя jQuery-1.7.2, который показывает, что атрибут size имеет значение 30, используя приведенный выше пример, но используя тот же подход, t установите атрибут size, используя jQuery-1.8.3, здесь неработающая скрипка. Итак, чтобы установить атрибут size, мы можем использовать следующий подход

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    attr: { size: "30" }
}).appendTo("body");

Или этот

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    prop: { size: "30" }
}).appendTo("body");

Мы можем передать attr/prop в качестве дочернего объекта, но он работает в версиях jQuery-1.8.0 and later, проверьте этот пример, но он не работает в jQuery-1.7.2 or earlier (не тестируется во всех более ранних версиях).

BTW, взятый из отчета об ошибке jQuery

Существует несколько решений. Во-первых, не использовать его вообще, поскольку это не спасает вас от какого-либо пространства, и это улучшает ясность код:

Они посоветовали использовать следующий подход (также работает в более ранних версиях, проверенный в 1.6.4)

$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");

Итак, лучше использовать этот подход, ИМО. Это обновление сделано после того, как я прочитал/нашел этот ответ, и в этом ответе показано, что если вы используете 'Size'(capital S) вместо 'size', тогда это будет просто работает отлично, даже в version-2.0.2

$('<input>', {
    'type' : 'text',
    'Size' : '50', // size won't work
    'autofocus' : 'true'
}).appendTo('body');

Также читайте о prop, потому что есть разница, Attributes vs. Properties, он варьируется в зависимости от версий.

  • 0
    Что это за синтаксис $ ('<div />', {.........}), я его искал и нашел похожее, используя $ ('<div>). Attr ( {......})?
  • 0
    @RafaelRuizTabares, в $('<div>', {...}) вы передаете объект, который содержит все атрибуты, а в $('<div>').attr({...}) вы создаете элемент без каких-либо атрибутов, но устанавливающий атрибуты позже методом attr() .
Показать ещё 3 комментария
36

Собственно, если вы выполняете $('<div>'), jQuery также будет использовать document.createElement().

(Посмотрите строка 117).

Существует некоторая служебная нагрузка на функциональные вызовы, но если производительность не является критичной (вы создаете сотни [тысяч] элементов), нет никаких оснований возвращаться к простой DOM.

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

20

Это не правильный ответ на вопрос, но все же я хотел бы поделиться этим...

Используя только document.createElement('div') и пропуская JQuery, вы значительно улучшите производительность, если хотите сделать много элементов "на лету" и добавить в DOM.

20

Если у вас много контента HTML (больше, чем просто один div), вы можете подумать о создании HTML-страницы на странице в скрытом контейнере, а затем обновить ее и сделать ее видимой при необходимости. Таким образом, большая часть вашей разметки может быть предварительно проанализирована браузером и не будет зависеть от JavaScript при вызове. Надеюсь, это поможет!

  • 0
    Спасибо за совет. Я использовал этот подход ранее, однако в данном конкретном случае я специально хочу знать о создании элементов.
15

Я думаю, что вы используете лучший метод, хотя можете оптимизировать его:

 $("<div/>");
11

Вам не нужна сырая производительность от операции, которую вы будете выполнять крайне редко с точки зрения процессора.

  • 0
    Зависит от того, как часто вы это делаете.
  • 8
    ОП создает модальное всплывающее окно . Эта операция не повторяется тысячи раз в секунду. Вместо этого это повторяется, возможно, раз в несколько секунд, максимум. Использование метода jQuery(html :: String) прекрасно. Если ситуация не является чрезвычайно необычной, вряд ли кто-то достигнет лучшего восприятия производительности. Потратьте энергию оптимизации на случаи, которые могли бы использовать его. Кроме того, JQuery оптимизирован для скорости во многих отношениях. Делайте с ним что-то вменяемое и доверяйте, но проверяйте, что это быстро.
9

Вам нужно понять, что значение производительности создания элемента не имеет значения в контексте использования jQuery в первую очередь.

Имейте в виду, что нет реальной цели создания элемента, если вы на самом деле его не используете.

У вас может возникнуть соблазн выполнить тест производительности, например $(document.createElement('div')) vs. $('<div>'), и получить отличную производительность от использования $(document.createElement('div')), но это только элемент, который еще не находится в DOM.

Однако, в конце дня, вы захотите использовать элемент в любом случае, поэтому настоящий тест должен включать f.ex..appendTo();

Посмотрим, если вы проверите следующее друг против друга:

var e = $(document.createElement('div')).appendTo('#target');
var e = $('<div>').appendTo('#target');
var e = $('<div></div>').appendTo('#target');
var e = $('<div/>').appendTo('#target');

Вы заметите, что результаты будут разными. Иногда один из способов лучше, чем другой. И это только потому, что количество фоновых задач на вашем компьютере меняется со временем.

Проверьте себя здесь

Итак, в конце дня вы хотите выбрать наименьший и наиболее читаемый способ создания элемента. Таким образом, по крайней мере, ваши файлы script будут минимальными. Вероятно, это более важный фактор производительности, чем способ создания элемента, прежде чем использовать его в DOM.

  • 0
    Я знаю, что это старый, но в первом примере нет необходимости в jQuery: document.getElementById('target).appendChild(document.createElement('div'));
8

Кто-то уже сделал контрольный показатель: jQuery document.createElement эквивалент?

$(document.createElement('div')) является большим победителем.

7

Одно дело, что это может быть проще сделать:

$("<div class=foo id=bar style='color:white;bgcolor:blue;font-size:12pt'></div>")

Затем сделать все это с помощью jquery-вызовов.

3

Я использую jquery.min v2.0.3. Для меня лучше использовать следующее:

var select = jQuery("#selecter");
jQuery("`<option/>`",{value: someValue, text: someText}).appendTo(select);

следующим образом:

var select = jQuery("#selecter");
jQuery(document.createElement('option')).prop({value: someValue, text: someText}).appendTo(select);

Время обработки первого кода намного ниже второго кода.

-1

Предположим, что у нас есть сценарий для динамического замены содержимого HTML-тегами для форматирования, мы не можем использовать $('#id').text();, потому что он не примет текст с html, отформатированным как жирный текст, чтобы для этого нам нужно использовать jQuery append, но как альтернативу методу .text() просто пустое время, когда нам нужно обновлять и использовать метод append.

var fileImportStatus;
$('#id').change(function() {
    if ($('#id').is(':checked')) {
        fileImportStatus = "<strong>ON</strong>";
    } else {
        fileImportStatus = "<strong>OFF</strong>";
    }
});
$('#saveBtn').click(function() {
    $('#fileImportStatusTxt').empty();
    $('#fileImportStatusTxt').append('File Import is ' + fileImportStatus);
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню