DOM(一)概述、dom树、查找元素

article/2025/10/31 22:51:09

目录

一、DOM 概述

二、DOM树

二、查找元素

1. 无需查找的元素

2. 按节点间关系查找

3. 按 HTML 特征查找

三、案例:通过DOM实现购物车效果


一、DOM 概述

        DOM全称 Document Object Model,是专门操作网页内容的一套对象和函数的总称。由于 ES 标准中只规定了 js 语言的核心语法,并没有规定如何使用 js 操作网页的内容,所以在今后只要想操作网页中的内容时,就必须用 DOM。

        DOM 标准是由 W3C 制定的国际标准,由 W3C 负责制定并维护,且几乎所有浏览器100%兼容。包括:增、删、改、查、事件绑定

对比DOM与其他框架:

        原生DOM,万能,但很繁琐;

        jQuery函数库,简单,但没有减少步骤;

        Vue框架;自动化,简化步骤,但有兼容性问题。

二、DOM树

        一个网页的所有内容,在浏览器内存中,都是以树形结构保存的,树形结构是最直观的展现上下级包含关系的结构。而网页内容中的元素结构,也是上下级包含关系。      

        浏览器读取到一个网页的内容,都会先在内存中创建一个唯一的树根节点对象: document;浏览器扫描网页内容,每扫描到一项内容(元素、文本、属性...),就会自动创建一个新的节点对象(Node),保存当前这一项内容的属性和值。然后将新创建的节点对象,保存到DOM树上对应的位置。

        树形结构如下图:

二、查找元素

1. 无需查找的元素

        不需要查找,就可直接获得的元素/对象有 4个;

(1)根节点对象:document

(2)html元素节点对象:document.documentElement

(3)head元素节点对象:document.head

(4)body元素节点对象:document.body

举例如下:

<body><span id="s1">Hello</span><h1>标题一</h1><script>//console.log 输出的不是对象存储结构,而是DOM树结构(节点间关系)console.log(document);console.log(document.documentElement);console.log(document.head);console.log(document.body);//console.dir 输出一个节点对象在内存中的属性结构console.dir(document);console.dir(document.documentElement);console.dir(document.head);console.dir(document.body);</script>
</body>

打印效果如下:

2. 按节点间关系查找

        按照元素在 DOM 树中的上下级或平级关系查找其它元素;如果已经获得一个 DOM 元素对象,想找这个 DOM 元素对象周围附近的元素时,才用节点间关系。分为节点树和元素树两种:

节点树(包含所有网页内容的完整树结构)

父子关系

获得一个节点对象的父级节点对象节点对象.parentNode
获得一个节点对象下的所有直接子节点对象的集合节点对象.childNodes
获得一个节点对象下的第一个直接子节点对象节点对象.firstChild
获得一个节点对象下的最后一个直接子节点对象节点对象.lastChild
兄弟关系

获得一个节点对象相邻的前一个兄弟节点对象

节点对象.previousSibling
获得一个节点对象相邻的下一个兄弟节点对象节点对象.nextSibling

        节点树会将看不见的回车、空格等空字符也创建为节点对象。严重干扰我们的查找结果!所以,今后几乎不用节点树。

元素树(仅包含元素节点的树形结构)

父子关系

获得一个元素对象的父级元素对象

元素对象.parentElement  —— 返回一个元素对象
获得一个元素对象下的所有直接子元素对象的集合元素对象.children  —— 返回类数组对象
获得一个元素对象下的第一个直接子元素对象元素对象.firstElementChild —— 返回一个元素对象
获得一个元素对象下的最后一个直接子元素对象元素对象.lastElementChild —— 返回一个元素对象
兄弟关系

获得一个元素对象相邻的前一个兄弟元素对象

元素对象.previousElementSibling
获得一个元素对象相邻的下一个兄弟元素对象元素对象.nextElementSibling

        元素树避免了节点树的缺点,不会受到看不见的空字符的干扰,所以将来只要按节点间关系查找元素时,都用元素树。举例:

<body><span id="s1">Hello</span><h1>标题一</h1><script>//获得body的第一个直接子元素spanvar span = document.body.firstElementChild;console.log(span);//获得span的下一个兄弟h1var h1 = span.nextElementSibling;console.log(h1);//获得body下所有直接子元素的集合:3个元素var ele = document.body.children;console.log(ele);</script>
</body>

打印结果如下:
 

3. 按 HTML 特征查找

(1)按 id 名查找一个元素

var 一个元素对象 = document.getElementById("id名");

        意为在整个页面中通过 id 名来查找元素;如果找到符合要求的元素,则只返回一个元素对象,如果没找到,则返回 null。

注意:

        前的主语必须是 document;

        因为只找一个元素,所以函数名中 Element 没有 s 结尾,是单数形式。

(2)按标签名查找多个元素

var 类数组对象 = 任意父元素.getElementsByTagName("标签名");

        在指定父元素范围内通过标签名获取多个元素;如果找到符合要求的元素,就返回类数组对象如果没找到,返回空类数组对象: { length:0 }。

注意:

        因为找到多个元素,所以返回值为类数组对象;

        最好指定只在一个父元素范围内查找符合要求的元素,查找范围越小,查找越快;

        因为找到多个元素,所以函数名中的 Elements以s 结尾,表示复数;

        不仅查找直接子元素,而且会在所有后代元素中查找符合要求的元素;

        如果这个函数规定要返回类数组对象,那么在任何时候,都会返回类数组对象!即使只找到一个元素,也会把这唯一的一个元素放在类数组对象中第一个位置返回。所以,如果只找到一个符合要求的元素时,必须用[0],取出类数组对象中第一个位置保存的元素对象,才能对这个元素对象继续执行后续操作。

(3)按 class 名查找多个元素

var 类数组对象 = 任意父元素.getElementsByClassName("class名");

        在指定父元素范围内通过 class 名获取多个元素;如果找到符合要求的元素,就返回类数组对象,如果没找到,返回空类数组对象: {length:0 }。

注意:

        因为找到多个元素,所以返回值为类数组对象

        最好指定只在一个父元素范围内查找符合要求的元素。——优化,查找范围越小,查找越快!

        因为找到多个元素,所以函数名中的Elements以s结尾,表示复数

        不仅查找直接子元素,而且会在所有后代元素中查找符合要求的元素。

        如果这个函数规定要返回类数组对象,那么在任何时候,都会返回类数组对象!即使只找到一个元素,也会把这唯一的一个元素放在类数组对象中第一个位置返回。所以,如果只找到一个符合要求的元素时,必须用[0],取出类数组对象中第一个位置保存的元素对象,才能对这个元素对象继续执行后续操作!

(4)按 name 名查找多个表单元素

var 类数组对象 = document.getElementsByName("name名");

         在整个页面范围内通过 name 名获取多个元素;如果找到符合要求的元素,就返回类数组对象如果没找到,返回空类数组对象: {length:0}。

注意:

        .前必须是document,不能改为其它任意元素

        因为可能找到多个,所以也返回类数组对象

        因为可能找到多个,函数名中的Elements也是s结尾,表示复数

        如果这个函数规定要返回类数组对象,那么在任何时候,都会返回类数组对象!即使只找到一个元素,也会把这唯一的一个元素放在类数组对象中第一个位置返回。所以,如果只找到一个符合要求的元素时,必须用[0],取出类数组对象中第一个位置保存的元素对象,才能对这个元素对象继续执行后续操作!

举例:查找指定的元素,并修改元素的样式;

<script>//查找id为nav的一个ul元素var ulNav = document.getElementById("nav");console.log(ulNav);//在id为nav的ul下查找所有livar lis = ulNav.getElementsByTagName("li");console.log(lis);//在id为nav的ul下查找trvar trs = ulNav.getElementsByTagName("tr");console.log(trs);//在body下查找span元素,并将第一个设置为黄色var span = document.body.getElementsByTagName("span")[0];console.log(span);span.style.color = "yellow";//查找id为nav的ul下的所有class为item的元素,并设置边框var items = ulNav.getElementsByClassName("item");// 对查找到的多个元素统一设置时要先遍历for (var item of items) {item.style.border = "2px solid blue";}//查找id为nav的ul下的class为active的一个li,修改其字体颜色为红色,背景色为粉色var li = ulNav.getElementsByClassName("active")[0];li.style.color = "red";li.style.backgroundColor = "pink";//查找name为sex的两个单选框并添加阴影var radios = document.getElementsByName("sex");for (var rad of radios) {rad.style.boxShadow = "0 0 10px black";}//查找一个name为uname的元素,为其添加阴影效果var xm = document.getElementsByName("uname")[0];xm.style.boxShadow = "0 0 5px red";</script>

显示结果如下:

4. CSS 选择器查找

(1)只查找一个符合要求的元素

var 一个元素对象 = 任意父元素.querySelector("选择器");

(2)查找多个符合要求的元素

var 类数组对象 = 任意父元素.querySelectorAll("选择器");

DOM四步:

        1. 查找触发事件的元素

        2. 绑定事件处理函数

        3. 查找要修改的元素

        4. 修改元素<(1)先取出旧值(2)做计算(3)放回元素中>


三、案例:通过DOM实现购物车效果

HTML、CSS结构如下

<table id="data"><thead><tr><th>商品名称</th><th>单价</th><th>数量</th><th>小计</th></tr></thead><tbody><tr><td>iPhone6</td><td>¥4488.00</td><td><button>-</button><span>1</span><button>+</button></td><td>¥4488.00</td></tr><tr><td>iPhone6 plus</td><td>¥5288.00</td><td><button>-</button><span>1</span><button>+</button></td><td>¥5288.00</td></tr><tr><td>iPad Air 2</td><td>¥4288.00</td><td><button>-</button><span>1</span><button>+</button></td><td>¥4288.00</td></tr></tbody><tfoot><tr><td colspan="3">Total: </td><td>¥14064.00</td></tr></tfoot></table>

table {width: 600px;text-align: center;border-collapse: collapse;
}td,
th {border: 1px solid black
}td[colspan="3"] {text-align: right;
}

页面结构如图 

 页面显示效果如图


需要通过DOM实现3个功能:

        功能1:点击按钮时商品数量变化;

        功能2:数量变化时小计自动计算;

        功能3:自动计算总价。

<script>// DOM四步// 1.查找所有需要绑定事件的元素,本案例为table中的button// 先找tablevar table = document.getElementById("data");// 再找buttonvar btns = table.getElementsByTagName("button");// 2.绑定单击事件处理函数// 由于本案例中所有的button都需要绑定事件 ,所以需要先将它们遍历出来for (var btn of btns) {btn.onclick = function () {// 功能1:点击按钮时商品数量变化// 3.查找需要修改的元素// 需要修改的是span标签中的内容,span是按钮的父级的第二个子级var span = this.parentElement.children[1];// 4.修改元素// 4.1获取span中的旧内容并转为整数var n = parseInt(span.innerHTML);// 4.2修改需要修改的元素// 判断:如果按钮中的内容为+(也就是点击按钮+)时,n+1;否则反之,但n最小为1if (this.innerHTML == "+") {n++;} else if (n > 1) {n--;}// 4.3最后将新的n值再赋给旧的spanspan.innerHTML = n;// 功能2:数量变化时小计自动计算// 3.查找需要修改的元素// 需要修改的为button父级的下一个兄弟元素tdvar tdSub = this.parentElement.nextElementSibling;// 4.修改元素// 4.1获取button的父级的上一兄弟的内容(单价)并去掉人民币符号var price = parseFloat(this.parentElement.previousElementSibling.innerHTML.slice(1));// 4.2计算小计var sub = price * n;// 4.3再将小计内容放回下一兄弟td(小计)tdSub.innerHTML = (`¥${sub.toFixed(2)}`);// 功能3:计算总价// 3.查找需要修改的元素// 需要的修改的为tfoot下tr的最后一个td(总价)var totalTd = table.querySelector("tfoot td:last-child");// 4.修改元素// 4.1获取所有行中的最后一个td的内容(小计)var tds = table.querySelectorAll("table td:last-child");// 4.2遍历找到的每个td,并进行计算var total = 0;for (var td of tds) {total += parseFloat(td.innerHTML.slice(1));}// 4.3将总计total保留两位小数放入总计td中totalTd.innerHTML = (`¥${total.toFixed(2)}`);}}
</script>

案例效果如下

 单击添加按钮后,小计和总计都会做出相应计算:


http://chatgpt.dhexx.cn/article/fZ0TQpa4.shtml

相关文章

DOM深入学习 --- DOM 树介绍,如何遍历 DOM 树节点(一)

DOM 树 HTML 文档的主干是标签&#xff08;tag&#xff09;。 根据文档对象模型&#xff08;DOM&#xff09;&#xff0c;每个 HTML 标签都是一个对象。嵌套的标签是闭合标签的“子标签&#xff08;children&#xff09;”。标签内的文本也是一个对象。 所有这些对象都可以通…

什么是DOM?你了解DOM树吗?

在找工作的过程中&#xff0c;看到了招聘信息上有写这么一条信息&#xff1a; 掌握WEB前端开发技术&#xff1a;JavaScript(含ES6)、HTML、CSS、DOM等 看见这条信息我心里安心了不少&#xff0c;都是一些基础问题&#xff0c;但是乍一看DOM&#xff0c;脑子有点短路了&#x…

Windows命令:CHCP

CHCP 用途一&#xff1a;Windows操作系统默认编码格式是GBK&#xff08;963&#xff09;&#xff0c;cmd窗口编码方式设置为UTF-8方法&#xff1a; 临时修改方案&#xff1a;CHCP 65001永久修改方案&#xff1a;参考资料&#xff1a;https://jingyan.baidu.com/article/d71306…

查看windows操作系统的默认编码(字符集)-chcp

在windows cmd 模式下&#xff0c;输入命令 &#xff1a; chcp 如上图&#xff0c;我的活动代码页为936&#xff0c;意思是"中国-简体中文(GB2312)" 说明&#xff1a;代码页是“字符集编码”的别名&#xff0c;也有人称为“内码表”。 下表列出了所有支持的代码页…

解决‘chcp’不是内部或外部命令,也不是可运行的程序或批处理文件

解决方法&#xff1a; 此电脑\系统属性\高级系统设置\环境变量 在系统变量点击path&#xff0c;变量值改为Anacondad的安装路径加 &#xff1b;C:\Windows\System32 即可解决注意添加; 有什么问题可私信我 附图&#xff1a;

meterpreter里面cmd乱码解决方法chcp 65001

当我们使用meterpreter反弹shell后使用是乱码时 可以采用如下命令解决 chcp 65501 chcp是一个计算机指令&#xff0c;能够显示或设置活动代码页编号。 65001 UTF-8代码页 950 繁体中文 936 简体中文默认的GBK 437 MS-DOS美国英语

win10 命令行工具cmd乱码解决方案及cmd非常用命令chcp介绍

问题发生前景&#xff1a; 在使用好压压缩命令批量添加压缩文件的时候产生&#xff0c;中文路径或者文件名中文都是乱码&#xff0c;一堆问号。后来查了一些资料&#xff0c;发现命令行工具能够设置编码格式。具体操作如下&#xff1a; 在cmd或者powershell中执行命令 chcp …

msf拿到shell显示乱码解决方法以及chcp各种编码的补充

文章目录 前言 前言 msf拿到shell之后输入命令经常会有乱码&#xff0c;只需要一条命令就能解决。 chcp 65001 chcp 65001 的意思是 &#xff1a;改变当前活动代码页为 UTF-8&#xff0c;让当前的批处理窗口支持 UTF-8 格式的文件。 改变当前 cmd 窗体的活动代码页&#xff0…

【cmd】windows 控制台cmd乱码的解决办法 chcp 65001

本机的系统环境&#xff1a; OS Name: Microsoft Windows 10企业版 OSVersion: 10.0.14393 N/A Build 14393 有时在cmd中输出的中文乱码 解决办法如下&#xff1a; 在cmd中输入CHCP 65001 按Enter键 然后查看不再乱码 注&#xff1a;CHCP是一个计算机指令&#xff0c;能够…

解决CMD编码格式CHCP65001 UTF-8导致Robotframework运行用例失败

运行环境 WIN10系统 Robot Framework 6.0.2 (Python 3.7.9 on win32) 安装命令 // 通过pip安装robotframeworkpip install robotframework pip install robotframework-ride python -m robotide.__init__ 运行demo测试用例 写了一个最简单的测试用例&#xff0c;结果运行…

windows控制台命令窗口中文乱码chcp 65001

1.打开CMD.exe命令行窗口&#xff0c;默认情况下&#xff0c;编码为936&#xff08;简体中文 GBK编码&#xff09;。 2.通过chcp命令改变代码页&#xff0c;chcp 65001。(65001为UTF-8的代码页) 修改以前的编码936&#xff0c;该编码只能显示GBK编码的中文&#xff1a; 修改后…

用CHCP命令切换CMD中英文帮助

如果你想查看CMD某个命令帮助说明&#xff0c;结果显示为英文&#xff0c;英文不好看起来又很累。那么chcp 命令可以帮你切换字符格式 命令介绍&#xff1a; CHCP [nnn]nnn 指定代码页编号。不带参数键入 CHCP 以显示活动代码页编号。常用代码 代码语言65001UTF-8936中文G…

【求助】Executing transaction: | menuinst ExceptionTraceback (most recent call last): File “C:\Program

本人用anaconda的prompt更新东西时&#xff0c;系统给出以下提示&#xff1a; Executing transaction: | menuinst Exception Traceback (most recent call last): File "C:\ProgramData\Anaconda3\lib\site-packages\conda\gateways\disk\create.py", line 246, …

chcp编码大全

字符集 *号标记的是cmd中包含的字符集&#xff0c;其它的不能使用 查看当前字符集&#xff1a;chcp 执行下面的命令可以修改cmd窗口的字符集&#xff0c;例如&#xff1a;修改为utf-8 chcp 65001 注意&#xff1a;win10系统上面这种修改方式不是永久有效的 CodePageidentifi…

DOS命令:chcp

chcp是命令提示符中的一个可执行命令&#xff0c;在命令提示符中运行&#xff0c;可以返回活动代码页的编码&#xff0c;还可以设置当前的活动代码页。 chcp /? ---查看官方帮助文档对CHCP的解释说明 1、在命令提示符中输入chcp命令&#xff0c;显示当前活动代码页编码&#…

网页脚本编程学习笔记

网页脚本编程学习笔记 1、配置 此处以火狐浏览器为例&#xff1a; 1&#xff09;、 打开web控制台&#xff0c;调出查看器&#xff08;用于查看该网页的HTML源代码&#xff09;、控制台&#xff08;编写控制代码&#xff0c;可以实时操作&#xff0c;显示运行结果、报错&am…

在网页中运行自己编写的JS脚本的两种方式

一、F12打开调试工具&#xff0c;利用控制台运行JS脚本 输入javascript:加上JS代码回车执行脚本 二、通过浏览器收藏夹运行JS脚本 以谷歌浏览器为例&#xff0c;新建收藏夹&#xff0c;网址处填写JS代码&#xff0c;添加收藏以后&#xff0c;点击图标即可执行

超强脚本网站-让你的浏览器拥有灵魂

点击此处直达&#xff1a; Greasy Fork - 安全、实用的用户脚本大全https://greasyfork.org/zh-CN

Lesson01: 网页脚本语言

文章目录 一、JavaScript的思维导图二、下载开发工具三、JavaScript的引入方式&#xff08;通过标签script进行引入&#xff09;1.内嵌式2.外链式3.行内式 四、注释1.单行注释2.多行注释 五、鼠标的移入移出1.鼠标的移入2.鼠标的移出3.鼠标移入移出改变背景颜色的实训案例 六、…

教你写个网页自动签到脚本

Tips:要求有js基础&#xff0c;最起码要敲过代码&#xff0c;hello world不算。。 1.搜寻受害者 就选这个了&#xff0c; 2.准备阶段 首先打开浏览器的控制台&#xff0c;按F12&#xff0c;选中网络&#xff0c;选中保留日志&#xff0c;就一直开着控制台&#xff0c;不要…