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

Can I blindly replace all occurrences of document.all in my entire project with document.getElementsByTagName('*')?

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

将 document.all 的所有实例替换为 document.getElementsByTagName() 是否安全?请记住 document.all 可以有多种形式,例如 document.all.item("") 等。我需要知道 document.getElementsByTag('') 是否会作为盲目替换 document.all 的解决方案,无论它在哪里使用(以任何形式)

来自MDN page about #document

document.all
Provides access to all elements with an id. This is a legacy, non-standard, interface and you should use the document.getElementById() method instead.

因此,除了具有 id

个元素之外,document.getElementsByTagName("*") 不会 return 个元素

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

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

但是

MSDN has a different definition

The all collection includes one element object for each valid HTML tag. If a valid tag has a matching end tag, both tags are represented by the same element object.

在这种情况下,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 中所述,尽管我强烈建议不要使用此方法而不是其他方法比如getElementById

真的,您将不得不快速检查代码,以确保无论您选择哪种替代方案,它都能按预期工作。

Can I blindly replace all occurrences of document.all in my entire project with document.getElementsByTagName('*')?

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

  • 包含 id 的元素。
  • 还包括一些 name 的元素。
  • 包括 headbodytitle

所以在这个过程中必须要有智慧。您可能会将 document.all 的用法替换为:

  • document.getElementById,其中return是单个元素,匹配id的元素(如果文档无效且有多个匹配元素,浏览器通常return 他们中的第一个在文档顺序中)
  • document.querySelector,其中 return 是文档中任何有效 CSS 选择器
  • 的第一个匹配元素
  • document.querySelectorAll,其中 return 是文档中任何有效 CSS 选择器
  • 的匹配元素列表

(最后两个存在于所有现代浏览器中,IE8 也存在。)

示例:

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

document.getElementById("foo")

在文档中查找第一个带有class bar的元素:

document.querySelector(".bar")

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

document.querySelectorAll("a")

参考文献: