如何使用 DOM 单击提交按钮获取文本值并将其添加到列表中?

How to take text value and add it to list by clicking submit button using DOM?

我的第一个问题!

我正在尝试制作一个待办事项列表,其中每个待办事项都表示为一个 li。我有一个文本输入字段和一个提交按钮,但不知道如何从输入字段中获取文本值并将其添加到列表中。

这是我目前所拥有的,我确信它完全是假的,因为我才刚刚开始:

const submitButton = document.getElementById('submitButton');
let toDoText = document.getElementById('toDoText').value;

function addToDo() {
  submitButton.addEventListener('click', function() {
    let Li = document.getElementsByClassName('todo');
    let toDoText = document.getElementById('toDoText').value;
    for (let i = 0; i < Li.length; i++) {
      form.push(toDoText);
    }
  })
}
<h1>TO-DO List</h1>
<form id="form">
  <input type="text" placeholder="Write your todo" id="toDoText">
  <input type="submit" id="submitButton">
</form>


<li class="todo">Example 1</li>
<li class="todo">Example 2</li>

给你的 <li> 元素一个父元素,这样

<ul id="toDo">
      <li class="todo">Example 1</li>
      <li class="todo">Example 2</li>
 </ul>

然后点击,创建一个新的 li,用输入值填充它,并将它追加到父级。

submitButton.addEventListener('click', function () {
            let newLi = document.createElement("li");
            li.innerText = document.getElementById('toDoText').value;
            document.getElementById("toDo").appendChild(newLi);
        });

我的建议是使用createElement('li') and setting the text(value) of the created element using createTextNode(input.value). Finally you have the insert the todo item, so we use insertBefore(newElm, currentElm)

const submitButton = document.getElementById('submitButton');

function addToDo() {

  // We select a container so we can insert our todo items in it
  let container = document.querySelector('div');
  
  // We get the value from the input
  let input = document.querySelector('#toDoText').value;
  
  // We create an element for each gotten input value
  const todo = document.createElement("li");
  
  // We set the text(value) of the todo item(li)
  const txt = document.createTextNode(input);
  
  // We append the text(value) to do created element(li)
  todo.appendChild(txt);
  
  // Finally we insert the last result(todo with value) inside the container(div)
  document.body.insertBefore(todo, container);
};

// We run the function
submitButton.addEventListener('click', addToDo);

// We prevent the form submit so we don't get any errors or blank page
document.querySelector("form").addEventListener('submit', e => e.preventDefault());
<form id="form">
  <input type="text" placeholder="Write your todo" id="toDoText">
  <input type="submit" id="submitButton">
</form>


<div>
</div>

我通过添加说明对您的代码进行了一些更改。

首先,因为您只有提交按钮,所以您可以在其自身的表单上使用提交事件侦听器。

然后防止在按下提交按钮时重新加载页面 .preventDefault() 您可以阅读更多相关信息 here.

要从表单中获取值,我们将使用名称而不是 ID,它与您使用的代码几乎相同,但您可以使用 todoForm.elements[FIELDNAME]

虽然为了在列表中创建新元素,您可以使用字符串文字,其中通过使用关闭 `` 之间的字符串,您可以通过关闭然后在 [=] 中将变量传递给它14=]

对于 .innerHTML +=,我们将把该字符串作为 HTML 作为最后一个元素附加。

const todoForm = document.forms["todoForm"]; // getting form DOM via it's name

todoForm.addEventListener('submit', addToDo); // adding submit listener to the form

function addToDo(evt) {
  evt.preventDefault(); // preventing the page to be reloaded after submit
  const list = document.getElementById('todoList');
  let toDoText = todoForm.elements["todoText"].value // getting value from input with todoText name
  
  list.innerHTML += `<li class="todo">${toDoText}</li>` // appending li element to todoList by using string literal
  todoForm.reset(); // resetting the form to the user can add new data.
}
<h1>TO-DO List</h1>
<form name="todoForm">
  <input type="text" placeholder="Write your todo" name="todoText">
  <input type="submit">
</form>

<ul id="todoList">
  <li class="todo">Example 1</li>
  <li class="todo">Example 2</li>
</ul>

我通常使用new FormData()来获取输入数据。像这样:

const form = document.getElementById("form");
const todos = document.getElementById("todos");

form.addEventListener("submit", (e) => {
  e.preventDefault();
  const formData = new FormData(e.target)
  const todo = document.createElement("li");
  todo.innerText = formData.get("todo");
  todo.setAttribute("class", "todo");
  todos.appendChild(todo);
  form.reset();
})
<form id="form">
  <input type="text" name="todo" placeholder="Write your todo" id="toDoText">
  <button type="submit">Submit</button>
</form>

<ol id="todos">
  <li class="todo">Example 1</li>
  <li class="todo">Example 2</li>
</ol>