У меня проблема. У меня есть имя объекта: 'Коля', возраст: 30, мне нужно создать ul, где будет эта информация. После этого мне нужно отредактировать эту информацию на clcik. При редактировании (диапазон) я хочу создать один вход и одну кнопку. На входе должны быть указаны имя и возраст этой информации. В настоящее время я получаю его. После того, как я его получу, у меня должна быть возможность изменить его. Поэтому, когда я нажимаю кнопку изменения, он должен сохранить мои изменения, и это должно быть для каждой строки li.
var products = [
{name: 'Коля', age: 30},
{name: 'Вася', age: 40},
{name: 'Петя', age: 50},
];
var ul = document.createElement("ul");
for( var i = 0; i < products.length; i++ ){
var li = document.createElement("li");
var span = document.createElement("span");
span.innerHTML = products[i].name + " " + products[i].age + " " + "Edit";
span.classList.add("newClass");
li.addEventListener("click", editInfo);
li.appendChild(span);
ul.appendChild(li);
document.body.appendChild(ul);
}
var inputAge = document.createElement("input");
function editInfo(){
var button = document.createElement("button");
button.innerHTML = "Change";
inputAge.value = this.children.innerHTML;
document.body.appendChild(inputAge);
document.body.appendChild(button);
}@NewToJS и как мне его получить?



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


Вам не нужно каждый раз добавлять UL в документ.
document.body.appendChild(ul) - должен быть вне цикла for.
li.addEventListener("click", editInfo) - следует изменить, также изучите концепции циклов событий в javascript
Найдите подходящий код ниже и напишите свою собственную функцию «изменения».
var products = [
{name: 'Коля', age: 30},
{name: 'Вася', age: 40},
{name: 'Петя', age: 50},
];
var ul = document.createElement("ul");
for( var i = 0; i < products.length; i++ ){
var li = document.createElement("li");
var span1 = document.createElement("span");
var span2 = document.createElement("span");
span1.innerHTML = products[i].name + " " + products[i].age;
span2.innerHTML = " Edit";
span1.classList.add("newClass");
li.addEventListener("click", function(){return editInfo(this);});
li.appendChild(span1);
li.appendChild(span2);
ul.appendChild(li);
}
document.body.appendChild(ul);
var inputAge = document.createElement("input");
function editInfo(el){
var button = document.createElement("button");
button.innerHTML = "Change";
console.info(el)
inputAge.value = el.children[0].innerHTML;
document.body.appendChild(inputAge);
document.body.appendChild(button);
}
Вот один из примеров того, как делать то, что вам нужно.
Я добавил подробный комментарий.
Если я неправильно понял ваш вопрос или любой вопрос, дайте мне знать.
// preparation
var products = [
{ name: 'Коля', age: 30 },
{ name: 'Вася', age: 40 },
{ name: 'Петя', age: 50 },
];
var ul = document.createElement("ul");
document.body.appendChild(ul);
var inputAge = document.createElement("input");
// set input type as number
inputAge.setAttribute("type", "number");
var button = document.createElement("button");
button.innerHTML = "Change";
inputAge.style.display = "none";
button.style.display = "none";
document.body.appendChild(inputAge);
document.body.appendChild(button);
// preparation done
// set products to li
for (var i = 0; i < products.length; i++) {
var li = document.createElement("li");
setContent(li, products[i])
ul.appendChild(li);
}
// function to set one li's content
function setContent(el, obj) {
// rebuild the span
var span = document.createElement("span");
span.innerHTML = obj.name + " " + obj.age + " " + "Edit";
// bind edit event handler
span.addEventListener("click", editInfo);
// reset li's content
el.innerHTML = '';
el.appendChild(span);
}
// what edit do
function editInfo(e) {
// retrieve name&age
var arr = e.target.innerHTML.split(' ');
var name = arr[0].trim();
var age = parseInt(arr[1]);
// set text value to input
inputAge.value = age;
// show input and change button
inputAge.style.display = "block";
button.style.display = "block";
// set change button here for easily get name
button.onclick = function() {
setContent(e.target, {
name: name,
age: inputAge.value
})
// hide input and button
inputAge.style.display = "none";
button.style.display = "none";
};
}Используйте JQuery для манипуляции с DOM:
var products = [{
name: 'Коля',
age: 30
},
{
name: 'Вася',
age: 40
},
{
name: 'Петя',
age: 50
}
];
loadList();
function loadList() {
var listItem = '';
for (var key in products) {
listItem +=
"<li onClick=editListData('" +
products[key].name +
"','" +
products[key].age +
"','" +
key +
"')>" +
products[key].name +
' ,' +
products[key].age +
'</li>';
}
$('.userDataList').html(listItem);
}
function editListData(name, age, key) {
var inputContainer = $('.inputContainer');
var in_put = `<div>
<div class = "form-group">
<label for = "usr">Name:</label>
<input type = "text" value='${name}' class = "form-control" id = "usr" name = "usr">
</div><br/>
<div class = "form-group">
<label for = "age">Age:</label>
<input type = "text" value='${age}' class = "form-control" id = "age" name = "age">
</div><br/>
<button type = "button" onClick = "updateData('${key}')"class = "btn btn-primary">Primary</button>
</div>`;
inputContainer.html(in_put);
}
function updateData(key) {
var name = $('#usr').val();
var age = $('#age').val();
products[key] = {
name: name,
age: age
};
loadList();
$('.inputContainer').html('');
}<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "myListData">
<ul class = "userDataList"></ul>
</div>
<div class = "inputContainer">
</div>Зная, что я опаздываю на вечеринку,
Я использовал jQuery, чтобы добиться того, чего вы хотите.
Вместо того, чтобы манипулировать DOM для редактирования, пользователь редактирует объект в фоновом режиме, а затем при нажатии кнопки Change вид обновляется.
Я использовал data-product-index для отслеживания индекса в массиве самого элемента.
var products = [{
name: 'Коля',
age: 30
},
{
name: 'Вася',
age: 40
},
{
name: 'Петя',
age: 50
},
];
showProducts();
function showProducts() {
// Remove old #product UL if exists
$('#products').remove();
// Append UL
$('body').append('<ul id = "products"></ul>');
// Iterate over products
products.forEach((elem, i) => {
// Using ES6 Template Literals
$('ul').append(`<li><span data-product-index = "${i}" onclick='editInfo(this);'>${elem.name} ${elem.age} Edit</span></li>`);
});
}
function editInfo(elem) {
// Remove old edit field
$('#editField').remove();
// Append an edit div
$('body').append(`<div id = "editField">Editing Item: ${$(elem).data('product-index')}<br>Name:<br><input type = "text" id = "editInputName"/><br>Age:<br><input type = "number" id = "editInputAge"/><br><button id = "editButton">Change</button></div>`);
$('button').on('click', (e) => {
products[$(elem).data('product-index')].name = $('#editInputName').val();
products[$(elem).data('product-index')].age = $('#editInputAge').val();
console.info(products[$(elem).data('product-index')]);
// Remove click event
$('button').off('click');
// Remove edit field
$('#editField').remove();
// Show updated object
showProducts();
});
}<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Попробуйте
this.children[0].innerHTML. this.children вернет коллекцию / список узлов элементов.