Skip to content

文档对象模型(DOM)

文档对象模型(DOM)1

HTML 文档被结构化为 JavaScript 对象。每个 HTML 元素都有不同的属性,可以帮助操作它。可以使用 JavaScript 获取、创建、追加或删除 HTML 元素。查看下面的示例。使用 JavaScript 选择 HTML 元素类似于使用 CSS 选择。要选择 HTML 元素,我们使用标签名、id、类名或其他属性。

获取元素

我们可以使用 JavaScript 访问已创建的元素。要访问或获取元素,我们使用不同的方法。下面的代码有四个 h1 元素。让我们看看访问 h1 元素的不同方法。

html
<!DOCTYPE html>
  <html lang="en">
    <head>
      <title>Document Object Model</title>
    </head>
    <body>

     <h1 class='title' id='first-title'>First Title</h1>
     <h1 class='title' id='second-title'>Second Title</h1>
     <h1 class='title' id='third-title'>Third Title</h1>
     <h1></h1>

    </body>
  </html>

通过标签名获取元素

getElementsByTagName():接受标签名作为字符串参数,此方法返回一个 HTMLCollection 对象。HTMLCollection 是 HTML 元素的类数组对象。length 属性提供集合的大小。每当我们使用此方法时,我们使用索引访问单个元素或循环遍历每个单独的项目。HTMLCollection 不支持所有数组方法,因此我们应该使用常规 for 循环而不是 forEach。

js
// 语法
document.getElementsByTagName('tagname')
js
const allTitles = document.getElementsByTagName('h1')

console.log(allTitles) //HTMLCollections
console.log(allTitles.length) // 4

for (let i = 0; i < allTitles.length; i++) {
  console.log(allTitles[i]) // 打印 HTMLCollection 中的每个元素
}

通过类名获取元素

getElementsByClassName() 方法返回一个 HTMLCollection 对象。HTMLCollection 是 HTML 元素的类数组列表。length 属性提供集合的大小。可以循环遍历所有 HTMLCollection 元素。请参见下面的示例

js
//语法
document.getElementsByClassName('classname')
js
const allTitles = document.getElementsByClassName('title')

console.log(allTitles) //HTMLCollections
console.log(allTitles.length) // 4

for (let i = 0; i < allTitles.length; i++) {
  console.log(allTitles[i]) // 打印 HTMLCollection 中的每个元素
}

通过 id 获取元素

getElementsById() 针对单个 HTML 元素。我们传递不带 # 的 id 作为参数。

js
//语法
document.getElementById('id')
js
let firstTitle = document.getElementById('first-title')
console.log(firstTitle) // <h1>First Title</h1>

使用 querySelector 方法获取元素

document.querySelector 方法可以通过标签名、id 或类名选择 HTML 或 HTML 元素。

querySelector:可用于通过标签名、id 或类选择 HTML 元素。如果使用标签名,它只选择第一个元素。

js
let firstTitle = document.querySelector('h1') // 选择第一个可用的 h1 元素
let firstTitle = document.querySelector('#first-title') // 选择 id 为 first-title 的元素
let firstTitle = document.querySelector('.title') // 选择第一个可用的类为 title 的元素

querySelectorAll:可用于通过标签名或类选择 html 元素。它返回一个 nodeList,这是一个支持数组方法的类数组对象。我们可以使用 for 循环forEach 来循环遍历每个 nodeList 元素。

js
const allTitles = document.querySelectorAll('h1') // 选择页面中所有可用的 h1 元素

console.log(allTitles.length) // 4
for (let i = 0; i < allTitles.length; i++) {
  console.log(allTitles[i])
}

allTitles.forEach(title => console.log(title))
const allTitles = document.querySelectorAll('.title') // 使用类选择也是如此

添加属性

属性在 HTML 的开始标签中添加,为元素提供附加信息。常见的 HTML 属性:id、class、src、style、href、disabled、title、alt。让我们为第四个标题添加 id 和 class。

js
const titles = document.querySelectorAll('h1')
titles[3].className = 'title'
titles[3].id = 'fourth-title'

使用 setAttribute 添加属性

setAttribute() 方法设置任何 html 属性。它接受两个参数:属性的类型和属性的名称。 让我们为第四个标题添加 class 和 id 属性。

js
const titles = document.querySelectorAll('h1')
titles[3].setAttribute('class', 'title')
titles[3].setAttribute('id', 'fourth-title')

不使用 setAttribute 添加属性

我们可以使用普通的对象设置方法来设置属性,但这不能适用于所有元素。某些属性是 DOM 对象属性,可以直接设置。例如 id 和 class

js
//设置属性的另一种方法
titles[3].className = 'title'
titles[3].id = 'fourth-title'

使用 classList 添加类

类列表方法是追加附加类的好方法。如果类存在,它不会覆盖原始类,而是为元素添加附加类。

js
//设置属性的另一种方法:追加类,不覆盖
titles[3].classList.add('title', 'header-title')

使用 remove 删除类

与添加类似,我们也可以从元素中删除类。我们可以从元素中删除特定的类。

js
//设置属性的另一种方法:追加类,不覆盖
titles[3].classList.remove('title', 'header-title')

向 HTML 元素添加文本

HTML 是开始标签、结束标签和文本内容的构建块。我们可以使用属性 textContentinnerHTML 添加文本内容。

使用 textContent 添加文本内容

textContent 属性用于向 HTML 元素添加文本。

js
const titles = document.querySelectorAll('h1')
titles[3].textContent = 'Fourth Title'

使用 innerHTML 添加文本内容

大多数人对 textContentinnerHTML 感到困惑。textContent 用于向 HTML 元素添加文本,但是 innerHTML 可以添加文本或 HTML 元素作为子元素。

文本内容

我们将 textContent HTML 对象属性分配给文本

js
const titles = document.querySelectorAll('h1')
titles[3].textContent = 'Fourth Title'
内部 HTML

当我们想要替换或为父元素添加全新的子内容时,我们使用 innerHTML 属性。 我们分配的值将是 HTML 元素的字符串。

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>JavaScript for Everyone:DOM</title>
  </head>
  <body>
    <div class="wrapper">
        <h1>Asabeneh Yetayeh challenges in 2020</h1>
        <h2>30DaysOfJavaScript Challenge</h2>
        <ul></ul>
    </div>
    <script>
    const lists = `
    <li>30DaysOfPython Challenge Done</li>
            <li>30DaysOfJavaScript Challenge Ongoing</li>
            <li>30DaysOfReact Challenge Coming</li>
            <li>30DaysOfFullStack Challenge Coming</li>
            <li>30DaysOfDataAnalysis Challenge Coming</li>
            <li>30DaysOfReactNative Challenge Coming</li>
            <li>30DaysOfMachineLearning Challenge Coming</li>`
  const ul = document.querySelector('ul')
  ul.innerHTML = lists
    </script>
  </body>
</html>

innerHTML 属性还允许我们删除父元素的所有子元素。我建议使用以下方法而不是使用 removeChild()。

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>JavaScript for Everyone:DOM</title>
  </head>
  <body>
    <div class="wrapper">
        <h1>Asabeneh Yetayeh challenges in 2020</h1>
        <h2>30DaysOfJavaScript Challenge</h2>
        <ul>
            <li>30DaysOfPython Challenge Done</li>
            <li>30DaysOfJavaScript Challenge Ongoing</li>
            <li>30DaysOfReact Challenge Coming</li>
            <li>30DaysOfFullStack Challenge Coming</li>
            <li>30DaysOfDataAnalysis Challenge Coming</li>
            <li>30DaysOfReactNative Challenge Coming</li>
            <li>30DaysOfMachineLearning Challenge Coming</li>
        </ul>
    </div>
    <script>
  const ul = document.querySelector('ul')
  ul.innerHTML = ''
    </script>
  </body>
</html>

添加样式

添加样式颜色

让我们为标题添加一些样式。如果元素有偶数索引,我们给它绿色,否则红色。

js
const titles = document.querySelectorAll('h1')
titles.forEach((title, i) => {
  title.style.fontSize = '24px' // 所有标题都将有 24px 字体大小
  if (i % 2 === 0) {
    title.style.color = 'green'
  } else {
    title.style.color = 'red'
  }
})

添加样式背景颜色

让我们为标题添加一些样式。如果元素有偶数索引,我们给它绿色,否则红色。

js
const titles = document.querySelectorAll('h1')
titles.forEach((title, i) => {
  title.style.fontSize = '24px' // 所有标题都将有 24px 字体大小
  if (i % 2 === 0) {
    title.style.backgroundColor = 'green'
  } else {
    title.style.backgroundColor = 'red'
  }
})

添加样式字体大小

让我们为标题添加一些样式。如果元素有偶数索引,我们给它 20px,否则 30px

js
const titles = document.querySelectorAll('h1')
titles.forEach((title, i) => {
  title.style.fontSize = '24px' // 所有标题都将有 24px 字体大小
  if (i % 2 === 0) {
    title.style.fontSize = '20px'
  } else {
    title.style.fontSize = '30px'
  }
})

如你所注意到的,当我们在 JavaScript 中使用 CSS 属性时,它们将是驼峰命名法。以下 CSS 属性从 background-color 变为 backgroundColor,font-size 变为 fontSize,font-family 变为 fontFamily,margin-bottom 变为 marginBottom。


🌕 现在,你充满了超能力,你已经完成了挑战中最重要和最具挑战性的部分,一般来说是 JavaScript。你学会了 DOM,现在你有能力构建和开发应用程序。现在为你的大脑和肌肉做一些练习。

练习

练习:第1级

  1. 创建一个 index.html 文件并放置四个 p 元素如上:使用 document.querySelector(tagname) 和标签名获取第一个段落
  2. 使用 document.querySelector('#id') 和它们的 id 获取每个段落
  3. 使用 document.querySelectorAll(tagname) 和它们的标签名将所有 p 作为 nodeList 获取
  4. 循环遍历 nodeList 并获取每个段落的文本内容
  5. 为第四个段落设置文本内容,Fourth Paragraph
  6. 使用不同的属性设置方法为所有段落设置 id 和 class 属性

练习:第2级

  1. 使用 JavaScript 更改每个段落的样式(例如颜色、背景、边框、字体大小、字体系列)
  2. 选择所有段落并循环遍历每个元素,给第一个和第三个段落绿色,给第二个和第四个段落红色
  3. 为每个段落设置文本内容、id 和 class

练习:第3级

DOM:迷你项目1

  1. 开发以下应用程序,使用以下 HTML 元素开始。你将在启动文件夹中获得相同的代码。仅使用 JavaScript 应用所有样式和功能。

    • 年份颜色每1秒变化一次
    • 日期和时间背景颜色每秒变化一次
    • 已完成的挑战有绿色背景
    • 正在进行的挑战有黄色背景
    • 即将到来的挑战有红色背景
html
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>JavaScript for Everyone:DOM</title>
  </head>
  <body>
    <div class="wrapper">
        <h1>Asabeneh Yetayeh challenges in 2020</h1>
        <h2>30DaysOfJavaScript Challenge</h2>
        <ul>
            <li>30DaysOfPython Challenge Done</li>
            <li>30DaysOfJavaScript Challenge Ongoing</li>
            <li>30DaysOfReact Challenge Coming</li>
            <li>30DaysOfFullStack Challenge Coming</li>
            <li>30DaysOfDataAnalysis Challenge Coming</li>
            <li>30DaysOfReactNative Challenge Coming</li>
            <li>30DaysOfMachineLearning Challenge Coming</li>
        </ul>
    </div>
  </body>
</html>

🎉 恭喜!🎉