jquery - найшвидший спосіб видалити всі рядки з дуже великої таблиці


93

Я думав, що це може бути швидкий спосіб видалити вміст дуже великої таблиці (3000 рядків):

$jq("tbody", myTable).remove();

Але це займає близько п’яти секунд для завершення роботи у firefox. Я роблю щось німе (крім спроби завантажити 3000 рядків у браузер)? Чи є швидший спосіб це зробити?

Відповіді:


213
$("#your-table-id").empty();

Це так швидко, як ви отримуєте.


Мда. Розчарування. Я думаю, видалення було б набагато швидшим, ніж вставка. Начебто мені хочеться робити справді потворні речі, як-от просто приховувати стіл і створювати новий, коли я хочу його оновити.
morgancodes

10
Так, ну ... HTML не був створений для відображення 3 тис. Рядків на сторінці :) Чи не можете ви придумати жодного розбитого сторінки? Це зробило б це набагато швидше. Звичайно, це зажадає більше роботи, але це буде набагато багатший досвід для користувачів.
Себ

7
Цей хороший. Проблема в тому, що це також видалить заголовки таблиць.
isuru

3
видаляє заголовки :(
Сандіп Кушва

5
Це видалить все в таблиці, включаючи заголовки. Я припускаю, що @morgancodes хоче видалити вміст, він же рядки, а не заголовки. Для тих, хто знайде це пізніше, рішення буде $('#mytable tbody').empty();. Це гарантує, що спорожняється лише тіло.
OmniOwl

82

Краще уникати будь-яких петель, просто видаліть усі елементи безпосередньо так:

$("#mytable > tbody").html("");

6
html("")дзвонить empty()внутрішньо
Еміль Бержерон

8
Для мене приємне рішення, оскільки воно не видаляє заголовок таблиці. Дякую!
Дарія

@Daria використовує селектори повною мірою, це збереже ваші заголовки на місці: $ ('table tbody'). Empty ();
Дані

чим відрізняється використання ("#mytable> tbody") та ("#mytable tbody").
eaglei22

1
Якщо у вас є вкладена таблиця в рядок таблиці, вона також видалить ці теги tbody. Якщо у вас просто єдина таблиця, вона не повинна сильно відрізнятися.
Shiroy

6

Використання від'єднання - це величина швидше, ніж будь-яка інша відповідь тут:

$('#mytable').find('tbody').detach();

Не забудьте повернути елемент tbody назад у таблицю, оскільки від'єднання видалило його:

$('#mytable').append($('<tbody>'));  

Також зверніть увагу, що при розмові ефективність $(target).find(child)синтаксису швидша, ніж $(target > child). Чому? Сизл!

Час, що минув до спорожнення 3161 рядків таблиць

За допомогою методу Detach () (як показано в моєму прикладі вище):

  • Firefox: 0,027 с
  • Хром: 0,027 с
  • Край: 1,73 с
  • IE11: 4.02 с

За допомогою методу empty ():

  • Firefox: 0,055 с
  • Хром: 0,052 с
  • Край: 137,99 с (цілком можна заморозити)
  • IE11: Замерзає і ніколи не повертається


3

Два питання, які я можу побачити тут:

  1. Методи empty () і remove () jQuery насправді роблять досить багато роботи. Знайомства Резіг в JavaScript виклик функції Профілювання чому.

  2. Інша справа в тому , що для великої кількості табличних даних можна розглянути DataGrid бібліотеки , такі як відмінні DataTables для завантаження даних на льоту з сервера, збільшення числа Інтернет-дзвінків, але зменшення розміру цих викликів. У мене була дуже складна таблиця з 1500 рядків, яка стала досить повільною, перехід на нову таблицю на основі AJAX зробив ці самі дані видатися досить швидкими.


Дякую artlung. Роблячи щось подібне насправді, отримуючи всі дані відразу з сервера, але лише малюючи рядки таблиці, коли це потрібно.
morgancodes

Звучить як гарний дзвінок. Мені цікаво, чи турбота про кількість рядків у таблиці в браузері завжди буде проблемою, чи, якщо пам'ять для більшості комп'ютерів зростає, це буде менше проблем.
artlung

Пам'ять не є проблемою з обсягом даних, які я завантажую. Найнижче місце - це маніпуляція DOM.
morgancodes

Я думаю, ми говоримо одне і те ж. Чим більше даних ви завантажуєте, тим більше вузлів DOM ви завантажуєте, для мене це пов'язано з точки зору необхідної пам'яті. Сподіваюся, ваша ситуація покращилася, незалежно від цього.
artlung

1

якщо ви хочете видалити лише швидко .. Ви можете зробити, як показано нижче ...

$( "#tableId tbody tr" ).each( function(){
  this.parentNode.removeChild( this ); 
});

але, в таблиці можуть бути прив'язані до подій елементи,

в такому разі,

наведений вище код не запобігає витоку пам'яті в IE ... TT і не швидко в FF ...

вибачте ....


0

це працює для мене:

1- додати клас для кожного рядка "removeRow"

2 - у jQuery

$(".removeRow").remove();

-2

Ви можете спробувати це ...

var myTable= document.getElementById("myTable");
if(myTable== null)
    return;
var oTBody = myTable.getElementsByTagName("TBODY")[0];
if(oTBody== null)
    return;
try
{
    oTBody.innerHTML = "";
}
catch(e)
{
    for(var i=0, j=myTable.rows.length; i<j; i++)
        myTable.deleteRow(0);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.