DOM 基础

HTML DOM 定义了访问和操作 HTML 文档的标准方法。

DOM 将 HTML 文档表达为树结构。

W3School搬运工,点我直达W3School

什么是DOM

DOM 是 W3C(万维网联盟)的标准。

DOM 是 Document Object Model(文档对象模型)的缩写。

DOM 定义了访问 HTML 和 XML 文档的标准:

“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”

DOM 标准被分为 3 个不同的部分:

  • 核心 DOM - 针对任何结构化文档的标准模型
  • XML DOM - 针对 XML 文档的标准模型
  • HTML DOM - 针对 HTML 文档的标准模型

什么是HTML DOM

HTML DOM 是:

  • HTML 的标准对象模型
  • HTML 的标准编程接口
  • W3C 标准

HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。

HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。

DOM 节点

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

DOM 节点

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

HTML DOM 节点树

HTML DOM 将 HTML 文档视作树结构。这种结构被称为节点树。

HTML DOM Tree 实例

通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。

节点父、子和同胞

节点树中的节点彼此拥有层级关系。

父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)

  • 每个节点都有父节点、除了根(它没有父节点)

  • 一个节点可拥有任意数量的子

  • 同胞是拥有相同父节点的节点

DOM 方法 属性

编程接口

可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。

所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。

方法是您能够执行的动作(比如添加或修改元素)。

属性是您能够获取或设置的值(比如节点的名称或内容)。

HTML DOM 方法

方法是我们可以在节点(HTML 元素)上执行的动作。

方法 描述
getElementById() 返回带有指定 ID 的元素。
getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。
getElementsByClassName() 返回包含带有指定类名的所有元素的节点列表。
appendChild() 把新的子节点添加到指定节点。
removeChild() 删除子节点。
replaceChild() 替换子节点。
insertBefore() 在指定的子节点前面插入新的子节点。
createAttribute() 创建属性节点。
createElement() 创建元素节点。
createTextNode() 创建文本节点。
getAttribute() 返回指定的属性值。
setAttribute() 把指定属性设置或修改为指定的值。

HTML DOM 属性

属性是节点(HTML 元素)的值,您能够获取或设置。

innerHTML 属性

获取元素内容的最简单方法是使用 innerHTML 属性。

innerHTML 属性对于获取或替换 HTML 元素的内容很有用。

nodeName 属性

nodeName 属性规定节点的名称。

nodeName 是只读的

  • 元素节点的 nodeName 与标签名相同
  • 属性节点的 nodeName 与属性名相同
  • 文本节点的 nodeName 始终是 #text
  • 文档节点的 nodeName 始终是 #document

注释:nodeName 始终包含 HTML 元素的大写字母标签名。..

nodeValue 属性

nodeValue 属性规定节点的值。

  • 元素节点的 nodeValue 是 undefined 或 null
  • 文本节点的 nodeValue 是文本本身
  • 属性节点的 nodeValue 是属性值

nodeType 属性

nodeType 属性返回节点的类型。nodeType 是只读的。

元素类型 NodeType
元素 1
属性 2
文本 3
注释 8
文档 9

【小例子:节点关系与删除】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>remove</title>
    <script type="text/javascript">
        function fun(element) {
            // log(element.firstChild)
            // log(element.style)
            // log(element.id)
            // log(element.getAttributeNode("href"))
            // log(element)
            // log(element.parentNode.parentNode)
            // log(element.parentNode.parentNode.parentNode)
            // element.parentNode.removeChild(element.parentNode.firstChild)
            log(element.firstChild)
            element.removeChild(element.firstChild)
        }
        function log(element){
            console.log("节点:")
            console.log(element)
            console.log("节点名称:" + element.nodeName)
            console.log("节点值:" + element.nodeValue)
            console.log("节点类型:" + element.nodeType)
            console.log("");
        }
    </script>
</head>
<body>

<p> <a href="javascript:void(0);" onclick='fun(this)' >你好</a></p>
</body>
</html>

DOM 访问

访问 HTML 元素等同于访问节点

以不同的方式来访问 HTML 元素:

  • getElementById() 方法
  • getElementsByTagName() 方法
  • getElementsByClassName() 方法

DOM 修改

修改 HTML = 改变元素、属性、样式和事件。

【实例】

//修改内容
document.getElementById("p1").innerHTML="New text!";
//修改样式
document.getElementById("p2").style.color="blue";
//添加节点
<div id="d1">
<p id="p1">This is a paragraph.</p>
<p id="p2">This is another paragraph.</p>
</div>

<script>
var para=document.createElement("p");
var node=document.createTextNode("This is new.");
para.appendChild(node);

var element=document.getElementById("d1");
element.appendChild(para);
</script>

元素

添加 HTML 元素

如需向 HTML DOM 添加新元素,您首先必须创建该元素,然后把它追加到已有的元素上。

appendChild()

将新元素作为父元素的最后一个子元素进行添加

【实例】

<div id="div1">
<p id="p1">This is a paragraph.</p>
<p id="p2">This is another paragraph.</p>
</div>

<script>
var para=document.createElement("p");
var node=document.createTextNode("This is new.");
para.appendChild(node);

var element=document.getElementById("div1");
element.appendChild(para);
</script>

insertBefore()

// 在A下插入节点B,并且B节点在C节点前
A.insertBefore(B,C);

【实例】

<div id="div1">
<p id="p1">This is a paragraph.</p>
<p id="p2">This is another paragraph.</p>
</div>

<script>
var para=document.createElement("p");
var node=document.createTextNode("This is new.");
para.appendChild(node);

var element=document.getElementById("div1");
var child=document.getElementById("p1");
element.insertBefore(para,child);
</script>

删除 HTML 元素

//将A下的B删除,A是B的父节点
A.removeChild(B)

如需删除 HTML 元素,您必须清楚该元素的父元素:

var child=document.getElementById("p1");
child.parentNode.removeChild(child);

替换 HTML 元素

//将A下的C替换为B
A.replaceChild(B,C)

【实例】

var parent=document.getElementById("div1");
var child=document.getElementById("p1");
parent.replaceChild(para,child);

事件

HTML DOM 允许 JavaScript 对 HTML 事件作出反应。

响应事件

【实例】

<input type="button" onclick="document.body.style.backgroundColor='lavender';" value="Change background color" />
//实现效果同上
<script>
function ChangeBackground()
{
    document.body.style.backgroundColor="lavender";
}
</script>

<input type="button" onclick="ChangeBackground()" value="Change background color"/>

HTML 事件属性

如需向 HTML 元素分配事件,您可以使用事件属性。

//向 button 元素分配一个 onclick 事件:
<button onclick="displayDate()">试一试</button>

使用 HTML DOM 来分配事件

HTML DOM 允许您使用 JavaScript 向 HTML 元素分配事件:

//为 button 元素分配 onclick 事件
<script>
    document.getElementById("myBtn").onclick=function(){displayDate()};
</script>

onload 和 onunload 事件

当用户进入或离开页面时,会触发 onload 和 onunload 事件。

onload事件可用于检查访客的浏览器类型和版本,以便基于这些信息来加载不同版本的网页。

onload 和 onunload 事件可用于处理 cookies。

关于onunload,onbeforeunload,需要仔细琢磨。关于onbeforeunload,可以戳我

导航

HTML DOM 节点列表

getElementsByTagName() 方法返回节点列表。节点列表是一个节点数组。

下面的代码选取文档中的所有 <p> 节点:

【实例】

var x=document.getElementsByTagName("p");

可以通过下标号访问这些节点。如需访问第二个 <p>,您可以这么写:

y=x[1];

HTML DOM 节点列表长度

document.getElementsByTagName("p").length
length 属性定义节点列表中节点的数量。

导航节点关系

您能够使用三个节点属性:parentNode、firstChild 以及 lastChild ,在文档结构中进行导航。

firstChild 属性可用于访问元素的文本。

<p id="intro">Hello World!</p>
<script>
    x=document.getElementById("intro");
    document.write(x.firstChild.nodeValue);
</script>

DOM 根节点

document - #document,包含<!DOCTYPE html>...
document.documentElement - 全部文档
document.body - 文档的主体

console.log(document);
console.log(document.documentElement);
console.log(document.body);

childNodes 和 nodeValue

除了 innerHTML 属性,您也可以使用 childNodes 和 nodeValue属性来获取元素的内容。

【实例】

<p id="intro">Hello World!</p>
<script>
var txt=document.getElementById("intro").childNodes[0].nodeValue;
document.write(txt);
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西...
    微醺岁月阅读 4,485评论 2 62
  • DOM基础 第一章:DOM概述 1.1DOM以及节点概念 ​ 文档对象模型DOM(Document Object ...
    LinDaiDai_霖呆呆阅读 231评论 0 0
  • 二十岁的迷茫深深的击中了我,我像是得了一种病,每天都被这种心情困扰着,折磨着,情绪反反复复,始终无法平复。二月份的...
    言木从阅读 587评论 7 10
  • Part1 我叫苏念乡。 这个名字听起来就含情脉脉,充满了眷恋故土的意味。但是也只是听起来而已,我对这个思念的主体...
    城北闲喵阅读 408评论 4 12
  • 我想遇见你 那个梦中相思 魂牵梦萦的你 我想遇见你 那个长相厮守 相伴终生的你 我想遇见你 在那日落之时 在那江河...
    漠然_阅读 135评论 0 0