DOM 提供了很多实用的 API,这些 API 让我们可以轻松的访问 HTML 文档。所谓 API(应用程序接口),简单来说,如果一个应用程序提供了一些 API,那么我们就可以使用这些 API 实现一些功能,而不用了解程序内部的运作过程和原理。

  DOM API 可以让我们操作 DOM 节点,以后还会讲到 BOM API,它可以让我们操作浏览器的一些属性和方法,BOM API + DOM API 统称为 Web API。

  前面我们已经了解了 DOM 把 HTML 文档解析为节点树,实际上 HTML 节点树只是整个 DOM 树的一个分支,另一个分支则是 XML。在详细介绍 HTML DOM 节点的操作之前,先来看一下完整的DOM 树:

  网上没找到关于完整的 DOM 树的图,所以自己大致做了一个。准确说这个应该叫 DOM 继承树,因为很多我们常用的 DOM 对象的方法都绑定在 Document 和 Element 对象上。我们从 HTML 文档获取的 DOM 元素上使用的方法,其实大部分都继承自这俩。(上图 Element 的子分支写错了,应该是 HTMLElement 和 XMLElement,之前的图不见了,懒得重新做,特此说明)

  这里放一段 HTML 代码供后面测试使用:

 <body>
<h1 class="h1">h1</h1>
<h3 id="h3">h3</h3>
<div name="div">
<p>
<span>span</span>
</p>
</div>
</body>

一   查找节点

  1,  元素(标签)查找

    document 代表整个文档。

    document.getElementById():通过标签 ID 属性查找元素。绑定 在Document 上所以只能使用document调用

    document.getElementsByName():通过标签 name 属性查找元素(所有的)。绑定在 HTMLDocument 上,只能使用document调用

    .getElementsByTagName():通过标签名查找元素(所有的)。Document 和 Element 上均有绑定。

    .getElementsByClassName():通过标签 class 属性查找元素(所有的)。Document 和 Element 上均有绑定。

    .querySelector():通过css方式查找元素。Document 和 Element上均有绑定。

    .querySelectorAll():通过css方式查找元素(所有的)。Document 和 Element上均有绑定。

  注意,最后两个虽然速度快,但它不是实时的查找元素,而是这一时刻的静态快照,如果这之后DOM结构发生改变,可能会产生预期之外的结果,所以使用的时候请务必小心。 

 var h3 = document.getElementById("h3"),
h1 = document.getElementsByClassName("h1")[0],
div = document.getELementsByName("div")[0],
p = document.getElementsByTagName("p")[0],
span = p.getElementsByTagName("span")[0];

   除了.getElementById和.querySeletor 是获取单个元素外,其他方式都是获取一组元素,返回值都是类数组,所以访问需遵循数组访问方式。

 

  2,  节点树遍历(包含所有类型节点)

    node.parentNode:获取节点的父节点。

    node.childNodes:获取节点的所有子节点。

    node.firstChild:获取节点的第一个子节点。

    node.lastChild:获取节点的最后一个节点。

    node.nextSibling:获取节点紧邻的下一个兄弟节点。

    node.previousSibling:获取节点紧邻的上一个兄弟节点。

  多数情况下我们都是访问元素节点,所以这里就不举例说明了。

  3,  元素节点树遍历(只包含元素)

    node.parentElement:获取节点的父元素节点。

    node.children:获取节点的所有子元素节点。

    node.firstElementChild:获取节点的第一个元素子节点。

    node.lastElementChild:获取节点的最后一个元素子节点。

    node.nextElementSibling:获取节点的紧邻的下一个兄弟元素。

    node.previousElementSibling:获取节点的紧邻的上一个兄弟元素。

  元素节点都有一个 attributes 属性,值是该元素节点的属性集合,诸如 id,class,name 等等,也是一个类数组。

 h3.parentElement;//body
p.children[0];//span
document.body.firstElementChild;//h1
document.body.lastElementChild;//div
h1.nextElementSibling;//h3
div.previousElementSibling;//h3

二     创建节点

1,创建

    document.createElement():创建元素节点。

document.createTextNode():创建文本节点。

document.createComment():创建注释节点。

 document.createElement('button');
document.createTextNode('我是文本');
document.createComment('我是注释');

2,插入

parentNode.appendChild():向父元素内部的最后一个位置插入节点。

parentNode.insertBefore(a,b):向父元素内部b节点之前插入a节点。

 var strong = document.createElement("strong");
p.appendChild(strong);
console.log(p);//<p><span>span</span><strong></strong><p>
var text = document.createTextNode("some text");
div.insertBefore(text,p);
/*
<div>
some text
<p>
<span>span</span>
<strong></strong>
</p>
</div>
*/

三     删除节点

  1,删除

parentNode.removeChild():父节点删除子节点,从页面剪切出来,有返回值。

node.remove():节点自己,直接删除,无返回值。

 <div>
<p></p>
</div>
*********************************
var oDiv = document.getElementsByTagName('div')[0],
oP = document.getLEementsByTagName('p')[0];
oDiv.removeChild(oP);//父删子
//oP.remove();删自己

  2,替换

parentNode.replaceChild(new,old):用new节点替换父元素内部old节点。用的很少。

 var removedH1 = document.body.removeChild(h1);
console.log(removedH1);//<h1 class="h1">h1</h1>
var removedH3 = h3.remove();
console.log(removedH3);//undefined

补充:元素节点的属性和方法

属性

    element.innerHTML:获取父节点内部的HTML结构。

    element.innerText/textContent:获取父节点内部的文本内容。

  方法

    element.setAttribute():设置元素的属性和值。

    element.getAttribute():获取元素的属性值。

    element.removeAttribute():移除元素的属性。

 div.innerHtml;//<div><span>span</span></div>
span.innerText;//"span"
h1.getAttribute("class");//"h1"
h1.setAttribute("id","idh1");//<h1 class="h1" id = "idh1"></h1>
h1.removeAttribute("id");//<div class="h1"></div>

   以往,我们通过 element.[属性名] 的方式只能读取或设置元素自带的属性,例如 class,id,src 等,而上述方法不仅仅可以读取或设置自带属性,还可以为元素添加自定义属性,并做修改或移除。同时,H5 新规范还为我们提供了一个额外的属性:element.dataset,读取自定义属性集合。你可以通过该属性读取或设置自定义属性值。

 var oDiv = document.getElementsByTagName('div')[0];
oDiv.setAttribute('data-index',1);//新添加自定义属性 data_index,并设置其值为1
oDiv.getAttribute('data-index');//
oDiv.dataset.index;//1

  注意:H5 规定所有自定义属性都以 data- 开头。

DOM之节点操作的更多相关文章

  1. dom的节点操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 深入理解DOM节点操作

    × 目录 [1]创建节点 [2]插入节点 [3]移除节点[4]替换节点[5]复制节点 前面的话 一般地,提起操作会想到“增删改查”这四个字,而DOM节点操作也类似地对应于此,接下来将详细介绍DOM的节 ...

  3. JS Dom节点操作demo!

    通过黑马课程的学习,在这里分享一个js Dom中节点操作的小练习 需求:使用js创建一个4*3的表格table. onload = function(){ function c(tagName){ r ...

  4. Query节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作

    一.创建节点 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div> ...

  5. 第6章 DOM节点操作

    一.创建节点 为了使页面更加智能化,有时我们想动态的在 html 结构页面添加一个元素标签,那么 在插入之前首先要做的动作就是:创建节点. varbox=$('<div id="box ...

  6. JavaScript 节点操作Dom属性和方法(转)

    JavaScript 节点操作Dom属性和方法   一些常用的dom属性和方法,列出来作为手册用. 属性:   1.Attributes 存储节点的属性列表(只读)   2.childNodes 存储 ...

  7. jQuery节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作

    一.创建节点 1 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div& ...

  8. (转载)html dom节点操作(获取/修改/添加或删除)

    DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准,下面为大家介绍下html dom节点操作,感兴趣的朋友可以参考下   HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素 ...

  9. JavaScript DOM节点操作总结

    节点类型 节点类型主要有三种:元素节点,属性节点和文本节点. 而对DOM的主要也就是围绕元素节点和属性节点的增删改查.下面就分别从对元素节点的操作和对属性节点的操作来介绍. 元素节点 查 在对DOM进 ...

随机推荐

  1. 常用Feed流架构实现

    业务中很多需求都会用到类似feed流的架构. 例如 微信朋友圈 微博 动态 1对N消息. 一般feed流的架构实现有下面几种. 假如现在的业务场景是微博,然后当前的数据情况是: 用户A关注了用户B和C ...

  2. java 正则 替换中文为空

    //中文替换为"" public String replaceChineseToNULL(String s){ String reg = "[\u4e00-\u9fa5] ...

  3. 调度系统Airflow1.10.4调研与介绍和docker安装

    Airflow1.10.4介绍与安装 现在是9102年,8月中旬.airflow当前版本是1.10.4. 随着公司调度任务增大,原有的,基于crontab和mysql的任务调度方案已经不太合适了,需要 ...

  4. 常见rpm包和yum包命令

    1.rpm包 在 安装.升级.卸载服务程序时要考虑到其他程序.库的依赖关系,在进行校验.安装. 卸载.查询.升级等管理软件操作时难度都非常大. RPM 机制则为解决这些问题而设计的.RPM 有点像 W ...

  5. 【翻译】无需安装Python,就可以在.NET里调用Python库

    原文地址:https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installat ...

  6. svn checkout 单个文件

    $ svn co --depth=empty file:///usr/local/svn/calc calc_new $ cd calc_new $ svn up readme.txt 其中,calc ...

  7. leetcode8 String to Integer

    题目描述 Implement atoi which converts a string to an integer. The function first discards as many white ...

  8. abp(net core)+easyui+efcore实现仓储管理系统——菜单 (十六)

    系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) ...

  9. HttpClient 三种 Http Basic Authentication 认证方式,你了解了吗?

    Http Basic 简介 HTTP 提供一个用于权限控制和认证的通用框架.最常用的 HTTP 认证方案是 HTTP Basic authentication.Http Basic 认证是一种用来允许 ...

  10. 浏览 GitHub 太卡了?教你两招!

    老实说,GitHub 在国内的使用体验并不算太好,这其中最大的原因就是网络了. GitHub 访问起来比较卡,这个看起来貌似无解.国内的 gitee 网速倒是可以,但是无法代替 GitHub,个人感觉 ...