#javascript
#javascript
Вопрос:
У меня есть 3 таблицы в div, которые я хочу сделать редактируемыми. Внизу каждой таблицы есть кнопка «добавить», которая открывает модальный (все они открывают один и тот же модальный). У меня есть следующий JS для добавления новых строк:
Как мне заставить JS узнать, в какую из трех таблиц добавить строку? У меня есть три таблицы: acc_table1, acc_table2, acc_table3. Я попробовал «var table = document.getElementById(«acc_table» no);» что не сработало.
if (tit.innerHTML === "Add Account"){
var table = document.getElementById("acc_table1");
var row = table.insertRow(0);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML = document.getElementById("modal_type").value;
cell2.innerHTML = document.getElementById("modal_price").value;
}
Комментарии:
1. в каждой таблице есть кнопка для открытия одного и того же модального. затем нажмите кнопку сохранить идентификатор таблицы в переменной, а затем, когда вы захотите добавить значение в таблицу, используйте эту переменную
2. Я добавил скрытую переменную, которая обновляется при открытии модального с помощью
table = e.target.parentElement.parentElement.parentElement;
иdocument.getElementById('table_num').value = table.getAttribute('id');
— это кажется правильным?3. Я не знаю. У меня нет вашего html, чтобы знать, что такое e.target.parentElement.parentElement.parentElement однако мой ответ ниже не требует скрытого элемента. Я могу дополнительно объяснить свой ответ, если вы не можете понять, как использовать.
Ответ №1:
Вы можете сделать это, учитывая контекст, в котором нажата кнопка. Мы можем использовать Node.previousElementSibling()
или Element.closest()
для поиска соответствующей таблицы (в зависимости от структуры вашего DOM), в которую должна быть вставлена новая строка. В этом случае вам не нужно будет передавать параметры / аргументы обратному вызову, Что потребует от вас отслеживания новых идентификаторов и т. Д.
Если ваш <button>
элемент находится сразу после <table>
элемента, то вы можете использовать e.target.previousElementSibling
для выбора <table>
интересующего элемента, когда событие щелчка запускается на элементе button:
document.querySelectorAll('.addAccount').forEach(function(el) {
el.addEventListener('click', function(e) {
// Table element is immediately before button
var table = e.target.previousElementSibling;
// Perform sanity check before proceeding
if (!table || !table.matches('table'))
return;
var row = table.insertRow(0);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML = document.getElementById("modal_type").value;
cell2.innerHTML = document.getElementById("modal_price").value;
});
});
<input type="text" id="modal_type" value="MODAL_TYPE" />
<input type="text" id="modal_price" value="MODAL_PRICE" />
<h1>Table 1</h1>
<table>
<tbody></tbody>
</table>
<button type="button" class="addAccount">Add account</button>
<h1>Table 2</h1>
<table>
<tbody></tbody>
</table>
<button type="button" class="addAccount">Add account</button>
<h1>Table 3</h1>
<table>
<tbody></tbody>
</table>
<button type="button" class="addAccount">Add account</button>
В качестве альтернативы, если ваш <button>
элемент заключен в тот же родительский элемент (скажем, <div>
элемент), вы можете использовать комбинацию Element.closest()
и Element.querySelector()
, чтобы найти таблицу в том же родительском элементе. Опять же, идентификатор не требуется, и все основано на контекстной информации из иерархии DOM:
document.querySelectorAll('.addAccount').forEach(function(el) {
el.addEventListener('click', function(e) {
// Table element is immediately before button
var table = e.target.closest('.wrapper').querySelector('table');
// Perform sanity check before proceeding
if (!table)
return;
var row = table.insertRow(0);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML = document.getElementById("modal_type").value;
cell2.innerHTML = document.getElementById("modal_price").value;
});
});
<input type="text" id="modal_type" value="MODAL_TYPE" />
<input type="text" id="modal_price" value="MODAL_PRICE" />
<hr />
<div class="wrapper">
<button type="button" class="addAccount">Add account</button>
<p>Random text here</p>
<h1>Table 1</h1>
<table>
<tbody></tbody>
</table>
</div>
<div class="wrapper">
<h1>Table 2</h1>
<table>
<tbody></tbody>
</table>
<p>Random text here</p>
<button type="button" class="addAccount">Add account</button>
</div>
Ответ №2:
Вы можете использовать переменную для хранения нужного идентификатора таблицы, чтобы использовать ее, когда вы хотите сохранить данные в таблице.
Что-то вроде примера ниже
var tableId = "";
function openModalFunction(selectedTableId){
tableId = selectedTableId;
}
function saveDataToTable(){
var table = document.getElementById(tableId);
var row = table.insertRow(0);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML = "cell 1";
cell2.innerHTML = "cell 2";
}
<table id="acc_table1">
<thead><tr><th colspan=2>Table 1</th></tr></thead>
<tfoot>
<tr>
<th colspan=2>
<button onclick="openModalFunction('acc_table1')">table one</button>
</th>
</tr>
</tfoot>
</table>
<hr>
<table id="acc_table2">
<thead><tr><th colspan=2>Table 1</th></tr></thead>
<tfoot>
<tr>
<th colspan=2>
<button onclick="openModalFunction('acc_table2')">table two</button>
</th>
</tr>
</tfoot>
</table>
<hr>
<button onclick="saveDataToTable()">Save</button>