最直白的DOM探讨(未完待续)

610 阅读4分钟

DOM

首先我们要理解dom:

  • dom就是文档对象模型,是html和xml文档的编程接口,表示多层节点构成的文档,
  • 通过dom它开发者可以添加,删除,修改页面的各个部分,简单说:就是你的页面想要实现增删改查,以及各种交互效果,都需要通过dom来操作,
  • dom就是你操作页面的中介,可以把你的想法精准的传达给页面文档,让他们按照你的想法来实现动作,那么如何精准传达呢,dom是一个由节点构成的层级结构,每个标记都是一个节点,所以可以通过节点,精准的控制想要实现功能的区域

节点层级

  • 上面说了,节点是精准操作页面的东西,那么节点也分为很多类型,分别拥有自己不同的标记,特性和方法,

  • document节点:代表每个文档的根节点,他有唯一的子节点元素,我们称为documentElement,这是最外层的文档元素,其他所有元素都存在这个元素之内,每个文档只能有一个文档元素,xml任何元素都可能称为文档元素

  • DOM中总共有12种节点类型,这些类型都继承一种基本类型

    node 类型

    • JS中所有节点类型都继承自node类型,每个节点都有一个nodeType属性,表示节点类型
  • 我们可以通过常量和节点做比较,如果相等,说明是同一类型节点

if (someNode.nodeType == Node.ELEMENT_NODE){ 
alert("Node is an element."); 
}

小结:这个例子把常量和node的element节点做对比,如果相等,说明常量是元素节点

  • 文档中的节点都与其他节点有关系,这些关系类似家族关系,html>body>页面属性标签,每个节点都有一个childNodes属性和一个NodeList的实例,

    • NodeList是一个类数组对象,他有长度,用于储存可以按照位子存取的有序节点,就是说,一个元素内的子节点,都在这个里面排列,按照顺序可以取到相应的节点,

      例子1:用中括号和对象的方法访问NodeList中的元素

let firstChild = someNode.childNodes[0];//第一个子元素
let secondChild = someNode.childNodes.item(1);//第二个子元素
let count = someNode.childNodes.length;
  • parentNode属性指向Dom树中的父元素,

  • childNodes:firstChild 和 lastChild 分别指向 childNodes 中的第一个和最后一个子节点。 someNode.firstChild 的值始终等于 someNode.childNodes[0]

  • hasChildNodes(),如果返回true。说明节点有一个或者多个子节点

操作节点

  • 因为所有关系指针都是只读的,所以DOM又提供了一些操纵节点的方法。

  • appendChild():用于在 childNodes 列表末尾添加节点。

  • insertBefore() 方法。 这个方法接收两个参数:要插入的节点和参照节点

//添加节点
let returnedNode = someNode.appendChild(newNode);
alert(returnedNode == newNode); // true 
alert(someNode.lastChild == newNode); // true
 // 作为新的第一个子节点插入
returnedNode = someNode.insertBefore(newNode, someNode.firstChild);
alert(returnedNode == newNode); // true 
alert(newNode == someNode.firstChild); // true
  • replaceChild() 方法接收两个参数:要插入的节点和要替换的节点。
  • 是 cloneNode() ,会返回与调用它的节点一模一样的节 点。 cloneNode() 方法接收一个布尔值参数,表示是否深复制。在传入 true 参数时,会进行深复制,即复制节点及其整个子DOM树

Document 类型

  • Document是js中文档节点类型:

    • nodeType 等于9;
    • nodeName值为#document
    • 子节点可以是DocumentType(最多一个),Element(最多一个)
  • documentElement 属性,始终指向HTML页面中的 html元素

  • document 对象还有一个 body 属性,直接指向 body元素。

let body = document.body; // 取得对<body>的引用

小结:一般来说, appendChild() 、 removeChild() 和 replaceChild() 方法不会用在 document 对象上。这是因为文档类型(如果存在)是只读的,而且只能有一个 Element 类型的 子节点

文档信息

  • 读取文档标题,和获取文档完整的URL
// 读取文档标题
let originalTitle = document.title; 
// 修改文档标题
document.title = "New page title";
// 取得完整的URL 
let url = document.URL; 
// 取得域名
let domain = document.domain; 
// 取得来源
let referrer = document.referrer;

定位元素,也就是选择元素

  • getElementById()
<div id="myDiv">Some text</div>
let div = document.getElementById("myDiv"); // 取得对这个<div>元素的引用
  • getElementsByTagName() 是另一个常用来获取元素引用的方法。这个方法接收一个参数,即要

获取元素的标签名,返回包含零个或多个元素的 NodeList

alert(images.length); // 图片数量
alert(images[0].src); // 第一张图片的src属性
alert(images.item(0).src); // 同上

Element类型

  • getAttribute():这个方法接收两个参数:要设置的属性 名和属性的值。如果属性已经存在,则 setAttribute() 会以指定的值替换原来的值;如果属性 不存在,则 setAttribute() 会以指定的值创建该属性
  • setAttribute(): 方法添加指定的属性,并为其赋指定的值。 比如给input设置一个type值
  • removeAttribute() :可以删除指定的属性
  • createElement():创建新元素。这个方法接收一个参数,即要创建元素的标签名

本文使用 mdnice 排版