Страницы

Поиск по вопросам

понедельник, 4 марта 2019 г.

Динамическая таблица на Javascript

Прошу помощи добавить кнопку редактирования / сохранения в ячейке, рядом с другими кнопками добавления и удаления строк. Кнопка должна дублироваться вместе с остальными, в каждой строке.
body { font-family: "Helvetica"; font-size: medium; } table { border-collapse: collapse; text-align: center; margin: auto; } table td, table th { border: solid 1px #aaa; padding: 10px; } table tbody tr:nth-child(2n) { background: #a8d7ff; } table tbody tr:hover { background: #fffcb6; }

Поле 1 Поле 2 Поле 3 Поле 4 Поле 5


Ответ

Никогда такого сам не делал, не судите строго :
var DynamicTable = (function(GLOB) { var RID = 0; return function(tBody) { /* Если ф-цию вызвали не как конструктор фиксим этот момент: */ if (!(this instanceof arguments.callee)) { return new arguments.callee.apply(arguments); } //Делегируем прослушку событий элементу tbody tBody.onclick = function(e) { var evt = e || GLOB.event, trg = evt.target || evt.srcElement; if (trg.className && trg.className.indexOf("add") !== -1) { _addRow(trg.parentNode.parentNode, tBody); } else if (trg.className && trg.className.indexOf("del") !== -1) { tBody.rows.length > 1 && _delRow(trg.parentNode.parentNode, tBody); } // то что я добавил if (trg.className && trg.className.indexOf("edit") !== -1) { var tds = trg.closest('tr').children; for (var i = 0; i < tds.length; i++) { if (tds[i].className.indexOf("buttons") == -1) { var input = tds[i].getElementsByTagName('input')[0]; var lbl = tds[i].getElementsByTagName('label')[0]; input.value = lbl.textContent; input.classList.remove("invisible"); lbl.classList.add("invisible"); } else { var buttons = tds[i].children; for (var j = 0; j < buttons.length; j++) { if (buttons[j].className.indexOf("save") !== -1) { buttons[j].disabled = false; break; } } } } } if (trg.className && trg.className.indexOf("save") !== -1) { var tds = trg.closest('tr').children; for (var i = 0; i < tds.length; i++) { if (tds[i].className.indexOf("buttons") == -1) { var input = tds[i].getElementsByTagName('input')[0]; var lbl = tds[i].getElementsByTagName('label')[0]; lbl.textContent = input.value; input.classList.add("invisible"); lbl.classList.remove("invisible"); } else { var buttons = tds[i].children; for (var j = 0; j < buttons.length; j++) { if (buttons[j].className.indexOf("save") !== -1) { buttons[j].disabled = true; break; } } } } } }; // тут конец того что я добавил var _rowTpl = tBody.rows[0].cloneNode(true); // Корректируем имена элементов формы var _correctNames = function(row) { var elements = row.getElementsByTagName("*"); for (var i = 0; i < elements.length; i += 1) { if (elements.item(i).name) { if (elements.item(i).type && elements.item(i).type === "radio" && elements.item(i).className && elements.item(i).className.indexOf("glob") !== -1) { elements.item(i).value = RID; } else { elements.item(i).name = RID + "[" + elements.item(i).name + "]"; } } } RID++; return row; }; var _addRow = function(before, tBody) { var newNode = _correctNames(_rowTpl.cloneNode(true)); tBody.insertBefore(newNode, before.nextSibling); }; var _delRow = function(row, tBody) { tBody.removeChild(row); }; _correctNames(tBody.rows[0]); }; })(this); document.addEventListener('DOMContentLoaded', function() { new DynamicTable(document.getElementById("dynamic")); }); body { font-family: "Helvetica"; font-size: medium; } table { border-collapse: collapse; text-align: center; margin: auto; } table td { padding: 0px; height: 30px; width: 140px; } table td input, table td label { width: 100%; height: 100%; border: none; text-align: center; font-size: 16px; } table tbody tr:nth-child(2n), table tbody tr:nth-child(2n) input { background: #a8d7ff; } table tbody tr:hover { background: #fffcb6; } table tbody tr:hover input { background: #fffcb6; } table tbody input:hover { background: #ffd3b6 !important; } table tbody input:active { background: #c27949 !important; } .tblBtn { width: auto; height: 20px; } .buttons { width: 150px; } .invisible { display: none; }

Buttons Поле 2 Поле 3 Поле 4 Поле 5

Опишу вкратце что я сделал, в каждый td в таблице я добавил input(для редактирования) label(для хранения результата). Соответственно при клике на кнопку edit значение с лейбола пишем в инпут, лейбл скрываем, инпут показываем, при сохранении наоборот.
Вариант без инпутов и лейблов и с 1ной кнопкой :
var DynamicTable = (function(GLOB) { var RID = 0; return function(tBody) { /* Если ф-цию вызвали не как конструктор фиксим этот момент: */ if (!(this instanceof arguments.callee)) { return new arguments.callee.apply(arguments); } //Делегируем прослушку событий элементу tbody tBody.onclick = function(e) { var evt = e || GLOB.event, trg = evt.target || evt.srcElement; if (trg.className && trg.className.indexOf("add") !== -1) { _addRow(trg.parentNode.parentNode, tBody); } else if (trg.className && trg.className.indexOf("del") !== -1) { tBody.rows.length > 1 && _delRow(trg.parentNode.parentNode, tBody); } if (trg.className && trg.className.indexOf("edit") !== -1) { trg.closest('tr').classList.toggle('in-edit'); var isEdit = trg.innerText == 'Edit' ? true : false; trg.innerText = isEdit ? 'Save' : 'Edit'; var tds = trg.closest('tr').children; for (var i = 0; i < tds.length; i++) { if (tds[i].className.indexOf("buttons") == -1) { if (isEdit) { var curVal = tds[i].innerText; tds[i].innerText = ''; var inp = document.createElement('input'); inp.value = curVal; tds[i].appendChild(inp); } else { var newVal = tds[i].childNodes[0].value; tds[i].removeChild(tds[i].childNodes[0]); tds[i].innerText = newVal; } } } } }; var _rowTpl = tBody.rows[0].cloneNode(true); // Корректируем имена элементов формы var _correctNames = function(row) { var elements = row.getElementsByTagName("*"); for (var i = 0; i < elements.length; i += 1) { if (elements.item(i).name) { if (elements.item(i).type && elements.item(i).type === "radio" && elements.item(i).className && elements.item(i).className.indexOf("glob") !== -1) { elements.item(i).value = RID; } else { elements.item(i).name = RID + "[" + elements.item(i).name + "]"; } } } RID++; return row; }; var _addRow = function(before, tBody) { var newNode = _correctNames(_rowTpl.cloneNode(true)); tBody.insertBefore(newNode, before.nextSibling); }; var _delRow = function(row, tBody) { tBody.removeChild(row); }; _correctNames(tBody.rows[0]); }; })(this); document.addEventListener('DOMContentLoaded', function() { new DynamicTable(document.getElementById("dynamic")); }); body { font-family: "Helvetica"; font-size: medium; } table { border-collapse: collapse; text-align: center; margin: auto; } table td { padding: 0px; height: 30px; width: 150px; } table td input, table td label { width: 100%; height: 100%; border: none; text-align: center; font-size: 16px; } table tbody tr:nth-child(2n), table tbody tr:nth-child(2n) input { background: #a8d7ff; } table tbody tr:hover { background: #fffcb6; } table tbody tr:hover input { background: #fffcb6; } table tbody input:hover { background: #ffd3b6 !important; } table tbody input:active { background: #c27949 !important; } table tbody tr.in-edit input, table tbody tr.in-edit td { background: #d9d6b5; } .tblBtn { width: auto; height: 20px; } .buttons { width: 150px; } .invisible { display: none; }
Поле 2 Поле 3 Поле 4 Поле 5

Комментариев нет:

Отправить комментарий