Skip to content

DOM 编程

很多时候,操作 DOM 是很直观的。通过 HTML 代码能实现的,也一样能通过 JavaScript 实现。但 有时候,DOM 也没有看起来那么简单。浏览器能力的参差不齐和各种问题,也会导致 DOM 的某些方 面会复杂一些。

文档对象模型(dom)是为 html 文档构建的编程接口。它表示允许程序和脚本动态更新文档结构、内容和样式的页面。有了 dom,我们可以轻松地访问和操作标签、id、类、属性等。

样式

className

"class" 这样的保留字不能用作对象的属性,elem.className 对应于 "class" 特性

html
<button class="btn btn-primary">button</button>

动态资源加载

动态脚本就是在页面初始加载时不存在,之后又通过 DOM 包含的脚本。

js
function loadScript(path) {
  const script = document.createElement('script')
  script.src = path
  document.body.appendChild(script)
}

在上面最后一行把<script> 元素添加到页面之前,是不会开始下载外部文件的。当然也可以把它添加到<head>元素,同样可以实 现动态脚本加载。

对于同一个资源只需加载一次,所以需要确保资源的全局唯一性

js
function loadScript(path) {
  const script = document.querySelector(`script[src="${src}"]`)

  if (script)
    return script
}

CSS 样式在 HTML 页面中可以通过两个元素加载。<link>元素用于包含 CSS 外部文件,而<style> 元素用于添加嵌入样式。

html
<link rel="stylesheet" type="text/css" href="styles.css" />

使用 DOM 编程

js
const link = document.createElement('link')
link.rel = 'stylesheet'
link.type = 'text/css'
link.href = 'styles.css'
const head = document.getElementsByTagName('head')[0]
head.appendChild(link)

应该把<link>元素添加到<head>元素而不是 <body>元素,这样才能保证所有浏览器都能正常运行。

js
function loadCss(href) {
  let css = document.querySelector(`link[href="${href}"]`)

  if (css)
    return css

  css = document.createElement('link')
  css.rel = 'stylesheet'
  css.type = 'text/css'
  css.href = href

  css.setAttribute('data-status', 'loading')

  const handler = (event) => {
    const cssStatus = event.type === 'load' ? 'ready' : 'error'
    css.setAttribute('data-status', cssStatus)
  }

  css.addEventListener('load', handler, false)
  css.addEventListener('error', handler, false)

  document.body.appendChild(css)

  return css
}