代码之家  ›  专栏  ›  技术社区  ›  user9127206

Javascript-事件不能与其他事件一起使用

  •  0
  • user9127206  · 技术社区  · 8 年前

    我正在尝试用纯javascript编写“todo”应用程序。我创建了一个“newTask”活动,它也很有效,之后我创建了 deleteTask 而且它也起到了作用。但我意识到我不能用 删除任务 事件代码,如果我删除deleteTask代码,它会再次工作吗?

    我在这里犯了什么错?

    const task = document.querySelector('#task');
    const form = document.querySelector('#task-form');
    const ul = document.querySelector('ul');
    
    form.addEventListener('submit', newTask);
    
    document.body.addEventListener('click', deleteTask);
    
    function newTask(e) {
      if (task.value) {
        let li = document.createElement('li');
        li.className = "collection-item";
        li.appendChild(document.createTextNode(task.value));
        let href = document.createElement('a');
        href.className = "delete-item secondary-content";
        href.innerHTML = '<i class="fa fa-remove"></i>';
        href.setAttribute('href', '#');
        li.appendChild(href);
        ul.appendChild(li);
      } else {
        alert('Please type something');
      }
      e.preventDefault();
      form.reset();
    }
    
    function deleteTask(e) {
      if (e.target.classList.contains('fa-remove')) {
        e.target.parentElement.parentElement.remove();
      }
      e.preventDefault();
    }
    <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">
                  <p style="background-color:red;color:white;text-align:center" id="error"></p>
                  <form id="task-form">
                    <div class="input-field col s12">
                      <input type="text" name="task" id="task">
                      <label for="task">New Task</label>
                    </div>
                </div>
                <input type="submit" value="Add Task" class="btn">
                </form>
              </div>
              <div class="card-action">
                <h5 id="task-title">Tasks</h5>
                <ul class="collection">
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                </ul>
                <button class="btn black" id="clear-tasks">Clear Tasks</button>
              </div>
            </div>
          </div>
        </div>
      </div>
    2 回复  |  直到 8 年前
        1
  •  0
  •   Barmar    8 年前

    e.preventDefault() 内部 if . 否则,它会阻止 click 事件传播到其他元素。

    我知道你说过你试过了,但在这里很管用。

    const task = document.querySelector('#task');
    const form = document.querySelector('#task-form');
    const ul = document.querySelector('ul');
    
    form.addEventListener('submit', newTask);
    
    document.body.addEventListener('click', deleteTask);
    
    function newTask(e) {
      if (task.value) {
        let li = document.createElement('li');
        li.className = "collection-item";
        li.appendChild(document.createTextNode(task.value));
        let href = document.createElement('a');
        href.className = "delete-item secondary-content";
        href.innerHTML = '<i class="fa fa-remove">X</i>';
        href.setAttribute('href', '#');
        li.appendChild(href);
        ul.appendChild(li);
      } else {
        alert('Please type something');
      }
      e.preventDefault();
      form.reset();
    }
    
    function deleteTask(e) {
      if (e.target.classList.contains('fa-remove')) {
        e.target.parentElement.parentElement.remove();
        e.preventDefault();
      }
    
    }
    <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">
                <p style="background-color:red;color:white;text-align:center" id="error"></p>
                <form id="task-form">
                  <div class="input-field col s12">
                    <input type="text" name="task" id="task">
                    <label for="task">New Task</label>
                  </div>
              </div>
              <input type="submit" value="Add Task" class="btn">
              </form>
            </div>
            <div class="card-action">
              <h5 id="task-title">Tasks</h5>
              <ul class="collection">
                <li class="collection-item">
                  List Item
                  <a href="#" class="delete-item secondary-content">
                    <i class="fa fa-remove"></i>
                  </a>
                </li>
                <li class="collection-item">
                  List Item
                  <a href="#" class="delete-item secondary-content">
                    <i class="fa fa-remove"></i>
                  </a>
                </li>
                <li class="collection-item">
                  List Item
                  <a href="#" class="delete-item secondary-content">
                    <i class="fa fa-remove"></i>
                  </a>
                </li>
                <li class="collection-item">
                  List Item
                  <a href="#" class="delete-item secondary-content">
                    <i class="fa fa-remove"></i>
                  </a>
                </li>
                <li class="collection-item">
                  List Item
                  <a href="#" class="delete-item secondary-content">
                    <i class="fa fa-remove"></i>
                  </a>
                </li>
              </ul>
              <button class="btn black" id="clear-tasks">Clear Tasks</button>
            </div>
          </div>
        </div>
      </div>
    </div>
        2
  •  0
  •   Sébastien    8 年前

    以下事件处理程序捕获 全部的 单击车身:

    document.body.addEventListener('click', deleteTask);
    

    因此,当您在 deleteTask 功能您还可以阻止其他按钮上的默认操作,包括“添加任务”按钮。

    既然你已经检查了点击的目标,你也应该 只有 在这种情况下防止默认的单击操作:

    function deleteTask(e) {
      if (e.target.classList.contains('fa-remove')) {
        e.target.parentElement.parentElement.remove();
        e.preventDefault(); // Move preventDefault here
      }
    }
    

    const task = document.querySelector('#task');
    const form = document.querySelector('#task-form');
    const ul = document.querySelector('ul');
    
    form.addEventListener('submit', newTask);
    
    document.body.addEventListener('click', deleteTask);
    
    function newTask(e) {
      if (task.value) {
        let li = document.createElement('li');
        li.className = "collection-item";
        li.appendChild(document.createTextNode(task.value));
        let href = document.createElement('a');
        href.className = "delete-item secondary-content";
        href.innerHTML = '<i class="fa fa-remove"></i>';
        href.setAttribute('href', '#');
        li.appendChild(href);
        ul.appendChild(li);
      } else {
        alert('Please type something');
      }
      e.preventDefault();
      form.reset();
    }
    
    function deleteTask(e) {
      if (e.target.classList.contains('fa-remove')) {
        e.target.parentElement.parentElement.remove();
        e.preventDefault();
      }
      //
    }
    <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">
                  <p style="background-color:red;color:white;text-align:center" id="error"></p>
                  <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 class="card-action">
                <h5 id="task-title">Tasks</h5>
                <ul class="collection">
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                  <li class="collection-item">
                    List Item
                    <a href="#" class="delete-item secondary-content">
                      <i class="fa fa-remove"></i>
                    </a>
                  </li>
                </ul>
                <button class="btn black" id="clear-tasks">Clear Tasks</button>
              </div>
            </div>
          </div>
        </div>
      </div>