美文网首页程序员web之路让前端飞
【十七】浏览器DOM:你知道HTML的节点有哪几种吗?

【十七】浏览器DOM:你知道HTML的节点有哪几种吗?

作者: alanwhy | 来源:发表于2019-03-25 22:55 被阅读10次

文档对象模型

用来描述文档,特指HTML文档,同时又是一个“对象模型”,意味着它使用的是对象这样的概念来描述HTML文档。

DOM API大致包含4个部分

  • 节点:DOM 树形结构中的节点相关API
  • 事件:触发和监听事件相关API
  • Range:操作文字范围相关API
  • 遍历:遍历DOM 需要的API

节点

节点.png
Element: <tagname>...</tagname>
Text: text
Comment: <!-- comments -->
DocumentType: <!Doctype html>
ProcessingInstruction: <?a 1?>

我们编写HTML代码运行后,就会在内存中得到这样一颗DOM树,HTML的写法会被转化成对应的文档模型,而我们则可以通过JS等语言来访问这个文档模型

Node

Node是DOM树继承关系的根节点,提供了一组属性,来表示在DOM树中的关系

  • parentNode
  • childNodes
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

也提供了操作DOM树的API

  • appendChild
  • insertBefore
  • removeChild
  • replaceChild

除此之外,Node还提供了一些高级的API

  • compareDocumentPosition 用于比较两个节点中关系的函数
  • contains 检查一个节点是否包含另一个节点
  • isEqualNode 检查两个节点是否完全相同
  • isSameNode 检查两个节点是否是同一个节点
  • cloneNode 复制一个节点

DOM标准规定了节点必须从文档create方法创建出来。于是document有了这些方法

  • createElement
  • createTextNode
  • createCDATASection
  • createComment
  • createProcessingInstruction
  • createDocumentFragment
  • createDocumentType

Element和Attribute

Node提供了树形结构上节点相关的操作。
Element表示元素,是Node的子类,既有子节点,又有属性

对于DOM而言,Attribute和 Property是完全不同的定义

把元素的Attrbute当作字符串来看,则有:

  • getAttribute
  • setAttribute
  • removeAttribute
  • hasAttribute
  • getAttributeNode
  • setAttributeNode

查找元素

document节点提供了查找元素的能力

  • querySelector(性能较低)
  • querySelectorAll
  • getElementById
  • getElementByName
  • getElementByTagName
  • getElementsByClassName

遍历

DOM还提供了NodeIterator和TreeWalker来遍历树,同时具有过滤功能

NodeIterator的基本用法

var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT, null, false);
var node;
while(node = iterator.nextNode())
{
    console.log(node);
}

以及TreeWalker的用法

var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, null, false)
var node;
while(node = walker.nextNode())
{
    if(node.tagName === "p")
        node.nextSibling();
    console.log(node);
}

Range

Range较为专业化,主要是富文本编辑类业务

var range = new Range(),
    firstText = p.childNodes[1],
    secondText = em.firstChild
range.setStart(firstText, 9) // do not forget the leading space
range.setEnd(secondText, 4)

var fragment = range.extractContents()
range.insertNode(document.createTextNode("aaaa"))

补充算法

// 深度优先
function deepLogTagNames(parentNode){
  console.log(parentNode.tagName)
  const childNodes = parentNode.childNodes
  // 过滤没有 tagName 的节点,遍历输出
  Array.prototype.filter.call(childNodes, item=>item.tagName)
  .forEach(itemNode=>{
    deepLogTagNames(itemNode)
  })
}
deepLogTagNames(document.body)

// 广度优先
function breadLogTagNames(root){
  const queue = [root]
  while(queue.length) {
    const currentNode = queue.shift()
    const {childNodes, tagName} = currentNode
    tagName && console.log(currentNode.tagName)
    // 过滤没有 tagName 的节点
    Array.prototype.filter.call(childNodes, item=>item.tagName)
    .forEach(itemNode=>{
      queue.push(itemNode)
    }) 
  }
}
breadLogTagNames(document.body)

参考原文: 浏览器DOM:你知道HTML的节点有哪几种吗?

相关文章

  • 【十七】浏览器DOM:你知道HTML的节点有哪几种吗?

    文档对象模型 用来描述文档,特指HTML文档,同时又是一个“对象模型”,意味着它使用的是对象这样的概念来描述HTM...

  • HTML DOM

    HTML DOM 一、HTML DOM 节点 1.HTML DOM 节点 根据 W3C 的 HTML DOM 标准...

  • 回味JS(八)关于DOM

    DOM的节点类型有哪几种? Document DocumentType,即doctype标签(比如

  • 什么是dom树

    介绍DOM,以及对DOM分类和功能的说明。 DOM 节点:介绍DOM节点分类和节点层次。 介绍HTML DOM节点...

  • repaint&reflow

    HTML页面呈现流程 浏览器将获取到的HTML代码解析成DOM树,其中的每个Tag标签都是一个节点。DOM树中包含...

  • js笔记十六之DOM基础-节点

    DOM的节点 node: 节点,浏览器认为在一个html页面中的所有内容都是节点(包括标签,注释,文字文本等)元素...

  • DOM

    节点 在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML。 根据 W3C 的 HTML...

  • 基于webkit渲染引擎的浏览器渲染机制

    如图: 浏览器会将HTML解析成一个DOM树,DOM 树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好...

  • HTML DOM Document对象

    HTMLDOMDocument对象 HTML DOM 节点 在 HTML DOM (Document Object...

  • DOM(文档对象)、BOM(浏览器对象)

    DOM 获取DOM节点 DOM节点的property,修改对象属性,不会提现到html结构 DOM节点的attri...

网友评论

    本文标题:【十七】浏览器DOM:你知道HTML的节点有哪几种吗?

    本文链接:https://www.haomeiwen.com/subject/zldimqtx.html