document.getelementsbytagname()方法的返回值
/*
document.getelementsbytagname()方法的返回值中取出某个特定的元素。一开始以为它的返回值是一个数组,结果,大错特错。它返回的是一个 dom 对象,可以遍历,有 length 属性,但不是数组。
证据在这里:
html code<script>
    window.onload = function() {
       var divs = document.getelementsbytagname("div");
       document.getelementbyid("info").innerhtml = !!(divs instanceof array);
    }
</script>
<div></div>
<div id="info"></div>

把它当array用的兄弟姐妹小心了。
既然不是array,那么它到底是什么呢?
继续探索之:
html code<script>
    window.onload = function() {
       var divs = document.getelementsbytagname("div");
       document.getelementbyid("info").innerhtml = object.prototype.tostring.call(divs);
    }
</script>
<div></div>
<div id="info"></div>

在各浏览器中打开:
ie: [object object]
firefox:[object htmlcollection]
chrome/safari /opera:[object nodelist]
这个结果让人很纠结,5 个浏览器3种结果,其中 ie 和firefox貌似不太合群。
无奈,干脆去查查标准。

w3c dom3中 document.getelementsbytagname() 方法的返回值

getelementsbytagname() 是 w3c 从 dom1就引进的获取拥有相同标签名称的一组元素的方法。而在 dom2 和 dom3 保留了这个接口。
它的返回值是一个 nodelist。
一下是它的接口说明:
c/c++ codeinterface element : node {
   ...
   nodelist getelementsbytagname(in domstring name);
   ...
}
dom3中关于 getelementsbytagname接口的详细说明,请看这里:getelementsbytagname

主流浏览器中 getelementsbytagname()方法的返回值

各浏览器官方文档中对于此方法的说明也符合w3c的规定,都是返回的 nodelist类型的对象集合。
看来,firefox跟自己矛盾了,哈哈。
关于资料,看这里
mozilla 官方:document.getelementsbyname
safari官方 webkit dom:getelementsbyname
msdn官方: getelementsbyname method
那么什么是nodelist接口呢,它又有什么特性呢,接着往下看。

nodelist 接口

w3c dom3规定,nodelist是一个有序的节点集合。

它的属性和方法:
nodelist . length
返回集合中的对象个数。length是只读属性。
node = nodelist . item(index)
从集合中返回指定索引的节点。

可见,nodelist类型的对象可以使用 item()方法获取其中的节点。
在 firefox,chrome和safari中,对于nodelist的定义与 w3c相同。
在 ie中,nodelist继承了collection接口,所以,nodelist对象支持collection接口中的方法。
opera 没有找到相关说明。
关于 nodelist的说明资料:
w3c dom3: interface nodelist
mozilla: nodelist
safari官方webkit dom: nodelist
msdn nodelist接口:nodelist class
下面开始介绍,如何

从 document.getelementsbytagname()方法的返回值中取值

汇总表:

注:
1. 红色代表不支持,绿色代表支持。
2. 对于 nodelist[name]、nodelist(name) 和 nodelist.nameditem(name)这 3行,ie的支持情况跟其他支持该方式的浏览器之间也存在差异,当document,getelementsbytagname()的返回值中存在相同 name 的元素时,ie返回一组元素,而其他支持的浏览器只返回符合的第一个元素。

可见,在ie和opera 中,getelementsbytagname()返回值更像一个htmlcollection;而在firefox中,介于htmlcollection和 nodelist之间。

nodelist[index]和 nodelist[id]

代码:
html code<script type="text/网页特效">
   window.onload = function() {
       var spans = document.getelementsbytagname("span");
       var span2 = spans[1];
       var span3 = spans["span3"];
       document.getelementbyid("info").innerhtml = "<br/>nodelist[index].id : " + span2.id
                                                                   + "<br/>nodelist[id].id : " + span3.id;
   }
</script>
<span id="span1"></span>
<span id="span2"></span>
<span id="span3"></span>

<div id="info"></div>

测试结果在各浏览器中都相同:

nodelist[index].id : span2
nodelist[name].id : span3

nodelist[name]

测试代码:
html code<script type="text/网页特效">
    window.onload = function() {
       var inputs = document.getelementsbytagname("input");
       var input_1 = inputs["input1"];
       document.getelementbyid("info").innerhtml += "<br/>nodelist[name].id : " + input_1.id;
    }
</script>
<input id="ipt1" name="input1">
<input id="ipt2" name="input2">
<input id="ipt3" name="input3">

<div id="info"></div>

结果:
firefox、opera和ie,都输出的是:nodelist[name].id : ipt1
chrome 和safari报错,它们不支持这种方式。

另外,firefox和opera中,此方法存在差异,因为 name 属性可以相同,当存在多个相同 name 的元素时,firefox和opera中取出的还是第一个,而ie取出的则是一个组。
看代码:
html code<script type="text/javascript">
    window.onload = function() {
       var inputs = document.getelementsbytagname("input");
       var input_1 = inputs["input1"];
       document.getelementbyid("info").innerhtml += "nodelist[name].id : " + input_1.id+
               "<br/>nodelist[name].length : " + input_1.length;
    }
</script>
<input id="ipt1" name="input1">
<input id="ipt2" name="input1">
<input id="ipt3" name="input3">

<div id="info"></div>

在firefox和opera中输出:
nodelist[name].id : ipt1
nodelist[name].length : undefined
ie 中:
nodelist[name].id : undefined
nodelist[name].length : 2

nodelist(index)

测试用例代码:
html code<script type="text/javascript">
   window.onload = function() {
       var spans = document.getelementsbytagname("span");
       try {
           var span2 = spans(1);
           document.getelementbyid("info").innerhtml = "nodelist(index).id: " + span2.id;
       } catch(err) {
           document.getelementbyid("info").innerhtml = "nodelist(index) : " + err;
       }
   }
</script>
<span id="span1"></span>
<span id="span2"></span>

<div id="info"></div>

以上代码,只有在firefox中报错:typeerror: spans is not a function
其他浏览器中的输出:nodelist(index).id: span2

nodelist(id)

测试代码:
html code<script type="text/javascript">
    window.onload = function() {
        var spans = document.getelementsbytagname("span");
        try {
            var span2 = spans("span2");
            document.getelementbyid("info").innerhtml = "nodelist(id).id: " + span2.id;
        } catch(err) {
            document.getelementbyid("info").innerhtml = "nodelist(id) : " + err;
        }
    }
</script>
<span id="span1"></span>
<span id="span2"></span>

<div id="info"></div>

firefox、 chrome和safari报错,ie 和 opera 依然支持。

nodelist(name)

看测试用例代码:
html code<script type="text/javascript">
    window.onload = function() {
       var inputs = document.getelementsbytagname("input");
       var input_1 = inputs("input1");
       document.getelementbyid("info").innerhtml += "nodelist(name).id : " + input_1.id+

"<br/>nodelist(name).length : " + input_1.length;
    }
</script>
<input id="ipt1" name="input1">
<input id="ipt2" name="input1">
<input id="ipt3" name="input3">

<div id="info"></div>

以上代码,ie和opera都支持。但是,支持情况也有差异,同 nodelist[name]。
firefox和webkit浏览器都不支持。

nodelist.item(index)

看测试用例代码:
html code<script type="text/javascript">
    window.onload = function() {
        var spans = document.getelementsbytagname("span");
        try {
            var span2 = spans.item(1);
            document.getelementbyid("info").innerhtml = "nodelist.item(idx).id: " + span2.id;
        } catch(err) {
            document.getelementbyid("info").innerhtml = "nodelist.item(idx) : " + err;
        }
    }
</script>
<span id="span1"></span>
<span id="span2"></span>

<div id="info"></div>

经过测试,各浏览器都支持这种方式。

nodelist.nameditem(id)

测试用例代码:
html code<script type="text/javascript">
    window.onload = function() {
        var spans = document.getelementsbytagname("span");
        try {
            var span2 = spans.nameditem("span2");
            document.getelementbyid("info").innerhtml = "nodelist.nameditem(name).id: " + span2.id;
        } catch(err) {
            document.getelementbyid("info").innerhtml = "nodelist.nameditem(name) : " + err;
        }
    }
</script>
<span id="span1"></span>
<span id="span2"></span>

<div id="info"></div>

chrome和safari不支持此方法,报错。
其他浏览器输出:nodelist.nameditem(id).id: span2

nodelist.nameditem(name)

测试用例代码:
html code<script type="text/javascript">
    window.onload = function() {
       var inputs = document.getelementsbytagname("input");
       var input_1 = inputs.nameditem("input1");
       document.getelementbyid("info").innerhtml += "inputs.nameditem(name).id : " + input_1.id+
               "<br/>inputs.nameditem(name).length : " + input_1.length;
    }
</script>
<input id="ipt1" name="input1">
<input id="ipt2" name="input1">
<input id="ipt3" name="input3">

<div id="info"></div>

chrome 和 safari 不支持这个方法。
firefox、 opera和ie都支持,但存在差异,情况跟nodelist[name]相同。

使用document.getelementsbytagname()的误差

在利用getelementsbytagname()方法取同一类对象时,浏览器插件生成的标签也会被计算在内。例如,在document.getelementsbytagname("div")的返回值中,包括firebug插件的div标签。所以,如果利用index取值,可能会跟预想的结果不同。

总结

这个方法真不让人省心啊,既然兼容性问题这么多,那么,应该怎样避免此类问题的发生呢?其实,很简单,用上面表里,所有浏览器都支持的方法就好。少用 index 取元素,不够准确。另外,没有特殊需求而仅仅为了获取元素,请使用document.getelmentbyid()。

document.getElementsByTagName()方法的返回值相关推荐

  1. java gettext返回值_012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)...

    EditText中的getText()方法的返回值为CharSequence,如果我们想要获得string类型数据的话,需要在后边加上.toString 另外,String类型转为int:Intege ...

  2. 获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)

    获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题) 参考文章: (1)获取可视区域高度赋值给div(解决document.body.client ...

  3. Spring-AOP @AspectJ进阶之绑定连接点方法的返回值

    文章目录 概述 实例 概述 在后置增强中,可以通过returning绑定连接点方法的返回值 实例 代码已托管到Github-> https://github.com/yangshangwei/S ...

  4. setTimeout() 方法的返回值

    setTimeout() 方法的返回值 setTimeout() 方法的返回值是一个唯一的数值,这个数值有什么用呢?如果你想要终止 setTimeout() 方法的执行,那就必须使用 clearTim ...

  5. C#为什么支持协变的参数只能用于方法的返回值?支持逆变的参数只能用于方法参数?...

    "TParent不能安全转换成TSub",是这两个问题的共同原因. 我们定义一个接口IFoo. interface IFoo<T>     {         void ...

  6. 函数式接口作为方法的返回值类型案例

    类似地,如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式.当需要通过一 个方法来获取一个java.util.Comparator 接口类型的对象作为排序器时,就可以调 ...

  7. Spring MVC 中的 controller层的方法的返回值类型

    Controller方法的返回值可以有以下几种: 1.返回ModelAndView 返回ModelAndView时最常见的一种返回结果.需要在方法结束的时候定义一个ModelAndView对象,并对M ...

  8. controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

    Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题.本文以实现方式.实质.实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章 ...

  9. Java面试题:IO流中read()方法为什么返回值是int

    Question:IO流中read()方法为什么返回值是int? anwser:因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte, ...

最新文章

  1. Spring Boot 集成Swagger2生成RESTful API文档
  2. asp.net 对xml文件的读写,添加,修改,删除操作
  3. mysql删除redo_删除redo log group or member
  4. (转)spring源码解析,spring工作原理
  5. Python list, dict, set, tuple
  6. 【ArcGIS风暴】ArcGIS Editor for OSM中文教程(2):下载及加载OSM数据
  7. Waymo无人出租车年底发射,现已进入定价环节 | 公交部门竟成友军?
  8. [Python] 探索性编程与idleX
  9. mysql数据库原理设计与应用在线pdf_MySQL数据库原理、设计与应用
  10. Unity支持的C#版本
  11. 基于简单MLP模型的加州房价预测
  12. VSCode常用插件和快捷键总结
  13. 3dmark压力测试 linux,拷机还用Furmark? 瞧瞧3DMark压力测试怎样玩
  14. 7. 全概率公式与贝叶斯公式
  15. 多图带您领略Windows 10 Server虚拟化平台风采
  16. (二)编译PVE内核5.10.6-1-pve及安装内核补丁fullconeNat
  17. 元胞自动机CA+生命游戏代码
  18. 常用传感器讲解十四--障碍探测器(KY-032)
  19. 每天都在“刷脸”,真的安全吗?
  20. ipv6掩码格式解析

热门文章

  1. 【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
  2. 【错误记录】发布 Flutter 插件包报错 ( Failed to upload the package.pub finished with exit code 1 )
  3. IDEA 快捷键MacOS
  4. DOM-添加元素、节点
  5. spark 执行流程及各组件执行
  6. Python中的元类(metaclass)
  7. #在android studio中维护日程管理系统
  8. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
  9. 默认子进程与父进程属于同一个进程组,所以注意对接受到的信号的处理方式
  10. 带字的图片如何转换成可编辑的文字?