我可以使用document.getElementsByTagName(' *')在我的整个项目中盲目地替换所有出现的document.all吗?

时间:2015-08-19 13:50:42

标签: javascript getelementsbytagname

我正在处理大量遗留代码,并且拥有大量 document.all 用法的实例。我需要用Microsoft支持的东西替换所有这些实例(批量)(因为我理解document.all 不再支持)。

document.getElementsByTagName( 替换document.all的所有实例是否安全?请记住,document.all可以有很多种类,比如document.all.item("")等。我需要知道document.getElementsByTag(' & #39;)可以作为盲目替换document.all的解决方案,无论在何处使用(无论采用何种形式)

2 个答案:

答案 0 :(得分:4)

来自MDN page about #document

  

document.all
  提供对ID为的所有元素的访问权限。这是一个传统的非标准接口,您应该使用document.getElementById()方法。

因此,没有document.getElementsByTagName("*")会返回更多元素,而不仅仅是带元素

这个定义意味着你可以做到

document.querySelectorAll('[id]'); // NodeList

然而

MSDN has a different definition

  

所有集合为每个有效HTML标记包含一个元素对象。如果有效标记具有匹配的结束标记,则两个标记都由相同的元素对象表示。

在这种情况下,document.getElementsByTagName("*")确实给出了类似的结果( HTMLCollection

然而,再次

NodeList 将无法重现document.all.id_valuedocument.all[id_value]document.all(foo)的预期结果。

HTMLCollection 支持document.all.id_valuedocument.all[id_value],如w3's DOM spec中所述,但我强烈建议不要使用其他方法,例如{{1} }}

实际上,您需要快速完成代码,以确保无论您选择哪种方式,它都能按预期工作。

答案 1 :(得分:0)

  

我可以使用document.getElementsByTagName('*')在我的整个项目中盲目地替换所有出现的document.all吗?

没有。 document.all不是按标记名称的元素集合,它是由于各种原因而包含在其中的各种类型的元素的集合。其中一些原因是:

  • 包含id的元素。
  • 还包含name的部分元素。
  • 包含headbodytitle

因此,在此过程中必须有智慧。您可能会将document.all的用法替换为:

  • document.getElementById,返回单个元素,匹配id的元素(如果文档无效且有多个匹配元素,则浏览器通常按文档顺序返回第一个元素)
  • document.querySelector,它返回文档中第一个匹配元素,用于任何有效的CSS选择器
  • document.querySelectorAll,它返回文档中匹配元素的列表,用于任何有效的CSS选择器

(最后两个出现在所有现代浏览器中,还有IE8。)

示例:

找到<div id="foo">..</div>元素:

document.getElementById("foo")

在文档中找到包含类bar的第一个元素:

document.querySelector(".bar")

查找文档中的所有a元素:

document.querySelectorAll("a")

参考文献: