DOM文档对象模型

本文详细介绍了DOM(文档对象模型),包括DOM对象的节点树结构,HTML元素的操作如获取、属性、样式、内容的修改,HTMLCollection和NodeList对象的区别,以及DOM节点的添加和删除。DOM是JavaScript操作HTML的重要工具,通过document对象和Element对象的方法,可以实现对HTML元素的全面控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@[TOC](这里写目录标题)
# 一、DOM对象简介
## 1、DOM:文档对象模型(Document Object Model,简称DOM)

一、DOM对象简介

1、DOM:文档对象模型(Document Object Model,简称DOM)

2、DOM HTML节点树:指的是DOM中为操作HTML文档提供的属性和方法,一个HTML文件可以看作是所有元素组成的一个节点树,各元素节点之间有级别的划分 。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
    <a href="#">链接</a>
    <p>段落...</p>
</body>
</html>

HTML文档根据节点作用,分为标签节点、文本节点、属性节点和注释节点。

各节点之间的关系,又可分为以下几个方面:

根节点:<html>标签是整个文档的根节点,有且仅由一个。

子节点:指的是某一个节点的下级节点。

父节点:指的是某一个节点的上级节点。

兄弟节点:两个节点同属于一个父节点。

3、DOM对象的继承关系

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>

<body>

    <div id="Tom"></div>

    <script>

        var Tom = document.getElementById('Tom');

        console.log(Tom);         // 输出结果:<div id="Tom"></div>

        console.log(Tom.__proto__);   // 输出结果:HTMLDivElement { …… }

    </script>

</body>

</html>

从上面的代码中我们可以总结出以下三点:

(1)document和Element是两种不同类型的节点(Node)对象。

(2)它们不仅能够使用Node对象的一系列属性和方法完成节点操作。

(3)也可以使用特有的属性和方法完成不同类型节点的操作。

除了document和Element对象,还有其他几种类型的节点对象也继承Node对象,如文本(Text)、注释(Comment)等。

Node.属性名

相应的对象

说明

ELEMEN_NODE

1

Element

元素节点

ATTRIBUTE_NODE

2

Attr

属性节点

TEXT_NODE

3

Text

文本节点

COMMENT_NODE

8

Comment

注释节点

DOCUMENT_NODE

9

Document

文档节点

#二、HTML元素操作

##1、获取操作的元素(document对象的方法和属性、Element对象的方法和属性)

(1)document对象的方法和属性

document对象提供了一些用于查找元素的方法,利用这些方法可以根据元素的id、name和class属性以及标签名称的方式获取操作的元素。

方法

说明

document.getElementById()

返回对拥有指定id的第一个对象的引用

document.getElementsByName()

返回带有指定名称的对象集合

document.getElementsByTagName()

返回带有指定标签名的对象集合

document.getElementsByClassName()

返回带有指定类名的对象集合(不支持IE6~8)

温馨提示:除了document.getElementById()方法返回的是拥有指定id的元素外,其他方法返回的都是符合要求的一个集合。若要获取其中一个对象,可以通过下标的方式获取,默认从0开始。

document对象提供一些属性,可用于获取文档中的元素。例如,获取所有表单标签、图片标签等。

属性

说明

document.body

返回文档的body元素

document.documentElement

返回文档的html元素

document.forms

返回对文档中所有Form对象引用

document.images

返回对文档中所有Image对象引用

总结:document对象的body属性用于返回body元素。document对象的documentElement属性用于返回HTML文档的根节点html元素。

HTML5中为更方便获取操作的元素,为document对象新增了两个方法,分别为querySelector()和querySelectorAll()。

querySelector()方法用于返回文档中匹配到指定的元素或CSS选择器的第1个对象的引用。

querySelectorAll()方法用于返回文档中匹配到指定的元素或CSS选择器的对象集合。

由于这两个方法的使用方式相同,下面以document.querySelector()方法为例演示。

<script>

    console.log(document.querySelector('div'));        // 获取匹配到的第1个div

    console.log(document.querySelector('#box'));    // 获取id为box的第1个div

    console.log(document.querySelector('.bar'));      // 获取class为bar的第1个div

    console.log(document.querySelector('div[name]'));// 获取含有name属性的第1个div

    console.log(document.querySelector('div.bar'));// 获取文档中class为bar的第1个div

    console.log(document.querySelector('div#box'));// 获取文档中id为box的第1个div

</script>

(2)Element对象的方法和属性

在DOM操作中,元素对象也提供了获取某个元素内指定元素的方法,常用的两个方法分别为getElementsByClassName()和getElementsByTagName()。它们的使用方式与document对象中同名方法相同。

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>



    <ul id="ul">

        <li>PHP</li>

        <li>JavaScript</li>

        <ul>

            <li>jQuery</li>

        </ul>

    </ul>

    <script>

        var lis = document.getElementById('ul').getElementsByTagName('li');

        console.log(lis);// 输出结果:(3) [li, li, li]

    </script>

</body>

</html>

元素对象还提供了children属性用来获取指定元素的子元素。例如,获取上述示例中ul的子元素。

    <script>

        var lis = document.getElementById('ul').children;

        console.log(lis);       // 输出结果:(3) [li, li, ul]

    </script>

元素对象的children属性返回的也是对象集合,若要获取其中一个对象,也需通过下标的方式获取,默认从0开始。

另外,document对象中也有children属性,它的第一个子元素通常是html元素。

##2、HTMLCollection对象

HTMLCollection对象:通过document对象或Element对象调用getElementsByClassName()方法、getElementsByTagName()方法、children属性等返回的对象集。

NodeList对象:document对象调用getElementsByName()方法在Chrome和FireFox浏览器中返回的是NodeList对象,IE11返回的是HTMLCollection对象。

HTMLCollection与NodeList对象的区别:HTMLCollection对象用于元素操作,NodeList对象用于节点操作。

温馨提示:对于getElementsByClassName()方法、getElementsByTagName()方法和children属性返回的集合中可以将id和name自动转换为一个属性。

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>HTMLCollection对象</title>

</head>

<body>

    <li id="test" name="test">test</li>

    <script>

        var lis1 = document.getElementsByTagName('li'); // 获取标签名为li的对象集合

        var test = document.getElementById('test');           // 获取id为test的li元素对象

        lis1.test === test;                         // 比较结果:true

        var lis2 = document.getElementsByName('test');   // 获取name名为test的对象集合

        lis1.test === lis2[0];                         // 比较结果:true

    </script>

</body>

</html>

##3、元素内容

可以利用DOM提供的属性和方法来对获取的元素内容进行操作。

分类

名称

说明

属性

innerHTML

设置或返回元素开始和结束标签之间的HTML

innerText

设置或返回元素中去除所有标签的内容

textContent

设置或者返回指定节点的文本内容

方法

document.write()

向文档写入指定的内容

document.writeln()

向文档写入指定的内容后并换行

属性属于Element对象,方法属于document对象。

innerHTML在使用时会保持编写的格式以及标签样式。

innerText则是去掉所有格式以及标签的纯文本内容。

textContent属性在去掉标签后会保留文本格式。

温馨提示:innerText属性在使用时可能会出现浏览器兼容的问题。因此,推荐在开发时尽可能的使用innerHTML获取或设置元素的文本内容。同时,innerHTML属性和document.write()方法在设置内容时有一定的区别,前者作用于指定的元素,后者则是重构整个HTML文档页面。因此,读者在开发中要根据实际的需要选择合适的实现方式

##4、元素属性

在DOM中,为了方便JavaScript获取、修改和遍历指定HTML元素的相关属性,提供了操作的属性和方法。

分类

名称

说明

属性

attributes

返回一个元素的属性集合

方法

setAttribute(name, value)

设置或者改变指定属性的值

getAttribute(name)

返回指定元素的属性值

removeAttribute(name)

从元素中删除指定的属性

利用attributes属性可以获取一个HTML元素的所有属性,以及所有属性的个数length。

##5、元素样式

通过元素属性的操作修改样式。

元素样式语法:style.属性名称。

要求:需要去掉CSS样式名里的中横线“-”,并将第二个英文首字母大写。

举例:设置背景颜色的background-color,在style属性操作中,需要修改为backgroundColor。

名称

说明

background

设置或返回元素的背景属性

backgroundColor

设置或返回元素的背景色

display

设置或返回元素的显示类型

height

设置或返回元素的高度

left

设置或返回定位元素的左部位置

listStyleType

设置或返回列表项标记的类型

overflow

设置或返回如何处理呈现在元素框外面的内容

textAlign

设置或返回文本的水平对齐方式

textDecoration

设置或返回文本的修饰

textIndent

设置或返回文本第一行的缩进

transform

向元素应用2D或3D转换

    <div id="box"></div>

    <script>

        var ele = document.getElementById('box'); // 获取元素对象

        ele.style.width = '100px';

        ele.style.height = '100px';

        ele.style.backgroundColor = 'blue';

        ele.style.transform = 'rotate(7deg)';

    </script>

HTML5新增的classList(只读)元素的类选择器列表。

若一个div元素的class值为“box header navlist title”,如何删除header?

HTML5解决方案:div元素对象.classList.toggle("header");

classList属性还提供了许多其他相关操作的方法和属性。

分类

名称

说明

属性

length

可以获取元素类名的个数

方法

add()

可以给元素添加类名,一次只能添加一个

remove()

可以将元素的类名删除,一次只能删除一个

toggle()

切换元素的样式,若元素之前没有指定名称的样式则添加,如果有则移除

item()

根据接收的数字索引参数,获取元素的类名

contains

判断元素是否包含指定名称的样式,若包含则返回true,否则返回false

##6、标签栏切换效果

<!DOCTYPE html>

<html>



<head>

    <meta charset="UTF-8">

    <title>标签栏切换效果</title>

    <style>

        .tab-box {

            width: 383px;

            margin: 10px;

            border: 1px solid #ccc;

            border-top: 2px solid #206F96;

        }



        .tab-head {

            height: 31px;

        }



        .tab-head-div {

            width: 95px;

            height: 30px;

            float: left;

            border-bottom: 1px solid #ccc;

            border-right: 1px solid #ccc;

            background: #206F96;

            line-height: 30px;

            text-align: center;

            cursor: pointer;

            color: #fff;

        }



        .tab-head .current {

            background: #fff;

            border-bottom: 1px solid #fff;

            color: #000;

        }



        .tab-head-r {

            border-right: 0;

        }



        .tab-body-div {

            display: none;

            margin: 20px 10px;

        }



        .tab-body .current {

            display: block;

        }

    </style>

</head>



<body>

    <div class="tab-box">

        <div class="tab-head">

            <div class="tab-head-div current">标签一</div>

            <div class="tab-head-div">标签二</div>

            <div class="tab-head-div">标签三</div>

            <div class="tab-head-div tab-head-r">标签四</div>

        </div>

        <!--jkdjfk?-->

        <div class="tab-body">

            <div class="tab-body-div current"> 1 </div>

            <div class="tab-body-div"> 2 </div>

            <div class="tab-body-div"> 3 </div>

            <div class="tab-body-div"> 4 </div>

        </div>

    </div>

    <script>

        // 获取标签栏的所有标签元素对象

        var tabs = document.getElementsByClassName('tab-head-div');

        // 获取标签栏的所有内容对象

        var divs = document.getElementsByClassName('tab-body-div');

        for (var i = 0; i < tabs.length; ++i) { // 遍历标签部分的元素对象

            tabs[i].onmouseover = function () { // 为标签元素对象添加鼠标滑过事件

                for (var i = 0; i < divs.length; ++i) { // 遍历标签栏的内容元素对象

                    if (tabs[i] == this) { // 显示当前鼠标滑过的li元素

                        divs[i].classList.add('current');

                        tabs[i].classList.add('current');

                    } else { // 隐藏其他li元素

                        divs[i].classList.remove('current');

                        tabs[i].classList.remove('current');

                    }

                }

            };

        }

    </script>

</body>

</html>

#三、DOM节点操作

##1、获取节点

由于HTML文档可以看做是一个节点树,因此,可以利用操作节点的方式操作HTML中的元素。

属性

说明

firstChild

访问当前节点的首个子节点

lastChild

访问当前节点的最后一个子节点

nodeName

访问当前节点名称

nodeValue

访问当前节点的值

nextSibiling

返回同一树层级中指定节点之后紧跟的节点

previousSibling

返回同一树层级中指定节点的前一个节点

parentNode

访问当前元素节点的父节点

childNodes

访问当前元素节点的所有子节点的集合

childNodes属性与children属性的区别:

相同点:都可以获取某元素的子元素。

不同点: childNodes属性用于节点操作,返回值中还会包括文本节点等其他类型的节点,是一个NodeList对象的集合。 children属性用于元素操作,返回的是HTMLCollection对象的集合

此外,由于document对象继承自Node节点对象,因此document对象也可以进行以上的节点操作。

    <script>

        // 访问document节点的第1个子节点

        document.firstChild;        // 访问结果:<!DOCTYPE html>

        // 访问document节点的第2个子节点

        document.firstChild.nextSibling;    // 访问结果:<html>……</html>

    </script>

##2、节点追加

在获取元素的节点后,还可以利用DOM提供的方法实现节点的添加,如创建一个li元素节点,为li元素节点创建一个文本节点等。

方法

说明

document.createElement()

创建元素节点

document.createTextNode()

创建文本节点

document.createAttribute()

创建属性节点

appendChild()

在指定元素的子节点列表的末尾添加一个节点

insertBefore()

为当前节点增加一个子节点(插入到指定子节点之前)

getAttributeNode()

返回指定名称的属性节点

setAttributeNode()  

设置或者改变指定名称的属性节点

create系列的方法是由document对象提供的,与Node对象无关。

##3、节点删除

语法:removeChild()和removeAttributeNode()方法实现。

返回值:是被移出的元素节点或属性节点。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>删除和替换节点</title>

    <style>

        * {
            padding: 0;
            margin: 0;
            font-size: 12px;
        }

        ul,li {
            list-style: none;
        }

        li {
            float: left;
            text-align: center;
            width: 140px;
        }

    </style>

</head>

<body>

    <ul>
        <li id="yao">
            <img src="https://z4a.net/images/2022/07/21/_.th.jpg" id="first">
            <p><input type="button" value="删除我吧" onclick="yao()"></p>
        </li>
        <li id="fawn">
            <img src="https://z4a.net/images/2022/07/21/_.th.jpg" id="second">
            <p><input type="button" value="换换我吧" onclick="fawn()"></p>
        </li>
    </ul>

</body>


<script type="text/javascript">
    yao = function () {
        document.getElementById("yao").onclick = function () {
            this.parentNode.removeChild(this);
        }
    }

    fawn = function () {
        document.getElementById("fawn").onclick = function () {
            this.parentNode.removeChild(this);
        }
    }

</script>


</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值