Задать вопрос
drno-reg
@drno-reg
см не кратко

Как правильно удалять строки из таблицы?

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

<table id="myTable">
    <thead>
    <tr>
        <th>Какое-то контекст</th>
        <th>Какие-то кнопки</th>
    </tr>
    </thead>
    <tr>
        <td>Row1 cell1</td>
        <td><a class="btn btn-warning" href="javascript:deleteRow(this);"><i class="icon-remove"></i></a></td>
    </tr>
    <tr>
        <td>Row1 cell2</td>
        <td><a class="btn btn-warning" href="javascript:deleteRow(this);"><i class="icon-remove"></i></a></td>
    </tr>
</table>

Нашел 2 варианта.

Первый, который по идее должен определять индекс строки в которой была нажата кнопка Del и через передачу this
должна происходить передача инфо об объекте, в котором мы вычисляем rowIndex:

function deleteRow(btn) {
        // var i = r.parentNode.parentNode.rowIndex;
        // document.getElementById("myTable").deleteRow(i);
        var row = btn.parentNode.parentNode;
        row.parentNode.removeChild(row);
    }

Но проблема в том, что браузер возвращает ошибку:

main:371 Uncaught TypeError: Cannot read property 'parentNode' of undefined
    at deleteRow (main:371)
    at <anonymous>:1:1

Нашел другой вариант:

$('body').on('click', 'btn btn-warning', function() {
        $(this).parents('tr').remove();
    });

Но проблема в том, что при нажатии удаляется полностью все строки, которые я предварительно добавляю с помощью

function myFunction() {
        var table = document.getElementById("myTable");
        var totalRowCount = table.rows.length;
        console.log("Всего строк: "+totalRowCount);
        var row = table.insertRow(totalRowCount);
        var cell1 = row.insertCell(0);
        var cell2 = row.insertCell(1);
        cell1.innerHTML = "Новая строчка "+totalRowCount;
        cell2.innerHTML = "<a class=\"btn btn-warning\" href=\"\"><i class=\"icon-remove\"></i></a>";
    }

Как правильно удалять строки в таблице?
  • Вопрос задан
  • 191 просмотр
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
href="javascript:deleteRow(this);"

Замените на onclick="deleteRow(this)".

Или, просто уберите, и сделайте делегированный обработчик клика:

document.querySelector('table').addEventListener('click', e => {
  const btn = e.target.closest('.btn');
  if (btn) {
    btn.closest('tr').remove();
  }
});

нашел другой вариант

$('body').on('click', 'btn btn-warning', function() {
        $(this).parents('tr').remove();
    });


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

Это не "вариант", а неработоспособный мусор - где точки перед именами классов?

Что до удаления строк - этого не происходит. А вот страница перезагружается. Потому что href у ссылки пустой и не отменяете действие по умолчанию при клике. Надо так:

$('body').on('click', '.btn.btn-warning', function(e) {
  e.preventDefault();
  $(this).closest('tr').remove();
});

Или, вместо пустой строки записывайте # ссылкам в href.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@tempick
$('body').on('click', 'a.btn-warning', function() {
    $(this).parent('td').parent('tr').remove();
});
Ответ написан
Комментировать
t-alexashka
@t-alexashka
Сразу пишу legacy код
$(document).on('click', '.btn-warning', function() {
    $(this).closest('tr').remove();
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 15:00
300 руб./в час
18 дек. 2024, в 14:53
30000 руб./за проект
18 дек. 2024, в 14:45
25000 руб./за проект