👨‍💻
Hong's 前端笔记
  • 🌈About
  • JavaScript
    • 作用域
    • 闭包
    • this
      • bind()
    • 原型
      • Object.create()
      • 模拟“类”
      • ES6 Class
      • Function
    • 对象
    • 类型 & 值
      • 原生函数
      • 数组
      • 字符串
    • 异步
    • JavaScript 相关概念
      • Event Loop 事件循环
      • Prototype 原型
      • Context 执行上下文
      • this
      • Promise
    • JavaScript 常见问题
      • 手写实现
      • 看代码输出
  • React
    • 核心概念
    • 深入理解
      • State
      • 如何管理 State
      • React 渲染过程
      • 处理 DOM 事件
      • Pure 组件
      • Context
      • Key 属性
      • React.lazy()
      • Render Props
    • Hooks
      • useState
      • useRef
      • useEffect
        • Some details
      • 相关概念
      • 自定义 Hook
      • useEffect vs useLayoutEffect
    • React 相关问题
      • Class vs Function
  • React Libraries
    • Redux
      • Quick Start
      • 如何持久化 Redux 数据
      • 异步操作
      • 性能优化
      • Dive into immutability
    • Route v6
      • Quick Start
  • Reactivity
    • Immer
  • Vue
    • 深入理解
      • Composition vs Options
      • Reactivity
  • Network
    • Cookies
    • HTTP
    • HTTPS
    • CORS 跨域资源共享
    • 认证手段
    • 安全相关
    • 网络相关知识
  • Browser
    • DOM 操作
    • Events 事件
    • XHR & Fetch
    • 性能优化
    • HTML 相关概念
    • 浏览器相关概念
  • CSS
    • 盒模型
    • Layout 布局
    • Styles 样式
    • CSS 相关概念
    • CSS 相关技巧
      • 移动端适配
      • Flex
      • 动画
  • TypeScript
    • Quick Peek
    • Types in TypeScript
    • Narrowing
    • Functions in TypeScript
  • Workflow
    • Webpack
      • Webpack 概念
      • 资源管理
      • 管理输出
      • 开发环境配置
      • 生产环境配置
      • 优化代码运行性能
  • Others
    • 小程序与原生 Web 的区别
  • SSO
    • About
    • API Doc
    • 接入指南
Powered by GitBook
On this page
  • 节点类型
  • 节点关系
  • Document Node
  • Element Node
  • Text Node
  • 常用 DOM 操作
  • DOM 扩展
Edit on GitHub
  1. Browser

DOM 操作

节点类型

常用的 DOM 节点类型包括:

  • Document

  • Element

  • Text

  • DocumentType

  • Attr

判断某一节点类型

document.nodeType === Node.DOCUMENT_NODE	// true

Node 常见属性

  • nodeName

  • nodeValue

Element Node 的 nodeName 是标签名,而 nodeValue 为 null

节点关系

  • childNodes

  • parentNode

  • previousSibling, nextSibling

    • 第一个元素的 previousSibling、最后一个的 nextSibling 都指向 null

  • firstChild, lastChild

childNodes

childNodes() 方法返回一个 NodeList 实例,注意这是一个类数组对象,可以用索引访问,也有 length 属性。

但是 NodeList 实例并不是 Array 实例,他们只是在使用上比较类似。

Document Node

document 常见属性

  • doucumentElement: 的引用

  • body: 的引用

  • title:文档标题

  • URL(只读)

  • referrer(只读)

  • domain

    只有 domain 是可以修改的,可以将域名设置成上级域名,但不能设置子域名,另外不能设置不同的域名

    // 页面来自 me.hong97.ltd
    document.domain = 'hong97.ltd'	// ok
    document.domain = 'baidu.com'	// not ok

Element Node

element node 是 HTML 中最常用的 Node。

可以通过 nodeName 或者 tagName 来获取标签名。

操作属性

三种操作属性的方法:

  • getAttribute()

  • setAttribute()

  • removeAttribute()

  1. 除了使用 getAttribute() 来获取属性外,Element Node 对象还暴露了许多属性提供直接访问。如:id, style, onClick...

    getAttribute() 返回的是字符串,而直接访问某些属性可以返回对象

    如 .onClick 返回的是函数,而使用 getAttribute('onClick') 返回的是字符串

    因此,getAttribute() 常用来获取自定义属性

  2. element node 有一个 attributes 属性,他是一个 NamedNodeMap 实例,类似于 NodeList 实例,可以通过索引或者 key 访问

    const ul = document.getElementById('list')
    ul.attributes['id'] = 'list'

    一般来说,使用上面三种 API 操作属性更加常见一些

Text Node

<h1 id="title"></h1>
<script>
    const text = document.createTextNode('Hello World')
	document.getElementById('title').appendChild(text)
</script>

常用 DOM 操作

获取元素

  • getElementByID()

  • getElementsByTagName()

  • getElementsByClassName()

类似于 getElementsByTagName() 这样的 API,他返回的不是“数组”,而是一个 HTML Collection,类似于 NodeList ,是一个类数组行为的对象。

创建元素

document.createElement()

const div = document.createElement('div')	// 传入表情名

操作元素

  • appandChild(),在某个元素的 childNodes 末尾附上一个元素

    // 在 ul 标签内追加一个 li 标签
    document.getElementsByTagName('ul')[0].appendChild(li)
  • insertBefore()

    const insertedNode = parentNode.insertBefore(newNode, referenceNode);

    如果参考节点为 null,则效果和 appendChild() 相同

    另外,使用appendChild(), insertBefore() 时,如果插入的结点已经存在,那么会将结点移动至新的位置。

  • replaceChild()

    parentNode.replaceChild(newChild, oldChild);

    如果 newChild 存在,那么它会从原始位置中删除

  • cloneNode()

    dupNode = node.cloneNode(deep)

    传入的 deep 参数,如果为 true,表示深克隆(递归克隆)

  • removeChild()

    const oldChild = parentNode.removeChild(childNode);

DOM 扩展

querySelector()

返回匹配到的第一个元素,没有匹配返回 null

quesrySelectorAll()

返回所有匹配到的节点(NodeList 实例),没有匹配返回一个空实例。

classList

classList 属性是一个 DomTokenList 实例,它有下面四种方法:

  • add(value)

  • remove(value)

  • toogle(value)

  • contains(value)

innerHTML

读取 innerHTML 会以字符串形式返回所有后代元素;而写入时,会将字符串解析成 DOM 子树

现代浏览器都不会解析 innerHTML 中的 标签

outerHTML

返回包括调用它的元素及其后代元素

<ul>
    <li>1</li>
<li>2</li>
<li>3</li>
</ul>

<script>
    // <ul>
    //     <li>1</li>
    //     <li>2</li>
    //     <li>3</li>
    // </ul>
    console.log(document.querySelector('ul').outerHTML)
</script>

innerText

读取时,以深度优先的顺序递归地将所有子元素的 Text Nodes 拼接成一个字符串并返回。

写入时,移除所有后代节点,并且将部分标签(如**)进行 HTML 编码,是他完全成为一个 Text Node**

Last updated 3 years ago