三十:javaScript之DOM对象

1.DOM对象简介

DOM,全称“Document Object Model(文档对象模型)”,它是由W3C组织定义的一个标准。
在前端开发时,我们往往需要在页面某个地方添加一个元素或者删除元素,这种添加元素、删除元素的操作就是通过DOM来实现的。

2.DOM结构
DOM采用树形结构作为分层结构,以树节点形式表示页面中各种元素或内容。
举例:

<html>
<head>
    <title><title>
<body>
    <h1>我要自学网</h1>
    <p>我要自学网成立于……</p>
</body>
</html.>

上面这个HTML文档使用DOM树形结构解析为:


22.png

在DOM中,每一个元素看成一个节点,而每一个节点就是一个“对象”。也就是我们在操作元素时,把每一个元素节点看成一个对象,然后使用这个对象的属性和方法进行相关操作。

下面我们介绍几个关于节点的概念。
1、根节点
在HTML文档中,html就是根节点。

2、父节点
一个节点之上的节点就是该节点的父节点,例如h1的父节点就是body,body的父节点就是html。

3、子节点
一个节点之下的节点就是该节点的子节点,例如h1就是body的子节点。

4、兄弟节点
如果多个节点在同一层次,并拥有相同的父节点,那么这几个节点就是兄弟节点。
例如h1和p就是兄弟节点,因为他们拥有相同的父节点body

DOM对象节点属性;

parentNode 获取当前节点的父节点
childNodes 获取当前节点的子节点集合
firstChild 获取当前节点的第一个子节点
lastChild 获取当前节点的最后一个子节点
previousSibling 获取当前节点的前一个兄弟节点
nextSibling 获取当前节点的后一个兄弟节点
attributes 元素的属性列表

其实除了上表列举的属性之外,还有nodeName、nodeValue和nodeType等几个比较重要的属性。

DOM节点操作简介:
在DOM学习中,对于节点的操作是核心内容,也是整个JavaScript入门教程中最核心技术之一。大家一定要花心思去认真掌握。在一般的前端工作面试中,这些操作是最基本的

关于DOM节点常用操作如下:
(1)创建节点;
(2)插入节点;
(3)删除节点;
(4)复制节点;
(5)替换节点;

获取DOM中指定元素:
在[CSS入门教程]的学习中,我们知道:如果想要对某个元素进行样式操作,就必须先通过一种方式来选中该元素(也就是[CSS选择器],然后才能进行相关样式的操作。在JavaScript中,如果想要对节点进行创建、删除等操作,同样也要通过一种方式来选中该节点。只有你获取了该元素节点,才能进行各种操作,很容易理解吧。
在JavaScript中,可以通过以下2种方式来选中指定元素:
(1)getElementById();
(2)getElementsByName()
一、getElementById()
在JavaScript中,如果想通过id来选中元素,我们可以使用document对象的getElementById()方法。
getElementById()方法类似于CSS中的id选择器。
语法:
document.getElementById("元素id");
举例:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <div id="lvye">绿叶学习网JavaScript入门教程</div>
    <script type="text/javascript">
        var e = document.getElementById("lvye");
        e.style.color = "red";
    </script>
</body>
</html>

在浏览器预览效果如下:


13-4-1.png

分析:
这里使用document.getElementById()的方法获取id为lvye的div元素,然后把这个DOM对象赋值给变量e,然后使用DOM对象的style对象来设置div元素颜色为红色。我们在“JavaScript操作CSS样式”这一节会详细给大家介绍这种方法。

二、getElementsByName()
在JavaScript中,如果想通过name来选中元素,我们可以使用document对象的getElementsByName()方法。
语法:
document.getElementsByName("表单元素name值");

说明:
getElementsByName()方法都是用于获取表单元素。
与getElementById()方法不同的是,使用该方法的返回值是一个数组,而不是一个元素。因此,我们想要获取具体的某一个表单元素,就必须通过数组下标来获取。
举例:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <input name="web" id="radio1" type="radio" value="HTML"/>
    <input name="web" id="radio2" type="radio" value="CSS"/>
    <input name="web" id="radio3" type="radio" value="JavaScript"/>
    <input name="web" id="radio4" type="radio" value="jQuery"/>
    <script type="text/javascript">
        alert(document.getElementsByName("web")[0].value);
    </script>
</body>
</html>

在浏览器预览效果如下:


13-4-2.png

其实可以这样说, getElementById()和getElementsByName()这两种方法是“JavaScript选择器”。

创建节点:
在JavaScript中,创建新节点都是先用document对象中的createElement()和createTextNode()这2种方法创建一个元素节点,然后再通过appendChild()、insertBefore()等方法把新元素节点插入现有的元素节点中去。

语法:
var e = document.createElement("元素名"); //创建元素节点
var t = document.createTextNode("元素内容"); //创建文本节点
e.appendChild(t); //把元素内容插入元素中去

举例1:创建简单节点

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <script type="text/javascript">
        var e = document.createElement("h1");
        var txt = document.createTextNode("绿叶学习网");
        e.appendChild(txt);    //把元素内容插入元素中去
        document.body.appendChild(e);
    </script>
</body>
</html>

在浏览器预览效果如下:

13-5-1.png

举例2:创建复杂节点

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <script type="text/javascript">
        var e = document.createElement("input");
        e.id = "submit";
        e.type = "button";
        e.value = "提交";
        document.body.appendChild(e);
    </script>
</body>
</html>

在浏览器预览效果如下:


13-5-2.png

插入节点:

在JavaScript中,插入节点有2种方法:
(1)appendChild();
(2)insertBefore();

1、appendChild()
在JavaScript中,我们可以使用appenChild()方法把新的节点插入到当前节点的“内部”。
语法:
obj.appendChild(new)

说明:
obj表示当前节点,new表示新节点。

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        function insert() {
            var e = document.createElement("li");
            var str = document.getElementById("txt").value; //获取文本框的值
            var txt = document.createTextNode(str);
            e.appendChild(txt);
            var list = document.getElementById("list");
            list.appendChild(e);
        }
    </script>
</head>
<body>
    <ul id="list">
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
    </ul>     
    列项文本:<input id="txt" type="text"/><br />
    <input type="button" value="插入新项" onclick="insert()" />
</body>
</html>

在浏览器预览效果如下:


13-6-1.png

分析:
我们在文本框中输入列表项文本“jQuery”,然后点击“插入新项”按钮,浏览器预览效果如下:


13-6-2.png

2.nsertBefore()
在JavaScript中,我们可以使用insertBefore()方法将新的子节点添加到当前节点的“末尾”。
语法:
obj.insertBefore(new,ref)
说明:
obj表示父节点;
new表示新的子节点;
ref指定一个节点,在这个节点前插入新的节点。
举例:

<!DOCTYPE html>
<html >
<head>
    <title></title>
    <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript">
        function insert() {
            var e = document.createElement("li");
            var str = document.getElementById("txt").value; //获取文本框的值
            var txt = document.createTextNode(str);
            e.appendChild(txt);
            var list = document.getElementById("list");
            list.insertBefore(e,list.firstChild);
        }
    </script>
</head>
<body>
    <ul id="list">
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
        <li>jQuery</li>
    </ul>     
    列项文本:<input id="txt" type="text"/><br />
    <input type="button" value="插入新项" onclick="insert()"/>
</body>
</html>

在浏览器预览效果如下:


13-6-3.png

分析:
我们在文本框中输入列表项文本“jQuery”,然后点击“插入新项”按钮,浏览器预览效果如下:


13-6-2.png

删除节点

语法:
obj.removeChild(oldChild);
举例1:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        //定义删除函数
        function del() {
            var e = document.getElementById("list");
            //判断元素节点e是否有子节点
            if (e.hasChildNodes) {
                e.removeChild(e.lastChild);    //删除e元素的最后一个子节点
            }
        }
    </script>
</head>
<body>
    <ul id="list">
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
        <li>jQuery</li>
        <li>ASP.NET</li>
    </ul>
    <input type="button" value="删除" onclick="del()"/></div>
</body>
</html>

在浏览器预览效果如下:


13-7-1.png

复制节点
语法:
obj.cloneNode(bool)
说明:
参数obj表示被复制的节点,而参数bool是一个布尔值,取值如下:
(1)1或true:表示复制节点本身以及复制该节点下的所有子节点;
(2)0或false:表示仅仅复制节点本身,不复制该节点下的子节点;
举例:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        function add() {
            var e = document.getElementById("list");
            document.body.appendChild(e.cloneNode(1));
        }
    </script>
</head>
<body>
    <ul id="list">
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
        <li>jQuery</li>
        <li>ASP.NET</li>
    </ul>
    <input type="button" value="添加" onclick="add()" />
</body>
</html>

在浏览器预览效果如下:


13-8-1.png

替换节点
语法:
obj.replaceChild(new,old)

说明:
obj,表示被替换节点的父节点;
new,表示替换后的新节点;
old,需要被替换的旧节点。
举例:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        function replace() {
            //获取两个文本框的值
            var tag = document.getElementById("tag").value;
            var txt = document.getElementById("txt").value;
            //获取p元素
            var lvye = document.getElementById("lvye");
            //根据两个文本框的值创建新节点
            var e = document.createElement(tag);
            var t = document.createTextNode(txt);
            e.appendChild(t);
            document.body.replaceChild(e,lvye);
        }
    </script>
</head>
<body>
    <p id="lvye">绿叶学习网</p>
    <hr />
    输入标签:<input id="tag" type="text"/><br />
    输入文本:<input id="txt" type="text"/><br />
    <input type="button" value="替换" onclick="replace()" />
</body>
</html>

在浏览器预览效果如下:

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

推荐阅读更多精彩内容

  • 欢迎关注个人微信公众账号:byodian个人博客:Byodian's Blog JavaScript 基础知识总结...
    工具速递阅读 758评论 0 3
  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,640评论 0 7
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,769评论 0 8
  • DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API。DOM 描绘了一个层次化的节点树,允许开发...
    劼哥stone阅读 771评论 8 6
  • 第1章 认识JS JavaScript能做什么?1.增强页面动态效果(如:下拉菜单、图片轮播、信息滚动等)2.实现...
    mo默22阅读 1,275评论 0 5