2013-04-17 4 views
4

У меня есть таблица, содержащая около 1500 строк.Производительность: jQuery remove() vs JavaScript removeChild()

Я удаляю таблицу из DOM с помощью следующего кода JQuery:

$('#myTable').remove(); 

который занимает около 300 мс, создавая весьма заметное отставание.

делая то же самое с RemoveChild():

var myTable = $('#myTable')[0] ; 
myTable.parentNode.removeChild(myTable); 

занимает около 30 мс.

Я могу легко использовать версию removeChild(), но я был озадачен, почему jQuery's remove() займет гораздо больше времени? Является ли версия removeChild() не очищающим то, что jQuery?

Демо: jspref

+0

После прочтения @ dystroy я пошел искать инструмент источника jQuery. Здесь есть отличный источник: http://james.padolsey.com/jquery/ – Kong

ответ

8

От the documentation:

Кроме самих элементов, все связанные события и JQuery данные, связанные с элементами, удаляются.

Это означает:

  • , что эта функция делает некоторую дополнительную работу (в основном называя cleanData для себя и Чайлдс)
  • , что вы обычно должны использовать его, чтобы избежать утечки памяти

Это явно указывается в исходном коде:

remove: function(selector, keepData) { 
    var elem, 
     i = 0; 

    for (; (elem = this[i]) != null; i++) { 
     if (!selector || jQuery.filter(selector, [ elem ]).length > 0) { 
      if (!keepData && elem.nodeType === 1) { 
       jQuery.cleanData(getAll(elem)); 
      } 

      if (elem.parentNode) { 
       if (keepData && jQuery.contains(elem.ownerDocument, elem)) { 
        setGlobalEval(getAll(elem, "script")); 
       } 
       elem.parentNode.removeChild(elem); 
      } 
     } 
    } 

    return this; 
} 
+0

Почему только часть ответа? – Bergi

+0

@ Bergi Я отредактировал. Всегда есть накладные расходы, связанные с работой jQuery. Но это не очень интересно, поэтому я упростил формулировку. –

+0

Спасибо! Это четко объясняет разницу во времени. Интересно, можно ли безопасно обойти cleanData()? У меня нет событий jQuery против этого элемента. – Kong

Смежные вопросы