JS一个重要功能就是操作DOM, 改变页面显示。

目录:

1、基本概念

2、节点类型

3、节点关系

4、节点操作

基本概念

DOM全称为Document Object Model ,即文档对象模型,是针对HTML和XML的一个API,  描绘了一个层次化的节点树,可以添加、移除和修改页面的某一部分。

DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构。

节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。以下面的HTML为例:

<html>

<head>

<title>Sample Page</title>

</head>

<body>

<p>Hello world!</p>

</body>

</html>

将这个HTML文档表示为一个层次结构,如下图

方框中黑体字代表节点类型。

文档节点(图中的 Document)是每个文档的根节点,

这个例子中,它只有一个子节点,即 <html>元素,我们称之为文档元素

文档元素是文档的最外层元素,文档中的其他所有元素都包含在文档元素中。

每个文档只能有一个文档元素。

在HTML页面中,文档元素始终都是<html>元素。

在XML中,没有预定义的元素,任何元素都可能成为文档元素。

每一段标记都可以通过树中的一个节点来表示,总共有12种节点类型,这些类型都继承自一个基类型。

并不是所有节点类型都受到Web浏览器的支持,最常用的就是元素文本、文档节点(下面数值常量中的1、3和9),我们只要关注这三种就可以了。

我们先看下所有的节点类型。

节点类型

js 中所有节点类型都继承自Node类型,因此都共享着相同的基本属性和方法。

每个节点都有nodeType属性,用于表明节点的类型。

nodeType有12个数值常量,任何类型必居其一。

各节点类型可能的子节点类型

通过比较上面这些常量,可以确定节点类型:

if (someNode.nodeType == 1) {

alert("Node is an element.");

}

节点关系

把文档树比喻成家谱。(如下图,某个节点可以通过属性访问其他节点)

每个节点有一个childNodes属性,其中保存着一个NodeList对象(类数组对象,但不是Array的实例),它是基于DOM结构动态查询的结果。

可通过方括号,也可通过item() 方法来访问NodeList中的节点。例子:

// 访问 NodeList对象中的节点

var firstChild = someNode.childNodes[0];

var secondChild = someNode.childNodes.item(1);

var count = someNode.childNodes.length;

在反映这些关系的所有属性中,childNodes属性更方便一些,因为只须使用简单的关系指针,就可以通过它访问文档树中的任何节点。

节点操作

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

主要是 添加、插入、替换、移除,我们分别介绍。

1、末尾添加一个节点

这是我们最常用的操作,appendChild(),用于向childNodes列表的末尾添加一个节点。

添加节点后,childNodes的新增节点、父节点及以前的最后一个子节点的关系指针都会相应的得到更新。更新完成后,appendChild()返回新增的节点。

// appendChild()

var returnedNode = someNode.appendChild(newNode);

alert(returnedNode == newNode);   // true

alert(someNode.lastChild == newNode);   // true

如果传入到appendChild()中的节点已经是文档的一部分,那结果就是将该节点从原来的位置转移到新位置。

2、插入节点

如果要把节点插入到 childNodes 列表中某个特定的位置上,用insertBefore(要插入的节点,作为参照的节点)。

插入节点后,被插入的节点会变成参照节点的前一个同胞节点(previousSibling),同时被方法返回。

如果参照节点是null, 则 insertBefore()与appendChild()执行相同的操作。

// insertBefore()

// 插入后成为最后一个子节点

returnedNode = someNode.insertBefore(newNode, null);

alert(newNode == someNode.lastChild);   // true

// 插入后成为第一个子节点

var returnedNode = someNode.insertBefore(newNode, someNode.firstChild);

alert(returnedNode == newNode);   //true

alert(newNode == someNode.firstChild);    //true

// 插入到最后一个子节点的前面

returnedNode = someNode.insertBefore(newNode, someNode.lastChild);

alert(newNode==someNode.childNodes[someNode.childNodes.length-2]);  //true

3、替换节点

如果要替换节点,用 replaceChild(要插入的节点,要替换的节点)

要替换的节点将由这个方法返回并从文档树中被移除,同时由要插入的节点占据其位置。

// 替换节点 replaceChild()

// 替换第一个子节点

var returnedNode = someNode.replaceChild(newNode,someNode.firstChild);

4、移除节点

移除节点用 removeChild(移除的节点)。

被移除的节点成为方法的返回值。

// 移除节点 removeChild()

// 移除第一个节点

var formerFirstChild = someNode.removeChild(someNode.firstChild);

移除的节点仍然为文档所有,不过在文档中已经没有了自己的位置。

前面介绍的四个方法操作的都是某个节点的子节点,也就是说,要使用这几个方法必须先取得父节点(使用parentNode属性)。

5、其他方法

cloneNode(),接受一个布尔值参数,表示是否执行深复制。

true,  执行深复制,也就是复制节点及其整个子节点数。

false, 执行浅复制,即只复制节点本身。

返回的节点副本属于文档所有,但没有指定父节点。

因此,这个节点副本就成为“孤儿”,除非通过 appendChild(), insertBefore()或replaceChild()将它添加到文档中。

下一篇中,我们详解 常用到的 document, element, text 三种节点类型,并结合节点操作,介绍几个常用的示例。

JS核心之DOM操作 上的更多相关文章

  1. JS核心之DOM操作 下

    目录: 1.节点类型之Document类型 2.节点类型之Element类型 3.节点类型之Text类型 4.综合小示例 -- 动态添加外部样式文件 5.查找元素的扩展方法 接上篇,我们先来看常用的三 ...

  2. js中的DOM操作汇总

    一.DOM创建 DOM节点(Node)通常对应于一个标签,一个文本,或者一个HTML属性.DOM节点有一个nodeType属性用来表示当前元素的类型,它是一个整数: Element,元素 Attrib ...

  3. React.js 小书 Lesson21 - ref 和 React.js 中的 DOM 操作

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson21 转载请注明出处,保留原文链接和作者信息. 在 React.js 当中你基本不需要和 DO ...

  4. ref 和 React.js 中的 DOM 操作

    在 React.js 当中你基本不需要和 DOM 直接打交道.React.js 提供了一系列的 on*方法帮助我们进行事件监听,所以 React.js 当中不需要直接调用 addEventListen ...

  5. js练习【DOM操作】

    完成效果: 演示地址:http://codepen.io/anon/pen/jPbYWq HTML: <!DOCTYPE html> <html lang="en" ...

  6. [笔记]原生JS实现的DOM操作笔记

    原生JS实现的DOM一系列操作参考: 原生JavaScript封装DOM库 siblings: 原生JS-查找相邻的元素-siblings方法的实现 addClass,removeClass,hasC ...

  7. 【2017-03-28】JS基础、DOM操作

    一.JS基础 1.javascript功能 ⑴进行数据运算 ⑵控制浏览器功能 ⑶控制元素的属性.样式.内容 2.javascript位置和格式 可以放在html页的任意位置,也可以创建一个以js结尾的 ...

  8. JS中的DOM操作怎样添加、移除、移动、复制、创建和查找节点

    DOM操作怎样添加.移除.移动.复制.创建和查找节点? (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元 ...

  9. JS中的DOM操作和事件

    [DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点:可以使用getElement系列方法, ...

随机推荐

  1. ListView 控件总结

     1.ListView类           1.常用的基本属性:         (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有 ...

  2. JS面向对象编程(一):封装

    js是一门基于面向对象编程的语言.      如果我们要把(属性)和(方法)封装成一个对象,甚至要从原型对象生成一个实例,我们应该怎么做呢?  一.生成对象的原始模式            假定把猫看 ...

  3. IOC容器-Autofac在MVC中实现json方式注入使用

    在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...

  4. 【JDK】JDK源码分析-Vector

    概述 上文「JDK源码分析-ArrayList」主要分析了 ArrayList 的实现原理.本文分析 List 接口的另一个实现类:Vector. Vector 的内部实现与 ArrayList 类似 ...

  5. 简易数据分析 08 | Web Scraper 翻页——点击「更多按钮」翻页

    这是简易数据分析系列的第 8 篇文章. 我们在Web Scraper 翻页--控制链接批量抓取数据一文中,介绍了控制网页链接批量抓取数据的办法. 但是你在预览一些网站时,会发现随着网页的下拉,你需要点 ...

  6. 利用dockerfile 安装一个nginx-1.14.1

    FROM docker.io/centos MAINTAINER jim 107420988@qq.com ENV TZ "Asia/Shanghai" #ENV TERM xte ...

  7. codeforces 322 B Ciel and Flowers

    题目链接 有红绿蓝三种颜色的画,每种拿三朵可以组成一束花,或者各拿一朵组成花束,告诉你每种花的数目,求出可能组成最多的花束. 如果你的代码过不了,考虑一下 8 8 9这种组合.  因为数据量很大,我的 ...

  8. 【Python】Django 的邮件引擎用法详解!!(调用163邮箱为例)

    1. send_mall()方法介绍 位置: 在django.core.mail模块提供了send_mail()来发送邮件. 方法参数: send_mail(subject, message, fro ...

  9. oracle实战(一)

    一.表空间的创建以及删除 声明:此操作环境为windows,oracle10G 表空间? ORACLE数据库的逻辑单元. 数据库---表空间 一个表空间可以与多个数据文件(物理结构)关联 一个数据库下 ...

  10. java并发编程(十五)----(线程池)java线程池简介

    好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...