操作getElementsByTagName返回的元素集合需要注意的细节

学习javascript不仔细还真不行。

如题所说,当你对getElementsByTagName返回的集合中的元素执行删除节点的操作时,集合的length是会变化的,例如

<div id="attachList">
    <input type="file" name="img" />
    <input type="file" name="img" />
    <input type="file" name="img" />
    <input type="file" name="img" />
    <a id="btn" id="delete">删除</a>
</div>

然后使用javascript删除div当中的input元素,如果你这样做

var btn=document.getElementById("btn");
btn.onclick=function(){
    var attach=document.getElementById("attachList");
    var filefield=attach.getElementsByTagName("input");
    for(var i=0,len=filefield.length;i<len;i++){
        attach.removeChild(filefield[i]);
    }
}    

当你点击按钮后会把div里面的input全部删除吗?不会,最终会剩下2个,因为当你删除一个input后,filefield集合的length会相应的减一,当i等于filefield的length时,删除操作无法再执行,同理对于getElementsByClassName返回的元素集合也是这样。

要完全删除可以这样:

var btn=document.getElementById("btn");
btn.onclick=function(){
    var attach=document.getElementById("attachList");
    var filefield=attach.getElementsByTagName("input");
    for(var i=0,len=filefield.length;i<len;i++){
        attach.removeChild(filefield[0]);
    }
}    

把删除操作中的索引保持为0,但是要注意filefield的length一定要缓存,否则会出现和上面一样的问题;

也可以这样做:

var btn=document.getElementById("btn");
btn.onclick=function(){
    var attach=document.getElementById("attachList");
    var filefield=attach.getElementsByTagName("input");
    for(var len=filefield.length,i=len-1;i>=0;i--){
        attach.removeChild(filefield[i]);
    }
}  
时间: 2024-08-23 13:16:16

操作getElementsByTagName返回的元素集合需要注意的细节的相关文章

[ jquery 过滤器 is(expr | jqObj | ele | function) ] 此方法用于在选择器的基础之上根据选择器、DOM元素或 jQuery 对象来检测匹配元素集合,如果有,则返回true

根据选择器.DOM元素或 jQuery 对象来检测匹配元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true. 如果没有元素符合,或者表达式无效,都返回'false'. '''注意:'''在jQuery 1.3中才对所有表达式提供了支持.在先前版本中,如果提供了复杂的表达式,比如层级选择器(比如 + , ~ 和 > ),始终会返回true 实例: <!DOCTYPE html> <html lang='zh-cn'> <head> <title&

从头认识Spring-1.16 SpEl对集合的操作(2)-查询集合以及投影元素集合

这一章节我们来讨论一下查询集合以及投影元素集合. 我们下面用一个例子说明上面的这两个部分. 1.domain 蛋糕类:(不变) package com.raylee.my_new_spring.my_new_spring.ch01.topic_1_21; public class Cake { private String name = ""; private double size = 0; public String getName() { return name; } publi

在Js中得到元素的子元素集合注意事项

http://www.cnblogs.com/phonefans/archive/2008/09/04/1283739.html 在Js中得到元素的子元素集合注意事项 费话少说,直接看例子: 1 <ul>2  <li>this's one</li>3  <li>this's two</li>4  <li>this's three</li>5  <li>this's four</li>6 <ul

四:redis的sets类型相关操作(有序和无序集合)

================四五种(有序和无序集合):sets类型(就是集合)============= 一介绍:  set表示集合,添加是是随意添加的----->无序集合 set是集合,它是string类型的无序集合. set是通过hash table实现的,添加,删除和查找的复杂度都是0(1). 对集合我们可以取并集.交集.差集. 通过这写操作我们可以实现sns中的好友推荐和blog的tag功能 1:sadd 向名称key的set中添加元素(唯一的) 例:sadd myset1 one 

[ jquery 文档处理 appendTo(content) ] 此方法用于把所有匹配的元素追加到另一个指定的元素集合中

把所有匹配的元素追加到另一个指定的元素元素集合中. 实际上,使用这个方法是颠倒了常规的$(A).append(B)的操作,即不是把B追加到A中,而是把A追加到B中. 在jQuery 1.3.2中,appendTo, prependTo, insertBefore, insertAfter, 和 replaceAll这个几个方法成为一个破坏性操作,返回值是所有被追加的内容,而不仅仅是先前所选中的元素.所以,要选择先前选中的元素,需要使用end()方法,参见例二. 实例: <html lang='z

jQuery操作Form表单元素

Web开发中常常须要操作表单,form表单元素有select.checkbox.radio.textarea.button.file.text.hidden.password等. 当中checkbox和radio的读写值操作比較多变,checkbox和radio常常常使用在一个分组里.实现多选或者单选. jQuery提供了利用表单选择器我们能够极其方便地获取表单的某个或某类型的元素. 选择器 返回 演示样例 :input 集合元素 $(":input")选取全部,,和元素. :text

[ jquery 方法 index(selector | element) ] 此方法返回相应元素的索引值

搜索匹配的元素,并返回相应元素的索引值,从0开始计数,如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的位置:  如果参数是一组DOM元素或者jQuery对象,那么返回值就是传递的元素相对于原先集合的位置 如果参数是一个选择器,那么返回值就是原先元素相对于选择器匹配元素中的位置.如果找不到匹配的元素,则返回-1 实例: <!DOCTYPE html> <html lang='zh-cn'> <head> <

Entity Framework 6 Recipes 2nd Edition(10-1)译-&gt;非Code Frist方式返回一个实体集合

存储过程 存储过程一直存在于任何一种关系型数据库中,如微软的SQL Server.存储过程是包含在数据库中的一些代码,通常为数据执行一些操作,它能为数据密集型计算提高性能,也能执行一些为业务逻辑. 当你使用数据的时候,有时你会通过存储过程来获取它们. 在本章, 我们探讨一些EF在使用存储过程时,需要关注的地方.我们在本书的其它章节也使用了存储过程, 但通常都是context为执行插入.更新和删除动作. 在本章,我们将为你展示多种使用存储过程的方式. 10-1. 非Code Frist方式返回一个

[ jquery 文档处理 insertAfter(content) after(content|fn) ] 此方法用于把所有匹配的元素插入到另一个、指定的元素元素集合的后面,实现外部插入

after(content | fn):在每个匹配的元素之后插入内容 insertAfter(content): 把所有匹配的元素插入到另一个.指定的元素元素集合的后面 实际上,使用这个方法是颠倒了常规的$(A).after(B)的操作,即不是把B插入到A后面,而是把A插入到B后面 在jQuery 1.3.2中,appendTo, prependTo, insertBefore, insertAfter, 和 replaceAll这个几个方法成为一个破坏性操作,要选择先前选中的元素,需要使用en