Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Добавить кнопку удалить для ячеек таблицы (https://javascript.ru/forum/misc/76615-dobavit-knopku-udalit-dlya-yacheek-tablicy.html)

CryNet 26.01.2019 18:12

Добавить кнопку удалить для ячеек таблицы
 
Есть простенький ToDo лист. Задания хранятся в localStorage. Хочу напротив каждого задания добавить кнопку Удалить, которая бы удаляла конкретное задание из массива, в котором хранятся задания вытащены из localStorage, и в самом localStorage. Но как продумать логику, чтобы конкретное задание удалялось?!
1) Cами кнопки я добавил:
var tdDelete = document.createElement('td');
    tdDelete.innerHTML = '<button>Удалить</button>';
    table.appendChild(tdDelete); //"Навигация"

2) Дальше нужно выбрать из DOM кнопки
3) ???
4) Профит
Код HTML:
<body>
    <p>Введите заголовок: <input type="text" id="setName"></p>
    <p>Введите описание: <input  type="text"  id="setText"></p>
    <button id="setValue">Добавить</button>
    <hr>
    <h3>Список идей:</h3>
<table>
  <thead>
    <tr>
        <th>Название</th>
        <th>Описание</th>
        <th>Навигация</th>
    </tr>
  </thead>
  <tbody id="tableBody">

  </tbody>
</table>
<br>
<button id="del">Очистить</button>
</body>

Код JS:
var localStorageArray = [];
// получаем из localStorage данные
if(localStorage.getItem('todo')!=undefined){
    localStorageArray = JSON.parse(localStorage.getItem('todo'));
    echo();
}
console.log(localStorageArray);
// получаем данные из формы
document.getElementById('setValue').onclick = function(){
    var temp = {};
    var text = document.getElementById('setText').value;
    var name = document.getElementById('setName').value;
    if(text != '' && name != '') {
        temp.name = name;
        temp.text = text;
        // temp.check = 'false';
        var i = localStorageArray.length;
        localStorageArray[i] = temp;
        echo();
        localStorage.setItem('todo', JSON.stringify(localStorageArray));
    } else {
        alert('Заполните все поля');
    }
}
// выводим данные из массива, создавая ячейки в таблице
function echo() {
    document.getElementById('tableBody').innerHTML = ""; // очищаем контейнер
    var table = document.getElementById('tableBody');
    // выводим данные из массива
    for (const key in localStorageArray){
    var tr = document.createElement('tr'); //создаем еще строку
    table.appendChild(tr);
    var tdLeft = document.createElement('td'); // создаем столбец
    tdLeft.innerHTML = localStorageArray[key].name;
    var tdRight = document.createElement('td'); // создаем столбец
    tdRight.innerHTML = localStorageArray[key].text;
    // кнопка удалить
    var tdDelete = document.createElement('td');
    tdDelete.innerHTML = '<button>Удалить</button>';
    // добавляем элементы на страницу
    table.appendChild(tdLeft);  // "Название"
    table.appendChild(tdRight); //"Описание"
    table.appendChild(tdDelete); //"Навигация"

    }
}
document.getElementById('del').onclick = function(){
    localStorageArray = [];
    localStorage.clear();
    location.reload();
}

рони 26.01.2019 20:07

CryNet,
на всякий случай ...
https://javascript.ru/forum/dom-wind...tml#post500746

CryNet 27.01.2019 00:44

Не уверен, что правильно понял

рони 27.01.2019 09:44

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

CryNet 30.01.2019 20:26

Цитата:

Сообщение от рони (Сообщение 502764)
рони,
там нет удаления

Тут у меня проблема. Код для удаления конкретной записи в таблице:
[].forEach.call(document.querySelectorAll('button#idTable'), function(el){
    el.addEventListener('click', function () {
        var tr= this.parentNode.parentNode;
        tableBody.deleteRow(tr.rowIndex);
    })
});

Но в итоге сверху вниз, вне зависимости от того на какую кнопку кликнули, удаляется тег tr, хотя вложенные в него теги td остаются.

рони 30.01.2019 20:41

Цитата:

Сообщение от CryNet
'button#idTable'

id уникально!!!
и лучше макет целиком

CryNet 30.01.2019 21:06

Цитата:

Сообщение от рони (Сообщение 502971)
id уникально!!!

Та это уже просто война правок в коде...

var localStorageArray = [];
var tr, tdLeft, tdRight, tdDelete;
// получаем из localStorage данные
if(localStorage.getItem('todo')!=undefined){
    localStorageArray = JSON.parse(localStorage.getItem('todo'));
    echo();
}
// получаем данные из формы
document.getElementById('setValue').onclick = function(){
    var temp = {};
    var text = document.getElementById('setText').value;
    var name = document.getElementById('setName').value;
    if(text != '' && name != '') {
        temp.name = name;
        temp.text = text;
        // temp.check = 'false';
        var i = localStorageArray.length;
        localStorageArray[i] = temp;
        echo();
        localStorage.setItem('todo', JSON.stringify(localStorageArray));
    } else {
        alert('Заполните все поля');
    }
}
// выводим данные из массива, создавая ячейки в таблице
function echo() {
    document.getElementById('tableBody').innerHTML = ""; // очищаем контейнер
    var table = document.getElementById('tableBody');
    // выводим данные из массива
    for (const key in localStorageArray){
        tr = document.createElement('tr'); //создаем еще строку
        table.appendChild(tr);
        tdLeft = document.createElement('td'); // создаем столбец
        tdLeft.innerHTML = localStorageArray[key].name;
        tdRight = document.createElement('td'); // создаем столбец
        tdRight.innerHTML = localStorageArray[key].text;
        // копка удалить
        tdDelete = document.createElement('td');
        tdDelete.innerHTML = `<button class="idTable">Удалить</button>`;
        // добавляем элементы на страницу
        table.appendChild(tdLeft);  // "Название"
        table.appendChild(tdRight); //"Описание"
        table.appendChild(tdDelete); //"Навигация"
    }
}

[].forEach.call(document.querySelectorAll('button.idTable'), function(el){
    el.addEventListener('click', function () {
        var tr= this.parentNode.parentNode;
        tableBody.deleteRow(tr.rowIndex);
    })
});

document.getElementById('del').onclick = function(){
    localStorageArray = [];
    localStorage.clear();
    location.reload();
}


<body>
    <p>Введите заголовок: <input type="text" id="setName"></p>
    <p>Введите описание: <input  type="text"  id="setText"></p>
    <button id="setValue">Добавить</button>
    <hr>
    <h3>Список идей:</h3>
<table id="tbl">
  <thead>
    <tr>
        <th>Название</th>
        <th>Описание</th>
        <th>Навигация</th>
    </tr>
  </thead>
  <tbody id="tableBody">

  </tbody>
</table>
<br>
<button id="del">Очистить</button>
</body>

рони 30.01.2019 21:23

CryNet,
макет, это то, что ниже ...
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
</head>

<body>
    <p>Введите заголовок: <input type="text" id="setName"></p>
    <p>Введите описание: <input  type="text"  id="setText"></p>
    <button id="setValue">Добавить</button>
    <hr>
    <h3>Список идей:</h3>
<table id="tbl">
  <thead>
    <tr>
        <th>Название</th>
        <th>Описание</th>
        <th>Навигация</th>
    </tr>
  </thead>
  <tbody id="tableBody">

  </tbody>
</table>
<br>
<button id="del">Очистить</button>
<script>
   var localStorageArray = [];
var tr, tdLeft, tdRight, tdDelete;
// получаем из localStorage данные
if(localStorage.getItem('todo')!=undefined){
    localStorageArray = JSON.parse(localStorage.getItem('todo'));
    echo();
}
// получаем данные из формы
document.getElementById('setValue').onclick = function(){
    var temp = {};
    var text = document.getElementById('setText').value;
    var name = document.getElementById('setName').value;
    if(text != '' && name != '') {
        temp.name = name;
        temp.text = text;
        // temp.check = 'false';
        var i = localStorageArray.length;
        localStorageArray[i] = temp;
        echo();
        localStorage.setItem('todo', JSON.stringify(localStorageArray));
    } else {
        alert('Заполните все поля');
    }
}
// выводим данные из массива, создавая ячейки в таблице
function echo() {
    document.getElementById('tableBody').innerHTML = ""; // очищаем контейнер
    var table = document.getElementById('tableBody');
    // выводим данные из массива
    for (const key in localStorageArray){
        tr = document.createElement('tr'); //создаем еще строку
        table.appendChild(tr);
        tdLeft = document.createElement('td'); // создаем столбец
        tdLeft.innerHTML = localStorageArray[key].name;
        tdRight = document.createElement('td'); // создаем столбец
        tdRight.innerHTML = localStorageArray[key].text;
        // копка удалить
        tdDelete = document.createElement('td');
        tdDelete.innerHTML = `<button class="idTable">Удалить</button>`;
        // добавляем элементы на страницу
        tr.appendChild(tdLeft);  // "Название"
        tr.appendChild(tdRight); //"Описание"
        tr.appendChild(tdDelete); //"Навигация"
    }


[].forEach.call(document.querySelectorAll('button.idTable'), function(el){
    el.addEventListener('click', function () {
        var tr= this.parentNode.parentNode;
        var index = tr.rowIndex - 1
        tableBody.deleteRow(index);
        localStorageArray.splice(index, 1);
        localStorage.setItem('todo', JSON.stringify(localStorageArray));
    })
});
}
document.getElementById('del').onclick = function(){
    localStorageArray = [];
    localStorage.clear();
    location.reload();
}

</script>


</body>

</html>


Часовой пояс GMT +3, время: 04:07.