为什么 getElementsByTagName() 总是 returns 数组?
Why do getElementsByTagName() always returns an array?
为什么我的文档中只有一个h1
元素,还是要用索引来访问呢?
像下面这样是不行的。
document.getElementsByTagName('h1').innerHTML = "SHUSHAN";
但如果我这样做
document.getElementsByTagName('h1')[0].innerHTML = "SHUSHAN";
确实有效。
虽然我只有一个h1
,为什么一定要指定?
getElementsByTagName - 方法名称本身暗示它将 return 多个元素 - 即数组。该方法总是 returns 一个数组,长度等于匹配元素的数量。因此,您必须始终通过数组中元素的索引访问元素。
简短回答:这是为了让您保持理智。
如果您不知道您将获得单个元素还是元素集合,则必须编写这样的防御性 type-checking(愚蠢)代码
let foo = document.getElementsByTagName('h1')
if (foo instanceof HTMLCollection)
// do something with all elements
else
// do something with just one element
函数始终 return 一个已知类型,HTMLCollection
个 HTMLElement
个对象
更有意义
如果只关心获取第一个元素,可以使用解构赋值
let [first] = document.getElementsByTagName('h1')
console.log(first) // outputs just the first h1
这很好,因为赋值清楚地表明它需要一个元素数组(或 array-like),但只关心为第一个值分配标识符
您还应该了解更新的 document.querySelector
and document.querySelectorAll
函数……
document.querySelector
最多 select 一个 文档中的元素或 returnnull
document.querySelectorAll
将始终 return 和 HTMLCollection
,但如果没有元素与 select 或
匹配,则可能为空
这是我在 2017 年编写您的代码的方式
setTimeout($ => {
// get the element to change
let elem = document.querySelector('h1')
// update the text of the element
elem.textContent = 'SHUSHAN'
}, 3000)
<h1>wait 3 seconds ...</h1>
数组必须通过索引访问,无论它有多少个值。阅读一些关于数组数据类型的文章,以更好地理解这个概念。
重点是 getElementsByTagName
总是 returns 一个 HTMLCollection
元素,主要用作数组。如果这个集合中只有一个元素,那么它的索引就是0
。
这就是您必须指定索引的原因,即使文档中只有一个元素。
为什么我的文档中只有一个h1
元素,还是要用索引来访问呢?
像下面这样是不行的。
document.getElementsByTagName('h1').innerHTML = "SHUSHAN";
但如果我这样做
document.getElementsByTagName('h1')[0].innerHTML = "SHUSHAN";
确实有效。
虽然我只有一个h1
,为什么一定要指定?
getElementsByTagName - 方法名称本身暗示它将 return 多个元素 - 即数组。该方法总是 returns 一个数组,长度等于匹配元素的数量。因此,您必须始终通过数组中元素的索引访问元素。
简短回答:这是为了让您保持理智。
如果您不知道您将获得单个元素还是元素集合,则必须编写这样的防御性 type-checking(愚蠢)代码
let foo = document.getElementsByTagName('h1')
if (foo instanceof HTMLCollection)
// do something with all elements
else
// do something with just one element
函数始终 return 一个已知类型,HTMLCollection
个 HTMLElement
个对象
如果只关心获取第一个元素,可以使用解构赋值
let [first] = document.getElementsByTagName('h1')
console.log(first) // outputs just the first h1
这很好,因为赋值清楚地表明它需要一个元素数组(或 array-like),但只关心为第一个值分配标识符
您还应该了解更新的 document.querySelector
and document.querySelectorAll
函数……
document.querySelector
最多 select 一个 文档中的元素或 returnnull
匹配,则可能为空document.querySelectorAll
将始终 return 和HTMLCollection
,但如果没有元素与 select 或
这是我在 2017 年编写您的代码的方式
setTimeout($ => {
// get the element to change
let elem = document.querySelector('h1')
// update the text of the element
elem.textContent = 'SHUSHAN'
}, 3000)
<h1>wait 3 seconds ...</h1>
数组必须通过索引访问,无论它有多少个值。阅读一些关于数组数据类型的文章,以更好地理解这个概念。
重点是 getElementsByTagName
总是 returns 一个 HTMLCollection
元素,主要用作数组。如果这个集合中只有一个元素,那么它的索引就是0
。
这就是您必须指定索引的原因,即使文档中只有一个元素。