Получите информацию и измените с помощью javascript

У меня проблема. У меня есть имя объекта: 'Коля', возраст: 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);

}

Попробуйте this.children[0].innerHTML. this.children вернет коллекцию / список узлов элементов.

NewToJS 22.06.2018 09:48

@NewToJS и как мне его получить?

Marie 22.06.2018 09:50

Как объяснено выше ... путем нацеливания на конкретный элемент из коллекции, возвращенной Пример JsFiddle

NewToJS 22.06.2018 09:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
60
4

Ответы 4

Вам не нужно каждый раз добавлять 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>

Другие вопросы по теме