该函数似乎不会删除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)
| 归档时间: |
|
| 查看次数: |
1870 次 |
| 最近记录: |