Видалити всі рядки таблиці HTML


99

Як я можу видалити всі рядки таблиці HTML, крім тих <th>, що використовують Javascript, і не перебираючи всі рядки таблиці? У мене дуже величезна таблиця, і я не хочу заморожувати інтерфейс, поки я переглядаю рядки, щоб їх видалити


2
Має бути цикл, немає команди "delete-multiple-elements", метод removeChildприймає лише один елемент DOM.
Šime Vidas

@SLaks припускаючи, що він мав на увазі рядок, що містить рядки заголовків
Eonasdan

Відповіді:


92

Зберігайте <th>рядок в а, <thead>а інші рядки в, а <tbody>потім замініть на <tbody>новий, порожній.

тобто

var new_tbody = document.createElement('tbody');
populate_with_new_rows(new_tbody);
old_tbody.parentNode.replaceChild(new_tbody, old_tbody)

Це найефективніше рішення за умови, звичайно, якщо розробнику JavaScript дозволено змінювати HTML.
Blazemonger

1
Обережно, якщо ви збираєтеся замінити тіло за допомогою властивості innerHTML, це не буде працювати в IE, однак є обхідне рішення.
aziz punjani

2
@Eonasdan - Це дещо суб'єктивно. Існує безліч бібліотек (моїми особистими уподобаннями було б використовувати YUI 3 в наші дні), якщо хтось із цією проблемою захоче вирішити цю проблему з однією з них. Принципи будуть однаковими, незалежно від того, який величезний шматок стороннього коду ви хочете включити.
Квентін,

3
Некромантування цього ... в чому document.getElementById('tbody').innerHTML = '';
проблема

2
@ Trees4theForest Для мене це прекрасно працює. Можливо, це було неможливо на час ОП.
Мабу

94

це видалить всі рядки:

$("#table_of_items tr").remove(); 

40
Якщо ви не хочете видаляти заголовок: $ ("# table_of_items tbody tr"). Remove ();
TTT

1
Дуже хороша проста відповідь. Я використовував у своєму CoffeeScript - мені подобаються однорядкові рішення$("tbody#id tr").remove()
n2o

Я думаю, що це краща відповідь, ніж прийнята, хоча це залежить від того, чи хочете ви використовувати JQuery чи ні. Але якось .remove не працювало в Chrome.
Milind Thakkar

TTT, використовуйте теги <thead><th></th> </thead> для створення заголовка для таблиці. Тоді $ ("# table_of_items tr"). Remove (); добре працює для вас, оскільки він видаляє лише <tr> теги.
Кейт

TTT, будь ласка, додай свій коментар до відповіді. Ваша відповідь ідеальна!
Хоршид

57

Дуже грубо, але це також працює:

var Table = document.getElementById("mytable");
Table.innerHTML = "";

9
На жаль, це не тримає заголовків <th>, як просить ОП.
JoSeTe4ever 01.03.16

1
Це відбувається, якщо вони розміщують свої заголовки, <th> вкладені в <thead>. Це, мабуть, найбільш синтаксично правильний спосіб побудови таблиці.
Джон Блек

Чудово працює. Я думаю, що це підходить лише таким людям, як я, які створили заголовок таблиці, рядок, комірку та все в JQuery.
Шамсул Арефін Саджиб

Це добре працювало для простого очищення html всередині тіла :)
RudyOnRails

Я очистив лише тіло з невеликою модифікацією цього var bodyRef = document.getElementById('myTable').getElementsByTagName('tbody')[0]; bodyRef.innerHTML = '';
azyth

17

Це давнє запитання, проте нещодавно у мене було подібне питання.
Я написав цей код для його вирішення:

var elmtTable = document.getElementById('TABLE_ID_HERE');
var tableRows = elmtTable.getElementsByTagName('tr');
var rowCount = tableRows.length;

for (var x=rowCount-1; x>0; x--) {
   elmtTable.removeChild(tableRows[x]);
}

Це призведе до видалення всіх рядків, крім першого.

Ура!


9
коротший (і швидший): var rowCount = myTable.rows.length; while (- rowCount) myTable.deleteRow (rowCount);
Петро

Код у коментарі вище не видаляє перший рядок
PrfctByDsgn

16

Вказівки на поширені помилки :

Якщо ваш початковий індекс дорівнює 0 (або якийсь індекс від початку), то правильний код:

var tableHeaderRowCount = 1;
var table = document.getElementById('WRITE_YOUR_HTML_TABLE_NAME_HERE');
var rowCount = table.rows.length;
for (var i = tableHeaderRowCount; i < rowCount; i++) {
    table.deleteRow(tableHeaderRowCount);
}

ПРИМІТКИ

1. аргумент для deleteRow виправлений,
це потрібно, оскільки, коли ми видаляємо рядок, кількість рядків зменшується.
тобто; до моменту, коли я досягнув (рядки. довжина - 1), або навіть до того, як цей рядок уже видалений, тож у вас буде якась помилка / виняток (або тихий).

2. rowCount береться перед початком циклу for оскільки, коли ми видаляємо "table.rows.length", буде продовжувати змінюватися, тому знову виникає проблема, через яку видаляються лише непарні чи парні рядки.

Сподіваюся, що це допомагає.


10

Припускаючи, що у вас є лише одна таблиця, щоб ви могли посилатися на неї лише з типом. Якщо ви не хочете видаляти заголовки:

$("tbody").children().remove()

інакше:

$("table").children().remove()

сподіваюся, це допоможе!


7

Мені потрібно було видалити всі рядки, за винятком першого та рішення, опублікованого @strat, але це призвело до непоміченого винятку (посилання на Node в контексті, де він не існує). У мене працювало наступне.

var myTable = document.getElementById("myTable");
var rowCount = myTable.rows.length;
for (var x=rowCount-1; x>0; x--) {
   myTable.deleteRow(x);
}

7

Якщо ви можете проголосити IDдля tbodyвас може просто почати його використання:

var node = document.getElementById("tablebody");
while (node.hasChildNodes()) {
  node.removeChild(node.lastChild);
}

5

це спрацювало б ітераційне видалення в таблиці HTML на рідному

document.querySelectorAll("table tbody tr").forEach(function(e){e.remove()})

5

наведений нижче код чудово працює. Він видаляє всі рядки, крім рядка заголовка. Отже, цей код справді t

$("#Your_Table tr>td").remove();

3
почекайте, це відповідь jQuery, оригінальне запитання не задавало спеціально рішення jQuery!
revelt

4

Присвоєння якогось ідентифікатора тегу tbody. тобто Після цього в наступному рядку слід зберегти верхній / нижній колонтитул таблиці та видалити всі рядки.

document.getElementById("yourID").innerHTML="";

І якщо ви хочете, щоб вся таблиця (верхній / нижній колонтитул) була знищена, встановіть ідентифікатор на рівні таблиці, тобто


3

Якщо ви не хочете видаляти, thа просто хочете видалити всередині рядки, це працює чудово.

var tb = document.getElementById('tableId');
  while(tb.rows.length > 1) {
  tb.deleteRow(1);
}

3

Як щодо цього:

Коли сторінка завантажується вперше, зробіть наступне:

var myTable = document.getElementById("myTable");
myTable.oldHTML=myTable.innerHTML;

Тоді, коли ви хочете очистити таблицю:

myTable.innerHTML=myTable.oldHTML;

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


дуже елегантне рішення
ревельт

2

Якщо у вас набагато менше <th>рядків, ніж не <th>рядків, ви можете зібрати всі <th>рядки у рядок, видалити всю таблицю, а потім написати <table>thstring</table>там, де раніше була таблиця.

EDIT: Де, очевидно, "thstring" - це html для всіх рядків <th>s.


1
Швидше, зберіть <th>s як елементи DOM, очистіть внутрішній HTML таблиці, а потім знову додайте <th>s до нього.
entonio

Будьте обережні, якщо ви збираєтеся замінити clear tbody за допомогою властивості innerHTML, він не працюватиме в IE, хоча існує спосіб вирішення.
aziz punjani

2

Це працює в IE, навіть не потрібно оголошувати змінну для таблиці, і буде видалено всі рядки:

for(var i = 0; i < resultsTable.rows.length;)
{   
   resultsTable.deleteRow(i);
}

1

це простий код, який я щойно написав, щоб вирішити це, не видаляючи рядок заголовка (перший).

var Tbl = document.getElementById('tblId');
while(Tbl.childNodes.length>2){Tbl.removeChild(Tbl.lastChild);}

Сподіваюся, це працює для вас !!.


1

Призначте ідентифікатор або клас для вашого користувача.

document.querySelector("#tbodyId").remove();
document.querySelectorAll(".tbodyClass").remove();

Ви можете назвати свій ідентифікатор або клас як завгодно, не обов’язково #tbodyIdабо .tbodyClass.


0

Просто очистіть корпус столу.

$("#tblbody").html("");

2
html () насправді є методом jQuery.
carlodurso

-1

таблиця const = document.querySelector ('таблиця'); table.innerHTML === ''? null: table.innerHTML = ''; вищевикладений JavaScript добре працював для мене. Він перевіряє, чи містить таблиця якісь дані, а потім очищає все, включаючи заголовок.

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