classList.add 不起作用

新手上路,请多包涵

我正在尝试使用 JavaScript 制作一个简单的待办事项列表。基本上,您在输入字段中输入一个项目,它会被添加到列表中,如果它已完成则单击它,然后它就会被划掉。如果您单击已被划掉的列表,则会删除该行。但是,虽然删除一条线有效,但添加一条线是行不通的。

HTML:

     <div><input type="text" value="" id="new_task"><button id="add_task">Add Task</button></div>

    <ul id="tasks">
        <li class="completed selected">One Task</li>
        <li>Two Task</li>
    </ul>

CSS:

 <style type="text/css" media="screen">
    /*local styles if any (quick tests and local only overrides)*/

    #tasks li{
        list-style: none;
    }

    #tasks .selected{
        list-style: disc;
    }

    .completed{
        text-decoration: line-through;
    }
</style>

脚本:

 <script type="text/javascript" charset="utf-8">
    var inputField = document.querySelector("#new_task");
    var myButton = document.querySelector("#add_task");
    var taskList = document.querySelector("#tasks");
    var newList = document.createElement("li");
    var completeTask = document.querySelector("li.completed.selected");
    var incompleteTask = document.querySelector("li:not([class])");

    myButton.onclick = function() {

    taskList.appendChild(newList);
    newList.innerHTML = inputField.value;
    inputField.value = "";
    }

    completeTask.onclick = function() {
    event.target.classList.remove("completed","selected");
    }

    incompleteTask.onclick = function() {
    event.target.classList.add("completed","selected");
    }

</script>

原文由 Jaeeun Lee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

该脚本仅解析文档一次并 document.querySelector("li.completed.selected") 返回一个节点。因此,删除这些类仅适用于在解析脚本时具有这些类的 One Task

您需要手动将 onclick 处理程序添加到创建的每个项目,请参阅 jsFiddle

     var inputField = document.querySelector("#new_task");
    var myButton = document.querySelector("#add_task");
    var taskList = document.querySelector("#tasks");
    var lis = document.querySelectorAll("#tasks li");

function clickHandler() {
      if(event.target.classList.contains("completed"))
         event.target.classList.remove("completed","selected");
      else
         event.target.classList.add("completed","selected");
}

// add onclick handler to existing nodes
for(var i=0; i<lis.length; ++i) lis[i].onclick = clickHandler;

myButton.onclick = function() {
    var newList = document.createElement("li");
    taskList.appendChild(newList);
    newList.innerHTML = inputField.value;
    inputField.value = "";
    // add onclick handler to new nodes
    newList.onclick = clickHandler;

}

原文由 Jan Turoň 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以简单地使用 --- 的 classList toggle 方法来交换您的类 li s。只需选择您所有的 li 并将它们的点击事件处理程序设置为切换类的函数。

 function ch() {
    this.classList.toggle("completed");
    this.classList.toggle("selected");
}

var items = document.querySelectorAll('li');
for (var x = items.length - 1; x >= 0; x--){
    items[x].onclick = ch;
}

http://jsfiddle.net/RXH69/

原文由 Musa 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题