使用JavaScript删除特定的<li>元素

Nah*_*d39 9 javascript dom

该函数似乎不会删除Node包含指定值的函数,除非它是第一个值(在本例中为'apples').在删除任何类型之前,for循环还必须执行两次.为什么会这样?

function removeSpec()
{
    var query = document.getElementById('spec').value;  /* Value inputted by user */
    elements = document.getElementsByClassName('fruit'); /* Get the li elements in the list */
    var myList = document.getElementById("myList3"); /* Var to reference the list */
    var length = (document.getElementsByClassName('fruit').length); /* # of li elements */
    var checker = 'false'; /* boolean-ish value to determine if value was found */

    for(var counter = 0; counter < length; counter ++)
    {
        if (elements[counter].textContent == query )
        {
             alert("Counter : " + counter);
             myList.removeChild(myList.childNodes[ (counter) ]);
             checker="true";
        }
    }
  if ( checker == "false") 
   {
       alert("Not Found");
   }
}
Run Code Online (Sandbox Code Playgroud)

相应的HTML:

  <ul id="myList3">
                <li class="fruit" >Apples</li>
                <li class="fruit" >Oranges</li>
                <li class="fruit" >Banannas</li>
                <li class="fruit">Strawberry</li>
   </ul>
   <form> 
           Value: <input type="text" name="" value="" id="spec">
   <br><br>
    </form>
    <button type="button" style="height:20px;width:200px" href="javascript:void(0)" onclick="removeSpec()" > 

        Remove Specified 
   </button>
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 13

childNodes返回所有子节点的列表.这包括文本节点.在每个<li>元素之间,您有一个包含空格和换行符的文本节点.因此,childNodes返回9个节点的列表,但是您假设列表包含4个节点(document.getElementsByClassName('fruit').length).

你可以用.children而不是.childNodes..children返回仅列出元素节点的列表.或者更好的是,使用elements,因为这就是你在迭代的东西.

您还需要在找到已删除的节点后停止迭代,否则您将尝试访问不再存在的位置.

function removeSpec()
{
    var query = document.getElementById('spec').value;  /* Value inputted by user */
    elements = document.getElementsByClassName('fruit'); /* Get the li elements in the list */
    var myList = document.getElementById("myList3"); /* Var to reference the list */
    var length = (document.getElementsByClassName('fruit').length); /* # of li elements */
    var checker = 'false'; /* boolean-ish value to determine if value was found */

    for(var counter = 0; counter < length; counter ++)
    {
        if (elements[counter].textContent == query )
        {
             myList.removeChild(myList.children[ (counter) ]);
             // better: myList.removeChild(elements[counter]);
             checker="true";
             break;
        }
    }
  if ( checker == "false") 
   {
       alert("Not Found");
   }
}
Run Code Online (Sandbox Code Playgroud)
<ul id="myList3">
                <li class="fruit" >Apples</li>
                <li class="fruit" >Oranges</li>
                <li class="fruit" >Banannas</li>
                <li class="fruit">Strawberry</li>
   </ul>
   <form> 
           Value: <input type="text" name="" value="" id="spec">
   <br><br>
    </form>
    <button type="button" style="height:20px;width:200px" href="javascript:void(0)" onclick="removeSpec()" > 

        Remove Specified 
   </button>
Run Code Online (Sandbox Code Playgroud)


还有其他事情可以改进(例如,为什么不给实际的布尔值分配checker?),但它们与你的问题无关.


小智 1

我运行这段代码。你应该添加这一行

elements[counter].remove();
Run Code Online (Sandbox Code Playgroud)

而不是这一行

myList.removeChild(myList.childNodes[ (counter) ]);
Run Code Online (Sandbox Code Playgroud)