#javascript #html #jquery #css
Вопрос:
У меня есть 2 таблицы (в будущем я добавлю еще). В обеих таблицах есть кнопка, которая открывает один и тот же модальный режим. Модальный имеет ввод и поле выбора.
Я хочу заполнить оба (выбрать и ввести), а затем вы можете нажать кнопку «добавить». Входные данные добавляются в таблицу, в которой вы нажали «Нажмите здесь, чтобы активировать модальный».
НО: входные данные теперь добавляются только в первую таблицу (таблица Apple). Я хотел, чтобы, когда я нажимаю кнопку «Нажмите здесь, чтобы запустить модальную»на банановой таблице, информация внутри модальной таблицы добавлялась в банановую таблицу, а не в яблочную таблицу.
Как я могу это сделать? Я хочу добавить больше таблиц в будущем (с той же функцией кнопки, которая открывает тот же модальный режим). Как я могу это сделать, не сообщая своему js-коду точное место, куда он должен добавить информацию?
Может быть, кнопки на столе каким-то образом замечают, на каком столе он был нажат? И поэтому он может автоматически добавлять информацию в правильную таблицу?
Не стесняйтесь запускать код:)
const modal = document.querySelector(".modal");
const triggers = document.querySelectorAll(".trigger");
const closeButton = document.querySelector(".close");
function toggleModal() {
modal.classList.toggle("show-modal");
}
function windowOnClick(event) {
if (event.target === modal) {
toggleModal();
}
}
triggers.forEach(function(x) {
x.addEventListener("click", toggleModal);
});
closeButton.addEventListener("click", toggleModal);
window.addEventListener("click", windowOnClick);
function add() {
const inputs = [...document.getElementById('inputs').querySelectorAll("textarea")]; // takes textarea
const selection = [...document.getElementById('inputs').querySelectorAll("select")]; // takes select
if (isFormValid(inputs)) {
const table = document.getElementById('table')
const newRowIdx = table.rows.length
const rowId = `row_${newRowIdx}_${Date.now()}`
const row = table.insertRow(newRowIdx)
row.id = rowId
inputs.forEach((input, idx) => { //add cell
const cell = row.insertCell(idx)
cell.appendChild(formatInputValue(input))
})
selection.forEach((input, idx) => { //add cell
const cell = row.insertCell(idx)
cell.appendChild(formatInputValue(input))
})
}
const actionCell = row.insertCell()
resetInputs(inputs)
}
function formatInputValue(input) {
return document.createTextNode(input.value)
}
function isFormValid(inputs) {
return inputs.filter(input => input.value === "").length === 0;
}
function resetInputs(inputs) {
inputs.forEach(input => input.value = "")
}
.modal {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
opacity: 0;
visibility: hidden;
transform: scale(1.1);
transition: visibility 0s linear 0.25s, opacity 0.25s 0s, transform 0.25s;
}
.modal-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: white;
padding: 1rem 1.5rem;
width: 24rem;
border-radius: 0.5rem;
}
.close-button {
float: right;
width: 1.5rem;
line-height: 1.5rem;
text-align: center;
cursor: pointer;
border-radius: 0.25rem;
background-color: lightgray;
}
.close-button:hover {
background-color: darkgray;
}
.show-modal {
opacity: 1;
visibility: visible;
transform: scale(1.0);
transition: visibility 0s linear 0s, opacity 0.25s 0s, transform 0.25s;
}
<table id="table" border="2" class="fruitTable">
<tr>
<th colspan="2">Apple
<button class="trigger">Click here to trigger the modal!</button></th>
</tr>
</table>
<table id="table" border="2" class="mitarbeiterTabelle">
<tr>
<th colspan="2">Banana
<button class="trigger">Click here to trigger the modal!</button></th>
</tr>
</table>
<div id="myModal" class="modal">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close close-button" data-dismiss="modal">amp;times;</button>
<h4 class="modal-title">Add fruit</h4>
</div>
<div class="modal-body">
<table id="inputs">
<tr>
<th><label for="gebaeude-geraete">Choose Fruit:*</label></th>
<td>
<select type="text" required>
<option value="" selected disabled>Fruit</option>
<option>Fruit 1</option>
<option>Fruit 2</option>
</td>
</tr>
<tbody>
<tr>
<th><label>More information:*</label></th>
<td><textarea type="text" id="information" placeholder="More details" required></textarea>
</tr>
</tbody>
</table>
<div>
<button class="submit" id="button" onclick="add()">Add</button>
</div>
</div>
</div>
</div>
Комментарии:
1.
id
должно быть уникальным developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id2. вы имеете в виду часть const table = document.getElementById(«таблица») , верно? Но я не хочу всегда изменять/расширять свой код js при добавлении новой таблицы. Есть ли другой способ?
3. Используйте общий класс для таблиц и повторите цикл
document.querySelectorAll('.myTableClass')
4. Вы должны сохранить идентификатор таблицы в переменной при открытии модального, а затем использовать его в
getElementById
.
Ответ №1:
Вам нужно указать уникальный идентификатор для каждой таблицы, а затем запросить этот идентификатор.
<table id="table-apples"></table>
<table id="table-bananas"></table>
let activeTableId = null;
function toggleModal(event) {
activeTableId = event.target.closest('table').id
// rest
}
function windowOnClick(event) {
if (event.target === modal) {
toggleModal();
activeTableId = null;
}
}
function add() {
const table = document.getElementById(activeTableId);
// rest
}