欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript学习笔记-第九章 DOM操作

程序员文章站 2022-06-15 13:38:28
...

JavaScript学习笔记

第九章 DOM操作

1、DOM

Document Object Model,文档对象模型,是W3C组织推荐的处理可拓展性语言的标准编程接口。在网页上,组织页面(文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型称为DOM,如标签、文本、属性等。

2、节点

2-1、节点介绍

在加载HTML页面时,web浏览器生成一个树型结构,用来表示页面内部结构,称为DOM树,DOM将这种树型结构解释为由节点组成。

  • 整个文档时一个文档节点

    DOM中的根节点,是文档内其他节点的访问入口,提供了操作其他节点的方法。

  • 每个HTML元素是元素节点

  • HTML元素内的文本是文本节点

  • 每个HTML属性是属性节点

  • 注释是注释节点

JavaScript学习笔记-第九章 DOM操作

2-2、节点基本属性

  • nodeType

    表示节点的类型,只读,节点类型由在Node类型中定义的数值常量来表示,比较重要的节点类型如下:

    • 元素–1
    • 属性–2
    • 文本–3
    • 注释–8
    • 文档–9
  • nodeName

    节点的名称,只读。

    • 元素节点的nodeName与标签名相同,且都均为大写。
    • 属性节点的nodeName与属性名相同。
    • 文本节点的nodeName始终是#text。
    • 文档节点的nodeName始终是#document。
  • nodeValue

    该属性规定节点的值。

    • 元素节点的nodeValue是undefined或null。

    • 文本节点的nodeValue是文本本身。

    • 属性节点的nodeValue是属性值。

      • 获取属性节点:DOM元素.getAttribute(“属性名称”),该方式可以获取自定义属性,可以直接用class获取而不是className。

      • 设置属性节点:DOM元素.setAttribute(“属性名称”,“属性值”),就是直接修改标签属性。

      • 移除属性节点:DOM.removeAttribute(‘属性名称’),直接删除标签属性。

3、获取节点

3-1、获取子节点

  • 父节点.children

    只返回子元素(标签)节点集合,该属性为非标准属性。

    IE8及以下浏览器支持该属性,但返回节点集合中除了元素节点还包含注释节点。

  • 父节点.childNodes

    返回子节点集合,包括标签、文本、属性节点。

    对于元素间的空格,IE8及以下版本不会返回文本节点。

3-2、获取父节点

  • 元素.parentNode

    指向文档树中的父节点,只获取一个直接父元素。

  • 元素.offsetParent

    指向离当前元素最近的有定位属性的父级元素,如果没有定位的父级,则指向body。

3-3、其他节点

  • 获取父元素的首节点
    • 父元素.firstChild

      可以获取所有类型节点,且只能拿一个。

      IE9及以上和标准浏览器会获取到文本、折行,IE8及以下获取到元素节点。

    • 父元素.firstElementChild

      只获取元素节点,IE8及以下不支持。

  • 获取父元素的尾节点
    • 父元素.lastChild

      可以获取所有类型节点,且只能拿一个。

      IE9及以上和标准浏览器会获取到文本、折行,IE8及以下获取到元素节点。

    • 父元素.lastElementChild

      只获取元素节点,IE8及以下不支持。

  • 获取元素的下一个兄弟节点
    • 元素.nextSibling

      可以获取所有类型节点,且只能拿一个。

      IE9及以上和标准浏览器会获取到文本、折行,IE8及以下获取到元素节点。

    • 元素.nextElementSibling

      只能获取元素节点,IE8及以下不支持。

  • 获取元素的上一个兄弟节点
    • 元素.previousSibling

      可以获取所有类型节点,且只能拿一个。

      IE9及以上和标准浏览器会获取到文本、折行,IE8及以下获取到元素节点。

    • 元素.previousSibling

      只能获取元素节点,IE8及以下不支持。

以上四种方法均存在兼容问题,解决方法如下:

var first = box.firstElementChild || box.firstChild
var last = box.lastElementChild || box.lastChild
var next = box.nextElementSibling || box.nextSibling
var previous = box.previousElementSibling || box.previousSiblng

4、操作节点

4-1、创建节点

  • document.createElement(“标签名”)

    该方法接收一个字符串标签名,返回一个标签对象的引用。

  • document.createTextNode(“文本”)

    该方法创建一段文本,返回文本对象的引用。

//创建标签节点
var p = document.createElement("p");
//创建文本节点
var text = document.createTextNode('创建的文本节点');
//将文本添加到标签内
p.appendChild(text);
//将标签添加到页面中
document.body.appendChild(p);
//但是更多情况下,是直接用标签的innerHTML属性来添加内容,一步可以代替上面的2、3两步
p.innerHTML = 'innerHTML方法添加的内容';

4-2、追加节点

  • 父元素.appendChild(子节点)

    用于向父元素的末尾添加一个节点。

var ul = document.getElementsByTagName('ul')[0];
var li = document.createElement('li');
li.innerHTML = '追加的标签';
ul.appendChild(li);//li添加到ul的尾部

4-3、插入节点

  • 父元素.insertBefore(要插入的节点,参考的节点)

    该方法接收两个参数,要插入的节点和作为参照的节点,插入节点后,被插入的节点会变成参照节点的前一个兄弟节点,同时被方法返回。没有子元素时以文本节点为参考。

var ul = document.getElementsByTagName('ul')[0];
var aLi = document.getElementsByTagName('li');
var li = document.createElement('li');
li.innerHTML = '插入的标签';
ul.insertBefore(li,aLi[1]);//插入到第二个li的前面,成为了新的第二个li,原第二个标签成为了第三个

4-4、删除节点

  • 父元素.removeChild(被删除的元素)

    该方法接收一个参数,要删除的节点。

var ul = document.getElementsByTagName('ul')[0];
var aLi = document.getElementsByTagName('li');
ul.removeChild(aLi[1]);//第二个li被删除

4-5、替换节点

  • 父元素.replaceChild(新的节点,被替换的节点)

    该方法接收两个参数,要插入的节点和被替换的节点。

var ul = document.getElementsByTagName('ul')[0];
var aLi = document.getElementsByTagName('li');
var li = document.createElement('li');
li.innerHTML = '新的标签';
ul.replaceChild(li,aLi[1]);//第二个li被新的标签替换掉

如果是用已经存在的节点去替换,已存在的节点会直接从原有位置上消失,在被替换节点的位置覆盖被替换的节点。

4-6、复制节点

  • 被复制的节点.cloneNode(布尔值)

    该方法拷贝节点并返回节点副本,接收一个布尔值参数,即是否需要克隆所有后代,默认值是false,只复制标签,不复制内容或子代;true表示复制标签中所有子代。

var ul = document.getElementsByTagName('ul')[0];
var newUl= ul.cloneNode(true);
document.body.appendChild(newUl);//复制一个ul标签,包含其所有原有的内容

如果使用这种方式复制节点,需要使用getElementsByTagName()动态获取元素,不然可能存在获取不到被复制的节点的情况。

注意:以上操作节点,除了创建和复制节点,其他方法均通过父元素操作,使用时分清所在位置。如删除节点中的父元素应该是被删除元素的父元素,而删除事件的操作元素可能是被删除元素的子元素。

5、DOM操作表格

5-1、获取表格元素

DOM提供了可以简便快速获取表格元素的属性,先获取到表格table对象,再通过table获取里面的元素。

<table>
    <thead>
        <th>编号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>张三</td>
            <td>man</td>
            <td>18</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <td>sum</td>
        </tr>
    </tfoot>
</table>
var table = document.getElementsByTagName('table')[0];
//获取thead,返回thead
console.log(table.tHead);//<thead>...</thead>
//获取tbody,返回一个集合tbody集合
console.log(table.tBodies);//HTMLCollection[tbody]
//获取tfood,返回tfoot
console.log(table.tFoot);//<tfoot>...</tfoot>
//获取所有行,返回一个行集合,包括thead和tfoot中的行
console.log(table.rows);//HTMLCollection(3)[tr,tr,tr]
//获取指定的行,此处获取第一个tbody中的行
console.log(table.tBodies[0].rows);//HTMLCoolection[tr]
//获取单元格,只能通过固定行获取,返回一个集合
console.log(table.rows[0].cells);//HTMLCollection(4)[th][th][th][th]