Итак, что я пытаюсь сделать, это добавить в свой код функцию «изменения», она работает только для первого td, но не для любого другого, когда я нажимаю на другой td, он автоматически редактирует первый. Кто-нибудь знает, почему мой код меняет только td> name / td>, а не td> adress / td> или любой другой td>
html:
<form id = "registrering">
<label>Navn: <input id = "inpnavn" placeholder = "Raahim Khan" type = "text" required></label>
<label>Adresse: <input id = "inpadresse" type = "text" placeholder = "Adresse 12" required></label>
<label>Mobilnummer: <input id = "inpmobilnummer" placeholder = "12345678" required></select></label>
<label>Kjønn:
<select id = "inpkjønn" required>
<option value = "" selected disabled hidden>Velg kjønn</option>
<option>Mann</option>
<option>Kvinne</option>
<option>intetkjønn</option>
</select>
</label>
<button type = "submit">Send inn</button>
</form>
//showing the data on website
function hentruss(snapshot){
var pk = snapshot.key;
var nyruss = snapshot.val();
var russref = database.ref("russ/" + nyruss.russ);
russref.on("value", function(snapshotruss){
var russobj = snapshotruss.val();
txttabell.innerHTML += `
<tr id = "${pk}">
<td><label class = "russlabel" onclick = "edit('${pk}')">${nyruss.navn}</label><input type = "text" class = "editItem" style = "display:none"></td>
<td><label class = "russlabel" onclick = "edit('${pk}')">${nyruss.adresse}</label><input type = "text" class = "editItem" style = "display:none"></td>
<td>${nyruss.mobilnummer}</td>
<td>${nyruss.kjønn}</td>
<td><label class = "delete" onclick = "slett('${pk}')"><button>Slett</button></label></td>
</tr>
`;
});
}
// обновляем имя, адрес и т. д., щелкнув элемент.
function edit(pk) {
var russen = russ.child(pk);
var label = document.querySelector(`#${pk} .russlabel`);
label.style.display = "none";
var tekst = label.innerText;
var inputfelt = document.querySelector(`#${pk} .editItem`);
inputfelt.style.display = "block";
inputfelt.value = tekst;
inputfelt.focus();
inputfelt.onblur = function() {
inputfelt.style.display = "none";
label.style.display = "block";
};
inputfelt.onchange = function() {
russen.update( {tekst: inputfelt.value} )
inputfelt.style.display = "none";
label.style.display = "block";
label.innerText = inputfelt.value;
};
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Трудно дать точное решение, поскольку фрагменты кода, которыми вы поделились, содержат много вызовов функции, контекст которой не ясен ... Я сделал все возможное, чтобы проиллюстрировать, как вы можете делать то, что пытаетесь ... Может быть, это поможет начать работу в правильном направлении:
function handleSubmit(form) {
// Simulate creation of item using a form
var name = form.name.value;
var mobile = form.mobile.value;
// Generate random pk for demonstration
var pk = `pk${+new Date()}`;
var tableBody = document.querySelector('table tbody');
tableBody.innerHTML += ` <tr>
<td>
<label class = "russlabel" onclick = "edit(this)" data-pk = "1" data-field = "name">${name}</label>
<input class = "editItem" style = "display:none;" />
</td>
<td>
<label class = "russlabel" onclick = "edit(this)" data-pk = "1" data-field = "mobile">${mobile}</label>
<input class = "editItem" style = "display:none;" />
</td>
</tr>`;
return false;
}
function edit(label) {
var pk = label.dataset.pk;
var field = label.dataset.field;
var input = label.parentElement.children[1]; // Use label.parent.querySelector('input') if DOM is more complex
label.style = 'display:none;';
input.style = 'disply:block;';
input.focus();
input.value = label.innerHTML;
input.onchange = function() {
// pk and field are available here
// to Update DB state?? not sure how this code works
//var russen = russ.child(pk);
//russen.update( {tekst: inputfelt.value} )
}
input.onblur = function() {
label.innerHTML = input.value;
label.style = 'display:block;';
input.style = 'display:none;';
}
}td {
padding: 0.5rem 0;
border-bottom: 1px solid black;
}
form {
margin: 1rem auto;
}<form id = "entry" onsubmit = "return handleSubmit(this);">
<input name = "name" placeholder = "Name" />
<input name = "mobile" placeholder = "mobile" />
<input type = "submit" value = "Add Entry" />
</form>
<table>
<thead>
<tr>
<th>Name</th>
<th>Mobile</th>
</thead>
<tbody>
<tr>
<td>
<label class = "russlabel" onclick = "edit(this)" data-pk = "1" data-field = "name">Tom</label>
<input class = "editItem" style = "display:none;" />
</td>
<td>
<label class = "russlabel" onclick = "edit(this)" data-pk = "1" data-field = "mobile">1234</label>
<input class = "editItem" style = "display:none;" />
</td>
</tr>
</tbody>
</table>Некоторые примечания:
Может быть хорошей идеей прочитать / освежить в памяти JS Events здесь и реорганизовать встроенные обработчики событий - это затрудняет обслуживание, чтение, рассуждение, отладку вашего кода и, как правило, плохая идея.
То же самое и со встроенными стилями - избегайте их. Попробуйте вместо этого использовать классы с поддерживающими стилями в таблице стилей. (Например, щелкнув метку, мы могли бы добавить класс active к элементу td, который, в свою очередь, автоматически скрывает метку и показывает ввод.
Переназначать слушателей входам каждый раз при нажатии на ярлык - плохая практика. Эту же функциональность можно реализовать более простым и изящным образом, используя что-то вроде Делегирование событий.
Спасибо за вашу помощь, но я не уверен, как я собираюсь сделать петлю для этого. У вас есть образец, которому я могу следовать? Я пробовал что-то сам, но они не работали. (Я плохо разбираюсь в циклах и селекторах запросов) Еще раз спасибо!