jquery .html () vs .append ()


248

Скажімо, у мене порожній div:

<div id='myDiv'></div>

Це є:

$('#myDiv').html("<div id='mySecondDiv'></div>");

Такий же як і:

var mySecondDiv=$("<div id='mySecondDiv'></div>");
$('#myDiv').append(mySecondDiv);

21
ні, у другого немає ідентифікатора, тому той самий текст не виводиться.
Метт Еллен

.html набагато швидше після першого запуску. це може зайняти друге або близько того, коли ви запустите його вперше.
sukhjit dhot

Відповіді:


316

Щоразу, коли ви передаєте рядок HTML будь-якому із методів jQuery, це відбувається так:

Створюється тимчасовий елемент, назвемо його x. x's innerHTMLвстановлюється у рядок HTML, який ви передали. Тоді jQuery передасть кожен із створених вузлів (тобто х childNodes) на новостворений фрагмент документа, який він буде кешувати наступний раз. Потім поверне фрагмент childNodesяк свіжу колекцію DOM.

Зауважте, що насправді це набагато складніше, ніж це, тому що jQuery робить купу перевірок між браузерами та різні інші оптимізації. Наприклад, якщо ви переходите просто <div></div>до jQuery(), jQuery візьме ярлик і просто зробить document.createElement('div').

EDIT : Щоб побачити велику кількість перевірок, які виконує jQuery, подивіться тут , тут і тут .


innerHTMLце, як правило, швидший підхід, хоча не дозволяйте цьому керувати тим, що ви робите постійно. Підхід jQuery не такий простий, як element.innerHTML = ...- як я вже згадував, відбувається купа перевірок та оптимізацій.


Правильна техніка сильно залежить від ситуації. Якщо ви хочете створити велику кількість однакових елементів, то останнє, що ви хочете зробити, - це створити масивний цикл, створивши новий об'єкт jQuery на кожній ітерації. Наприклад, найшвидший спосіб створити 100 дівів за допомогою jQuery:

jQuery(Array(101).join('<div></div>'));

Також слід враховувати питання читабельності та обслуговування.

Це:

$('<div id="' + someID + '" class="foobar">' + content + '</div>');

... набагато складніше в обслуговуванні, ніж це:

$('<div/>', {
    id: someID,
    className: 'foobar',
    html: content
});

5
jQuery (Array (101) .join ('<div> </div>')); <- чому 101 замість 100?
таконе

2
Просто хотів додати точку даних. Провівши тестування продуктивності на додатку, який завантажує велику партію (10K +) <li> в <ul> і побачив збільшення часу візуалізації (не завантаження) з ~ 12s -> .25s шляхом переключення .append ( giantListHTMLAsASingleString) to .html (giantListHTMLAsASingleString). Якщо ви вже збираєтесь робити трюк "приєднатися" або збираєте велику HTML-рядок у своєму списку, напевно у цих двох методів є певна різниця.
омніс

9
@tacone Тому що з'єднувальний "клей" наноситься між елементами масиву. 101матиме 100 клеїв застосовуються, так само , як приєднання 3 елементи матиме 2 клеїв: EL-glue-EL-glue-EL. У прикладі Джеймса елементи масиву "порожні", тому приєднання до N порожніх елементів призводить до отримання N-1 послідовних клеїв.
Fabrício Matté

5
Для тих, хто цікавиться посиланням на синтаксис jquery, що використовується вище, і те, що дозволено, див. Api.jquery.com/jquery/#jQuery-html-attributes .
Тадеус Альберс

1
Існує велика різниця в тому, що він втрачає будь-які дані, прикріплені до дітей.
Адріан Варфоломій

68

Вони не однакові. Перший замінює HTML, не створюючи спочатку іншого об'єкта jQuery. Другий створює додатковий оболонку jQuery для другого діла, потім додає його до першого.

Один пакунок jQuery (на приклад):

$("#myDiv").html('<div id="mySecondDiv"></div>');

$("#myDiv").append('<div id="mySecondDiv"></div>');

Два обгортки jQuery (на приклад):

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').html(mySecondDiv);

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').append(mySecondDiv);

У вас є кілька різних випадків використання. Якщо ви хочете замінити вміст, .htmlце чудовий дзвінок, оскільки його еквівалент innerHTML = "...". Однак, якщо ви просто хочете додати вміст, додатковий $()набір обгортки зайвий .

Використовуйте дві обгортки, лише якщо вам потрібно буде маніпулювати доданими divпізніше. Навіть у такому випадку вам може знадобитися лише один:

var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");
// other code here
mySecondDiv.hide();

Розумієш? Зв'язок рядків вже допущений до помилки тут (несказована цитата). дивіться мій пост: P
kizzx2

20

якщо .addви маєте на увазі .append, то результат такий самий, якщо #myDivпорожній.

продуктивність однакова? не знаю.

.html(x) закінчується робити те саме, що і .empty().append(x)


Крім того, перший очевидно матиме ідентифікатор mySecondDiv, тоді як другий не матиме ідентифікатора. І синтаксис повинен бути .html ("<div id = 'mySecondDiv'> </div>"), використовуючи подвійні лапки, щоб мати можливість використовувати одиничні лапки.
ryanulit


7

Ви можете отримати другий метод для досягнення такого ж ефекту:

var mySecondDiv = $('<div></div>');
$(mySecondDiv).find('div').attr('id', 'mySecondDiv');
$('#myDiv').append(mySecondDiv);

Лука зазначив, що html()просто вставляє hte HTML, що призводить до більш швидкої роботи.

Однак у деяких випадках ви вирішите вибрати другий варіант:

// Clumsy string concat, error prone
$('#myDiv').html("<div style='width:'" + myWidth + "'px'>Lorem ipsum</div>");

// Isn't this a lot cleaner? (though longer)
var newDiv = $('<div></div>');
$(newDiv).find('div').css('width', myWidth);
$('#myDiv').append(newDiv);

5
Це вкрай неефективний (і зламаний) код jQuery. Якщо ви хочете уникнути конкатенації, зробіть це: (також примітка pxне потрібна):$('<div />', { width: myWidth }).appendTo("#myDiv");
Doug Neiner

3
Як це "не корисно"? Плакат попросив "різницю" (ключове слово "проти"), тому я кажу йому різницю. Код є багатослівним, але я б не сказав "неефективним" лише тому, що справа не в одному вкладиші. Чи не повинні ми бути багатослівними, коли роз'яснювати речі людям?
kizzx2

3

.html() замінить усе.

.append() просто додаватиметься наприкінці.


2

Окрім наведених відповідей, якщо у вас є щось подібне:

<div id="test">
    <input type="file" name="file0" onchange="changed()">
</div>
<script type="text/javascript">
    var isAllowed = true;
    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = $('#test').html();
            tmpHTML += "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').html(tmpHTML);
            isAllowed = false;
        }
    }
</script>

Це означає, що ви хочете автоматично додати ще одне завантаження файлу, якщо були завантажені будь-які файли, згаданий код не буде працювати, оскільки після завантаження файлу перший елемент завантаження файлу буде відтворений, і тому завантажений файл буде стертий з нього . Ви повинні використовувати .append () замість цього:

    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').append(tmpHTML);
            isAllowed = false;
        }
    }

0

Це сталося зі мною. Версія Jquery: 3.3. Якщо ви переглядаєте список об'єктів і хочете додати кожен об'єкт як дочірній елемент якогось батьківського елемента dom, то .html та .append будуть вести себе дуже різними. .htmlв кінцевому підсумку додасть лише останній об'єкт до батьківського елемента, тоді як .appendдодасть усі об'єкти списку як дочірні батьківські елементи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.