从何而来
从IE4开始IE的object model才增加了document.all对象,MSDN中也对 Object.all 有详细的说明,Object.all是个HTMLCollection,不是数组,它包含document.all:
http://msdn.microsoft.com/en-us/library/ms537434%28VS.85%29.aspx
自他出现后,IE后续版本也对其做了很好的支持,并没有打算放弃这个很有意义的属性。曾有一段时间,这个属性连同document.Layers 还被用作Netscape浏览器和IE浏览器的类型判断杀手锏,可惜的是 document.Layers 已经作古,document.all 大有从嫔妃转为正宫之势(Xee:已经转正了!)。
if(document.all){ //do something in IE }else if(document.layers){ //do something in Netscape }
经典的浏览器类型判断…… 已经作古,切莫使用,后果自负……
------------------------------------------------------------------------
document.all是IE 4.0及以上版本的专有属性,是一个表示当前文档的所有对象的娄组,不仅包括页面上可见的实体对象,还包括一些不可见的对象,比如html注释等等。在document.all数组里面,元素不分层次,是按照其在文档中出现的先后顺序,平行地罗列的。所以可以用数字索引来引用到任何一个元素。但比较常用的是用对象id来引用一个特定的对象,比如document.all["element"]这样。
document.layers是Netscape 4.x专有的属性,是一个代表所有由储如<div><layer>等定位了的元素的数组。通常也是用<div>或<layer>对象的id属性来引用的,但是这里面不包含除此以外的其它元素。
其实这两个属性没什么可比性,大概你经常看到他们同时出时,这有一个历史原因。在第四代浏览器出现的时候,标准相当混乱,Netscape和微软分别推出了它们的Navigator 4.x和IE 4.0,这两个浏览器的巨大差异,也使开发者面临了一个使网页跨浏览器兼容的噩梦。而document.layer和document.all分别是两者一个最显著的标志,为了确定浏览者使用的什么浏览器,通常用是否存在document.layers和document.all来判断。
新的统一的标准用document.getElementById等系列方法来引用DOM对象,而且Netscape 6.0以后放弃了layers特征,虽然IE继续保留了document.all,但这最终没有成为DOM标准的一部分。希望document.layers和document.all能够早日作古,让标准早日深入人心!
-----------------------------------------------------------------------------
发展壮大
开始的时候,确实其他浏览器都不支持document.all,但是渐渐的,都开始偷偷摸摸的开始支持了。
因为它不是W3C的标准属性,在其他浏览器中也没有找到此集合属性的说明。说它偷偷摸摸的被支持是有原因的。
例1(这个可以让你理解文档中哪些是对象)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Document.All Example</title> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> </head> <body> <h1>Example Heading</h1> <hr /> <p>This is a <em>paragraph</em>. It is only a <em>paragraph.</em></p> <p>Yet another <em>paragraph.</em></p> <p>This final <em>paragraph</em> has <em id="special">special emphasis.</em></p> <hr /> <script type="text/javascript"> <!-- var i,origLength; origLength = document.all.length; document.write('document.all.length='+origLength+"<br />"); for (i = 0; i < origLength; i++) { document.write("document.all["+i+"]="+document.all[i].tagName+"<br />"); } //--> </script> </body> </html>
至于结果,自己去看看各个浏览器的差异,以前的浏览器(可能是lt IE8之前)会显示document.all.length=18(妈蛋,这样子:);现代浏览器统一显示document.all.length=17,自己看看区别吧…
--------------------------------------------------------------------------------------------------------------------
下面是关于document.all的其他用处…:
一.
document.all是页面内所有元素的一个集合。例如:
document.all(0)表示页面内第一个元素
二.
document.all可以判断浏览器是否是IE(其实还有其他方法不断可以判断IE,还可以判断是哪个版本的IE…自行百度吧…)
if(document.all){ alert('IS IE!'); } else{ alert('NOT IE!'); }关于这个问题,我进行了测试,在所有现在浏览器(除IE)下,显示为:
typeof(document.all)
"undefined"在IE(包括IE9~IE10,IE11没测试,根据微软的尿性,估计也一样)下:
typeof(document.all)
"object"所以..判断为IE
附录:
从IE11、Chrome开始,document.all将返回HTMLCollection子类HTMLAllCollection的对象,其行为特征和HTMLCollection一致。(Xee:IE11之前的版本document.all返回HTMLCollection的对象)但IE11中的HTMLAllCollection还可以当作函数使用。
三.
也可以通过给某个元素设置id属性(id=aaaa),然后用document.all.aaaa调用该元素。
标准DOM中的访问方法
开头就说过document.all[]不符合WEB标准(Xee:现在的浏览器基本都支持了),那用什么来替代它呢?document.getElementById
Most third-party browsers are “strict standards” implementations, meaning that they implement W3C and ECMA standards and ignore most of the proprietary object models of Internet Explorer and Netscape.If the demographic for your Web site includes users likely to use less common browsers, such as Linux aficionados, it might be a good idea to avoid IE-specific features and use the W3C DOM instead. by Internet Explorer 6, we see that IE implements significant portions of the W3C DOM.
这段话的意思是大多数第三方浏览器只支持W3C的DOM,如果你的网站用户使用其他的浏览器,那么你最好避免使用IE的私有属性。而且IE6也开始支持W3C DOM。
毕竟大多数人还不了解标准,在使用标准前,你还可以在你的网页中用document.all[]访问文档对象,
原生JS(标准的访问方法)有3种方式来获取元素:
getElementById('id') getElementsByName('name') getElementsByTagName('tag') getElementById是获取元素最快的方式。
因为不是w3c标准,所以我尽量避免使用document.all(Xee:现在已经可以完全使用了,IE所有浏览器支持!)