javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异

在您开始本文的阅读前,我强烈建议您可以先读一读此篇:http://w3help.org/zh-cn/causes/SD9004.


     

     HTMLCollection 接口定义

interface HTMLCollection
{
      readonly attribute unsigned long   length;
      Node               item(in unsigned long index);
      Node               namedItem(in DOMString name);
}

对于 HTMLCollection集合对象 必须要说一说的是 namedItem方法. 看看规范的解释.




原文:
namedItem method
This method retrieves a Node using a name. With [HTML 4.01] documents, it first searches for a Node with a matching id attribute. If it doesn't find one, it then searches for a Node with a matching name attribute, but only on those elements that are allowed a name attribute. With [XHTML 1.0] documents, this method only searches for Nodes with a matching id attribute. This method is case insensitive in HTML documents and case sensitive in XHTML documents.


翻译:

namedItem 方法:

此方法获通过 "name"属性来获取节点.

在HTML4.01文档中,它首先搜索的是节点的ID属性的值. 如果没找到匹配节点,才去搜索name 属性与之匹配的节点. 即HTML4.01 DTD下,浏览器们应该优先通过ID来获取节点.其次才是name.

在XHTML 1.0文档中,则仅搜索ID与之匹配的节点.

对于节点(id or name)属性的值,此方法在HTML文档中忽略大小写区别,而在XHTML文档中.则要区别大小写.

上文中粗体部分很重要,没有这个作为指导的话.后面遇到的一些问题就很不好确定孰是孰非.因为众多浏览器的实现并不一样.


NodeList 接口定义


interface NodeList {
  Node                      item(in unsigned long index);
  readonly attribute  unsigned long        length;
};






 微软MSDN上查到的 NodeList实现 ,虽然这些资料告诉我们 NodeList继承了 Microsoft.SpeechServer.Dom.Collections.Collection Class . 但是事实却并不如此. 事实上,ie浏览器的NodeList不具备 ICollection接口定义的 namedItem 和 tags 两个方法.  实现了他们的 只有HTMLCollection类型.

此文档是 Speech Server 2007 用的,所以应该仅供参考.只能说明IE浏览器中的NodeList 还是遵守标准的.

public sealed class NodeList : Collection, INodeList, IEnumerable, IExpando, IReflect

NodeList的继承链:

System.Object      

  Microsoft.SpeechServer.Dom.Shim

    Microsoft.SpeechServer.Dom.DynamicShim 

      Microsoft.SpeechServer.Dom.Collections.Collection 

            Microsoft.SpeechServer.Dom.Collections.NodeList



Collection 实现的ICollection接口定义的属性和方法表


public properties : item(msdn上说item是重载,我表示诧异...),length

public methods    : item,namedItem,tags


ps:

1. 目前只有Opera的NodeList Class 是派生自 Collection Class 或HtmlCollection Class 的.所以此浏览器中NodeList集合对象也会具备 HTMLCollection接口实现的所有属性和方法.

2. MS 的ICollection 接口 定义了一个tags方法 用来根据tagName获取元素集合.其类型为 HTMLCollection 类型




 神秘的 StaticNodeList  


interface NodeSelector {
    Element   querySelector(in DOMString selectors);
    NodeList  querySelectorAll(in DOMString selectors);
  }

The NodeList object returned by the querySelectorAll() method must be static, not live ([DOM-LEVEL-3-CORE], section 1.1.1)


由于w3.org的[DOM-LEVEL-3-CORE]文档中,并没有StaticNodeList接口的定义. 只好在后面找出一份微软的代替之.

微软的一些相关:

基于 NodeList Class 是个密封类. 我们可以初步了解StaticNodeList 并不像最初我认为的那样,可能派生自NodeList. 而且规范说的明白. 这个集合是静态的.就是说它不会随着DOM树的变化而变化. 这种选择性去除基类能力的做法不符合继承的思想.所以只可能是另外的一个东东了.

Members Table

The following table lists the members exposed by the StaticNodeList object.

Attributes/Properties








Property Description
length Gets the number of characters in a TextNode object.

Methods








Method Description
item Retrieves an object from a childNodes or StaticNodeList collection.

Remarks

The collection will be empty if the querySelectorAll method returned no matches.

If the element tree is changed relative to the one or more original selectors used to generate the StaticNodeList collection, the collection (being static) will not be updated when the element tree changes.


测试:IE,     Firefox3.6,     Chrome10 Dev,     Opera 11,     Safari 5.02

测试主要针对nodeList 和 HTMLCollection, 并不涉及 xpath 以及namedNodeMap.等

关于namedNodeMap https://developer.mozilla.org/En/DOM/NamedNodeMap , http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1780488922

结果:



























































































































































限定方

方法\浏览器 IE8 IE9 beta7930.16406 FireFox4.0 beta7 Chrome10.0 Dev Safari5.02 Opear11
W3C DOM2 getElementsByTagName

HTMLCollection

HTMLCollection

HTMLCollection

NodeList

NodeList

NodeList

WHATWG HTML5

getElementsByClassName

HTMLCollection

HTMLCollection

HTMLCollection

NodeList

NodeList

NodeList

W3C DOM1

getElementsByName

HTMLCollection

HTMLCollection

HTMLCollection

NodeList

NodeList

NodeList

W3c Selectors API 1

querySelectorAll StaticNodeList

StaticNodeList

NodeList(Static)(注0)

NodeList(Static)

NodeList(Static)

NodeList(Static)

W3C DOM1

childNodes NodeList

NodeList

NodeList

NodeList

NodeList

NodeList

MS

children

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1

document.links

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1

document.images

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1

document.anchors

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1

document.forms

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1 document.applets

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1 formElement.elements

HTMLFormElement

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1 selectElement.options

HTMLSelectElement

HTMLSelectElement

HTMLOptionsCollection 

HTMLOptionsCollection 

HTMLOptionsCollection 

HTMLOptionsCollection

w3c DOM1 tableElement.rows

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

w3c DOM1 rowElement.cells

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

HTMLCollection

MS document.all

HTMLCollection

HTMLCollection

(S)-(注4)

(Q)object HTML document.all class

HTMLAllCollection(注1)

HTMLAllCollection(注2)

HTMLCollection(注3)

注0: 非IE 且支持 querySelectorAll 的浏览器返回的集合对象应该也叫StaticNodeList .但不知是否因规范中定义querySelectorAll方法返回类型为NodeList类型.

但规范中有注解这个NodeList 必须为静态的对象.即不随着DOM Tree的改变而改变, 其自身的改变也不应该影响到DOM Tree.那么他就不该再叫NodeList类型.

注1: Chrome中 直接打印document.all,会得到undefined . 但是并不影响我们对document.all的访问和使用.

Chrome3-浏览器中 仅仅是HTMLCollection,从Chrome4开始才是HTMLAllCollection

注2: Safari4中并不叫HTMLAllCollection 而只是 HTMLCollection

注3:Opera、Safari等浏览器中.也可以直接访问document.all , 但是 typeof document.all =='undefined'  以及 if(document.all){//此处逻辑永远不会被执行.}.但可以直接打印document.all



注4:Freifox在非标准模式,才支持document.all 且是一个很奇怪的东西.其构造器是Object. 这东西从FireFox 0.8时代貌似就有了.一直到现在的4.0 beta8 ...

ps:

.ie6,7可以参考ie8,测试方式是 使用namedItem 或 tags 两个方法是否被实现来检查其是否为nodeList 还是 HTMLCollection.

.不要奇怪为什么列表中没有window.frames,因为实际上window.frames在ie6,ie7,ie8(ie9已修改,所以同其他浏览器一样.)以外的浏览器中,就是window对象,即window === window.frames. ie6,7,8中大概window.frames是window对象的一个浅表复制. 所以实际上,要获取一个iframe,我们只需要 window[index||name]即可.


总结:

虽然看起来NodeList 和HTMLCollection 的差别仅在于 一个 namedItem 方法. 但这个方法本身也仅仅是在当前集合中 找到name 或 id符合的元素第一个元素出来

为了方便记忆,方便查找.我们应该尽量统一使用索引器代替 item以及namedItem方法. 但应注意 IE,Firefox对NodeList没有实现name索引器.Opera 的nodeList索引器 则可能返回一个NodeList集合(childNodes接口).  考虑到大多数问题出在childNodes接口上.我们紧紧需要铭记.对childNodes接口避免使用索引器即可. 对于querySelectorAll接口,甚至Opera也不支持其返回的NodeList(Static)的name索引器了.那么querySelectorAll的选择器一次性找到符合节点即可. 或者避免使用name索引器,改用 Number Index 索引器来筛选.



关于['name']索引方式应该注意的几个问题是 :

1. IE 又返回一个HTMLCollection集合(IE大概认为如果查找的元素集合中有表单元素,且name可能会出现重复.那么返回值就应该是一个集合.而不是单一元素.),且非表单元素name会被无视.

2.FireFox 和 opera 浏览器会 无视document.compatMode ,无视id或name,无视是否为表单元素,仅找出第一个符合 id或name任意一个为索引或namedItem()参数的元素.

3.webkit浏览器则无视document.compatMode,无视id,无视name,无视是否为表单元素,而仅仅找出id符合的元素.

(0)

相关推荐

  • javascript Array 数组常用方法

    (1)基本的数组方法 1.join() Array.join()方法将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串.可以自己指定分隔的符号,如果不指定,默认使用逗号 var arr = [1,2,3]; console.log(arr.join());//"1,2,3" console.log(arr.join("-"));//"1-2-3" var a = new Array(10); //长度为10的空数组 组成下边字符串

  • javascript常用的方法整理

    整理了一些JS的常用方法,包括验证啊,全选反选啊,ajax请求啊之类的,因为就是自己用的,写的都比较简单,就算抛砖引玉吧,喜欢的就拿去,不喜欢就拉到 Tools.min.js /** * JS公用类库文件 * 创建时间:2015-05-13 * 创建人:mction */ (function(){ var D = document; var W = window; var Postfix = '.php' var _Id = function(Id){return document.getEle

  • javascript常用方法汇总

    本章没有深奥的讲解js一些底层原理,比如this指针.作用域.原型啦,涉及的都是一些有利于平时开发时简化代码,提高执行效率,或者说可以当做一种经验方法来使用,篇幅都不长,小步快跑的让你阅读完整篇文章,体验编程的快乐.  获取两个区间之内随机数 复制代码 代码如下: function getRandomNum(Min, Max){ // 获取两个区间之内随机数     // @逆火狂飙  提出有可能第一个参数大于第二个参数,所以增加一下判断更可靠     if (Min > Max)     Ma

  • javascript 常用方法总结

    1.replace() 例: <script type="text/javascript"> var str="这个是text,下面还有一个text,这个text与那个text不相同"; document.write(str.replace(/text/g,"test"));//这个是把所有的text转换成test var str1="这个是Text,下面还有一个Text,这个Text与那个Text不相同"; do

  • Javascript select下拉框操作常用方法

    复制代码 代码如下: function AddDropDownList(id,fatherCtl) { if(!document.getElementById(id)) { var ddl = document.createElement('select'); ddl.setAttribute("id",id); if(fatherCtl&&document.getElementById(fatherCtl)) document.getElementById(fathe

  • jquery和javascript的区别(常用方法比较)

    jquery 就对javascript的一个扩展,封装,就是让javascript更好用,更简单.人家怎么说的来着,jquery就是要用更少的代码,漂亮的完成更多的功能.JavaScript 与JQuery 常用方法比较 1.加载DOM区别 JavaScript: window.onload function first(){ alert('first'); } function second(){ alert('second'); } window.onload = first; window

  • javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异

    在您开始本文的阅读前,我强烈建议您可以先读一读此篇:http://w3help.org/zh-cn/causes/SD9004.            HTMLCollection 接口定义 interface HTMLCollection{      readonly attribute unsigned long   length;      Node               item(in unsigned long index);      Node               na

  • javascript for-in有序遍历json数据并探讨各个浏览器差异

    object本身就是无对象的集合,因此在用 for-in 语句遍历对象的属性时,遍历出的属性顺序与对象定义时不同. 了解W3C标准: 根据 ECMA-262(ECMAScript)第三版中描述,for-in 语句的属性遍历的顺序是由对象定义时属性的书写顺序决定的. 关于 ECMA-262(ECMAScript)第三版中 for-in 语句的更多信息,请参考 ECMA-262 3rd Edition 中 12.6.4 The for-in Statement. 在现有最新的 ECMA-262(EC

  • javascript options属性集合操作代码

    复制代码 代码如下: <form name="testform"> <select name="testselect"> <option value="first">first option</option> <option value="second">second option</option> <option value="third

  • JavaScript 数据元素集合与数组的区别说明

    其中getElementsByName(name)方法是获取页面中所有具有name属性的元素,但这个方法在IE与标准浏览器中所取到的内容不一样.在IE中getElementsByName(name)方法所取到的元素是其本身就自带有name属性也就是form表单中所列出的所有元素(这些元素本身就自带有name属性):标准浏览器中getElementsByName(name)方法所取到的元素是具有name属性的元素(本身就带有此属性+人为添加的此属性).所以如果在IE浏览器中用此方法来获取页面中所有

  • 国外JavaScript经典封装集合整理第1/3页

    我想大家对我印象不是很深,但是我在经典已经有两三年了,我真的很喜欢这里,知道经典的人最常挂在嘴边的一句话就是︰经典论坛是牛人呆的地方. 我是一个爱好网页设计的人,但我却从来不与商业打交道,原因很简单,兴趣有时候单纯让它只是兴趣会比较好. 在经典呆的时间虽然不是很长,但是我跟大家一样,从经典学到很多东西,一想到这里,总觉得欠经典一份情,因为学到了很多东西,但是没有任何贡献. 发这篇并不是想引起大家的注意,只是这篇早该发的帖子却迟迟未发,搁在心里实在有点难受,所以趁着今天空闲着,赶紧把东西整理一下,

  • JavaScript 数据结构 之集合创建

    目录 一.什么是集合 二.创建集合类 1.has 方法 2.add 方法 3.delete 和 clear 方法 4.size 方法 5.values 方法 三.使用集合 总结 前言: 集合这个词应该比较耳熟,大多数人没接触代码前就学过了.回想一下你的高一数学课本上是不是出现过这个词,就在第一章,概念如下: 一般地,我们把研究的对象统称为元素,把一些元素组成的总体叫作集合. 你看,集合,元素,是不是与今天我们学习的数据结构相通呢? 一.什么是集合 集合是由一组无序且唯一(不能重复)的元素组成.数

  • JavaScript类属性的访问方式详解

    JavaScript类属性的访问方式 复制代码 代码如下: var fish = { head : 1, tail : 1, feature : { speak : false, swim : true } } 其一,点操作符: 复制代码 代码如下: console.log(fish.head);//1 console.log(fish.tail);//1 console.log(fish.feature);//Object { head:1, tail:1, feature: Object}

  • JavaScript 事件属性绑定带参数的函数

    例如不能采用这种调用方式:element.onclick = test();element.onclick = test(arg1,arg2);只能通过element.onclick = function(){ ... };或者element.onclick = test这种方式来实现,所以无法给函数传递参数.参考了大量的网上资料,解决这个问题的方式,以代码为例,如下所示: 复制代码 代码如下: function Handler() { }; Handler.prototype = { /* *

  • JavaScript Length 属性的总结

    关于javascript length属性的总结请看以下内容详解. 一.StringObject中的length length属性是返回字符串的字符数目. 例如: // 普通字符串 var str = "abcdef"; console.log(str.length); // 6 // 数组 var str1 = new Array(1,2,3,4); console.log(str1.length); // 4 // 数组与字符串 var str2 = str1 + str; //

  • JavaScript对象属性操作实例解析

    这篇文章主要介绍了JavaScript对象属性操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在js对象中,我们可以对对象属性进行操作. 上图的要点为:for-in会把原型链上的可枚举属性也列出来. 上图的要点为:可以使用逻辑运算符&&进行层层查找对象是否为undefined,从而在赋值过程中不报错. 上图的要点为: 1.delete不存在的属性,依旧返回true. 2.Object.getOwnPropertyDescrip

随机推荐