什么时候应该使用document.all
vs. document.getElementById
?
8 回答
document.all
是微软对 W3C 标准的专有扩展。
getElementById()
是标准的 - 使用它。
但是,请考虑使用像jQuery这样的 js 库是否会派上用场。例如,$("#id")
是 jQuery 等价于getElementById()
. 另外,您可以使用的不仅仅是 CSS3选择器。
document.all
很旧了,你不用再用了。
引用尼古拉斯·扎卡斯的话:
例如,在 DOM 还很年轻的时候,并不是所有的浏览器都支持 getElementById(),所以有很多代码看起来像这样:
if(document.getElementById){ //DOM
element = document.getElementById(id);
} else if (document.all) { //IE
element = document.all[id];
} else if (document.layers){ //Netscape < 6
element = document.layers[id];
}
实际上,document.all
只是最低限度的可比性document.getElementById
。你不会用一个代替另一个,他们不会返回相同的东西。
如果您试图通过浏览器功能进行过滤,您可以像Marcel Korpel 的回答那样使用它们:
if(document.getElementById){ //DOM
element = document.getElementById(id);
} else if (document.all) { //IE
element = document.all[id];
} else if (document.layers){ //Netscape < 6
element = document.layers[id];
}
但是,在功能上,document.getElementsByTagName('*')
更等同于document.all
.
例如,如果您实际上要使用document.all
来检查页面上的所有元素,如下所示:
var j = document.all.length;
for(var i = 0; i < j; i++){
alert("Page element["+i+"] has tagName:"+document.all(i).tagName);
}
你会document.getElementsByTagName('*')
改用:
var k = document.getElementsByTagName("*");
var j = k.length;
for (var i = 0; i < j; i++){
alert("Page element["+i+"] has tagName:"+k[i].tagName);
}
document.all()是一种访问 DOM 元素的非标准方式。它已被一些浏览器弃用。它使您可以访问文档中的所有子元素。
document.getElementById()是一个标准并且完全受支持。每个元素在文档上都有一个唯一的 id。
如果你有:
<div id="testing"></div>
使用
document.getElementById("testing");
将有权访问该特定的 div。
document.querySelectorAll
(及其document.querySelector()
返回第一个找到的元素的变体)要强大得多。您可以轻松:
- 获得一个完整的集合
document.querySelectorAll("*")
,有效地模拟非标准document.all
属性; - 使用
document.querySelector("#your-id")
,有效的仿真document.getElementById()
功能; - 使用
document.querySelectorAll(".your-class")
,有效的仿真document.getElementsByClassName()
功能; - 使用
document.querySelectorAll("form")
代替document.forms
,而document.querySelectorAll("a")
不是document.links
; - 并执行任何更复杂的 DOM 查询(使用任何可用的 CSS 选择器),这些查询无法被其他文档内置函数覆盖。
统一查询API是要走的路。即使document.all
符合标准,也很不方便。
根据Microsoft 存档的 Internet Explorer 开发中心,document.all
在 IE 11 和 Edge 中已弃用!
具体来说,document.all
是在 IE4 之前document.getElementById
介绍的。
因此,存在document.all
意味着代码旨在支持 IE4,或者试图将浏览器识别为 IE4(尽管它可能是 Opera),或者编写(或复制和粘贴)代码的人没有启动在最新的。
万一您需要支持 IE4,那么您确实需要document.all
(或处理这些古老 IE 规范的库)。
document.all
现在在 Chrome 中工作(不知道从什么时候开始),但在过去的 20 年里我一直在想念它......只是一个比笨重的方法名称更短的方法名称document.getElementById
。不确定它是否适用于 Firefox,那些家伙从来没有任何与现有网络兼容的愿望,总是创建新标准而不是拥抱现有网络。