>source

자바 함수에 대해 항목을 추가, 삭제할 수있는 JavaScript로 할 일 앱이 있습니다. 그러나 일단 수정 버튼을 클릭하면 첫 번째 항목 만 응답하지만 다른 항목은 아무것도하지 않습니다.

응답 성을 높이고 여기에서 수정하는 방법

내 코드는 다음과 같습니다 :

// Define UI Vars
const form = document.querySelector('#task-form');
const taskList = document.querySelector('.collection');
const clearBtn = document.querySelector('.clear-tasks');
const filter = document.querySelector('#filter');
const taskInput = document.querySelector('#task');
const editList = null;
// Load all event listeners
loadEventListeners();
// Load all event listeners
function loadEventListeners() {
  // Add task event
  form.addEventListener('submit', addTask);
  // Remove task event
  taskList.addEventListener('click', removeTask);
   //edit task
//
  // Clear task event
  clearBtn.addEventListener('click', clearTasks);
  // Filter tasks event
  filter.addEventListener('keyup', filterTasks);
}

// Add Task
function addTask(e) {
  if(taskInput.value === '') {
    alert('Add a task');
  }
  // Create li element
  const li = document.createElement('li');
  // Add class
  li.className = 'collection-item';
  // Create text node and append to li
  li.appendChild(document.createTextNode(taskInput.value));
  // Create new link element
  const link = document.createElement('a');
  // Add class
  link.className = 'delete-item secondary-content';
  // Add icon html
  link.innerHTML = '<i class="fa fa-remove"></i>';
  // Append the link to li
  li.appendChild(link);

  // Append li to ul
  taskList.appendChild(li);
  const editButton=document.createElement("button");//edit button
  editButton.className="editbtn";
  editButton.innerText="Edit";//innerText encodes special characters, HTML does not.
  li.appendChild(editButton);
  taskList.appendChild(editButton);
  const editList = document.querySelector('.editbtn');
  editList.addEventListener('click',editTask)
  // Clear input
  taskInput.value = '';
  e.preventDefault();
}
// Remove Task
function removeTask(e) {
  if(e.target.parentElement.classList.contains('delete-item')) {
    if(confirm('Are You Sure?')) {
      e.target.parentElement.parentElement.remove();
    }
  }
}
// Clear Tasks
function clearTasks() {
  // taskList.innerHTML = '';
  // Faster
  while(taskList.firstChild) {
    taskList.removeChild(taskList.firstChild);
  }
  // https://jsperf.com/innerhtml-vs-removechild
}

// Filter Tasks
function filterTasks(e) {
  const text = e.target.value.toLowerCase();
  document.querySelectorAll('.collection-item').forEach(function(task){
    const item = task.firstChild.textContent;
    if(item.toLowerCase().indexOf(text) != -1){
      task.style.display = 'block';
    } else {
      task.style.display = 'none';
    }
  });
}
function editTask (e) {
   console.log('clicked')
}

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">
  <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
  <title>Task List</title>
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="col s12">
        <div id="main" class="card">
          <div class="card-content">
            <span class="card-title">Task List</span>
            <div class="row">
              <form id="task-form">
                <div class="input-field col s12">
                  <input type="text" name="task" id="task">
                  <label for="task">New Task</label>
                </div>
                <input type="submit" value="Add Task" class="btn">
              </form>
            </div>
          </div>
          <div class="card-action">
            <h5 id="task-title">Tasks</h5>
            <div class="input-field col s12">
              <input type="text" name="filter" id="filter">
              <label for="filter">Filter Tasks</label>
            </div>
            <ul class="collection"></ul>
            <a href="#" class="clear-tasks btn black">Clear Tasks</a>
          </div>
        </div>
      </div>
    </div>
  </div>
  <script
  src="https://code.jquery.com/jquery-3.2.1.js"
  integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE="
  crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
  <script src="app.js"></script>
</body>
</html>

질문을 읽어 주셔서 감사합니다

안녕하세요


  • 답변 # 1

    const editList = document.querySelector('.editbtn'); 때문에

     클릭하여 추가 한 첫 번째 버튼을 선택합니다. 방금 추가 한 버튼을 선택하지 않았습니다. 따라서 첫 번째 요소는 점점 더 많은 이벤트 리스너를 계속 추가하기 때문에 여러 번 해당 기능을 시작하는 것입니다.

    이미 버튼에 대한 참조가 있으므로 찾아 볼 필요가 없습니다.

    editButton.addEventListener('click', editTask)
    
    

  • 답변 # 2

    document.querySelector()  일치하는 첫 번째 요소를 반환합니다.  첫 번째 편집 버튼을 반환합니다. 직접 querySelector()   addEventListener 에   editButton 에서 전화하는 대신

    querySelector()
    
    
    editButton.addEventListener('click',editTask)

관련 자료

  • 이전 python - 메타 클래스 충돌없이 PyQt 서브 클래스에 일반 타이핑을 사용하려면 어떻게해야합니까?
  • 다음 xcode - USDZ를 STL과 같은 솔리드 메시로 변환 할 수 있습니까