Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

NodeList与HTMLCollection

  很多属性或方法都可以获取到元素或节点集合,返回的结果一般是NodeList与HTMLCollection这两种形式。这两个东西不仅在各浏览器之间存在差异,就连制定规范的W3C和WHATWG都存在分歧。这是个目前依然纠结不清的问题,我个人比较赞同WHATWG的逻辑。
  W3C规定getElementsByTagName方法应该返回NodeList,而WHATWG则表示应该返回HTMLCollection。我非常不理解W3C的这个逻辑!为什么要返回NodeList呢?NodeList这个类显然是在Node层面上的,标记语言的Node不仅是元素,文本节点、属性节点,这些东西全是Node。而getElementsByTagName获取的东西当然是Element,在HTML中就是HTMLElement,这当然应该使用HTMLCollection来存放了!
  我感觉W3C是在忌讳“collection”这个词。这个词经常用来表示无序集合,而获取到的元素列表是有序的,所以应该是“list”。将来可能需要一个“ElementList”之类的东西来解决这个问题。
  其实我一直都不承认存在什么无序集合,除非是刻意去打乱顺序。就像ECMA262定义JavaScript的Object一样,在ED3中是“unordered collection”,到了ED5就不再强调“unordered”了。数据在内存中怎么储存的,它就是怎么存在的,何来无序?很不恰当的借用老爱的一句话“我不相信上帝是投色子的”!真正的无序是不可遍历的,比如向服务器发起一堆异步HTTP请求,我们无法知道哪个请求会先返回数据。
  貌似扯远了,言归正传吧。HTMLCollection比NodeList多了个namedItem方法,它可以通过元素的name或id属性来获取元素。因为HTMLCollection储存的是HTMLElement,而id和name是HTML元素的固有属性(Attribute)。而NodeList储存的东西未必是Element,当然也就不能提供这个方法了。
  无论是NodeList还是HTMLCollection,它们还有个live或static的性质。但是W3C的文档描述有点矛盾了,在W3C的NodeList定义中描述为 NodeList objects in the DOM are live.   但是翻到Selectors-API上则描述为 The NodeList object returned by the querySelectorAll() method must be static, not live.   只有WHATWG的DOM规范中才给了这样的描述,并规范了一些基本的实现机制。 A collection can be either live or static.   就目前而言,Firefox和IE使用的是WHATWG的逻辑,而Chrome使用的是W3C的逻辑。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^