DOM是什么(DOM的节点类型)

news2024/11/17 15:51:36

      学到DOM时,看到关于文档(结构树)、节点(node)、和DOM提供的一些方法获取(找到)所需的节点、还有DOM属性,我很混乱,我无法弄清节点的关系层级属性和方法的关系,所以在使用DOM之前我要先了解DOM,当我们用javascript对HTML DOM进行操作的时候我们要明确HTML DOM中节点类型和层级才能准确定找到你想要增删改查的位置。

目录

1.DOM是什么?是干啥的?

2.带你了解DOM

3.DOM的属性

4.参考资料


1.DOM是什么?是干啥的?

DOM,文档对象模型(Document Object Model)。DOM是 W3C(万维网联盟)的标准,DOM定义了访问HTML和XML文档的标准。在W3C的标准中,DOM是独于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。

其实上面的摘抄看完也是一脸懵逼;

2.带你了解DOM

① 网页形成

  • html为我们搭建结构使你的网页有了内容
  • css来定义网页的样式,做装修让你的网页更漂亮
  • JavaScript赋予了页面的行为,交互动效让你可以和网页互动

这才是完整的网页


② javascript究竟通过什么来实现这些交互呢?????

有一个ECMAScript标准,基于这个标准我们可以编写程序(例如js)让浏览器来解析,在编写程序时,浏览器为我们提供了一个BOM对象(即browser object model)用来操作浏览器窗口、浏览器导航对象(navigator)、屏幕分辨率(screen)、浏览器历史(history)、cookie等等。
但这个通过BOM来实现的交互远远不够。要实现页面的动态交互和效果,操作html才是核心。

③ 那如何操作html呢?


是htmlDOM,这时候浏览器给我们提供了DOM,DOM给我们提供了用程序(例如js)来动态控制html的接口(方法)这就是传说中的API

DOM是针对xml经过扩展用于html的应用程序编程接口,我们又叫API

当浏览器打开网页时候,DOM把整个html页面绘制为一个多层的节点结构,html页面中的每个组成部分都是某种类型的节点,这些节点又包含着不同类型的数据。(节点(node)和数据)
然后javascript通过一些方法(例如下面会讲到)根据htmlDOM树对里面的节点(节点类型下面会介绍)进行增删改查

④ 这是w3school提供的HTML DOM 树图片:(图1)

⑤ 举个例子
下面是一个网页html(代码1)

<!DOCTYPE html>  
<html lang="en">  
    <head>  
        <meta charset="UTF-8">  
        <title>DocumentFragment文档片段节点</title>  
    </head>  
    <body> 
        <!-- tip区域 -->
        <div id="tip">test1</div> 
        <ul class="list-node">
            <li>test2<li>
        </ul>  
        <script>  
            var frag = document.createDocumentFragment();  
            for (var i = 0; i < 10; i++) {  
                var li = document.createElement("li");  
                li.innerHTML = "List item" + i;  
                frag.appendChild(li);  
            }  
            document.getElementById("list-node").appendChild(frag);  
        </script>  
    </body>  
</html>

转换成DOM树后:(图2)

(图2)中每一个元素都是一个节点,可以看到有很多类型不同的节点。

HTML DOM 节点是由多种类型的节点组合而成,所以当我们用javascript对HTML DOM进行操作的时候我们要明确HTML DOM中节点类型和层级才能准确定找到你想要增删改查的位置。

⑥ 节点类型

  • 节点有12种类型。

下面是html DOM中常出现的类型:

类型数值常量字符常量
Element(元素节点)1ELEMENT_NODE
Attr(属性节点)1ATTRIBUTE_NODE
Text(文本节点)1TEXT_NODE
Comment(注释节点)1COMMENT_NODE
Document(文档节点)1DOCUMENT_NODE
DocumentType(文档类型节点)1DOCUMENT_TYPE_NODE
DocumentFragment(文档片段节点)1DOCUMENT_FRAGMENT_NODE

当使用.nodeType所的到的值就是表格中的数值常量和字符常量;可以用.nodeType(后面详解)节点类型。

此时我们知道了DOM的常用节点类型,当我们编写js代码的时候可以通过DOM提供的API(方法)对htmlDOM进行增删改查(本文不写方法的具体使用);

3.DOM的属性

每个节点都有nodeType(节点类型)、nodeName(节点名称)、nodeValue(节点值)属性(还有其他的常用属性这里不讲),我们可以通过xxx.nodeType xxx.nodeName xxx.nodeValue获得(xxx代表通过DOM提供的方法获取的node)

① nodeType

通过某个节点的nodeType属性来获得节点类型,节点的类型可以是数值常量或者字符常量

看代码(代码2):

<!DOCTYPE html>  
<html>  
    <head lang="en">  
        <meta charset="UTF-8">  
        <title>nodeType</title>  
    </head>  
    <body>  
        <div id="container">这是一个元素节点</div>  
        <script>  
            var divNode = document.getElementById('container');  
            /*
            if (Node.ELEMENT_NODE || divNode.nodeType === 1) {  
                alert("Node is an element.");  
            }//通过.nodeType获取的值和节点类型的字符常量比较判断获
            取的节点是什么类型 
            但是
            IE中只支持数值常量,因为低版本IE浏览器没有内置Node对象,
            其他浏览器数值常量和字符常量都支持,因此可以直接用数值
            常量判断。  
            */  
            if (divNode.nodeType == Node.ELEMENT_NODE || divNode.nodeType === 1) {  
                alert("Node is an element.");  
            }//通过.nodeType获取的值和节点类型的数值常量比较判断获取的节点是什么类型    
        </script>  
    </body>  
</html>

② nodeNamenodeValue

先代码(代码3):

<!DOCTYPE html>  
    <html>  
        <head lang="en">  
            <meta charset="UTF-8">  
            <title>nodeName,nodeValue</title>  
    </head>  
    <body>  
        <!--nodeName,nodeValue实验哈哈哈-->  
        <div id="container">这是一个元素节点</div>  
        <script>  
            var divNode = document.getElementById('container');  
            console.log(divNode.nodeName + "/" + divNode.nodeValue);     
            //结果:    DIV / null  

            var attrNode = divNode.attributes[0];  
            console.log(attrNode.nodeName + "/" + attrNode.nodeValue);      
            //结果:   id / container  

            var textNode = divNode.childNodes[0];  
            console.log(textNode.nodeName + "/" + textNode.nodeValue);      
            //结果:   #text / 这是一个元素节点  

            var commentNode = document.body.childNodes[1];  
            //表示取第二个注释节点,因为body下面的第一个注释节点为空白符。  
            console.log(commentNode.nodeName + "/" +commentNode.nodeValue);  
            //结果:  #comment / nodeName,nodeValue实验哈哈哈  

            console.log(document.doctype.nodeName + "/" + document.doctype.nodeValue);   
            //结果: html/null  

            var frag = document.createDocumentFragment();  
            console.log(frag.nodeName + "/" + frag.nodeValue);    
            //结果: #document-fragment / null  
        </script>  
    </body>  
</html>

根据实验,得出下表格(以上面的代码为例):

节点类型nodeNamenodeValue
Element(元素节点)元素标签名称如:divnull
Attr(属性节点)属性名称如:id属性值如:container
Text(文本节点)#text节点中包含的文本内容
Comment(注释节点)#comment注释中的内容
DocumentType(文档类型节点)doctype的名称(html)null
DocumentFragment(文档片段节点)#document_fragmentnull

代码3中就用到了几个常用方法

  • .getElementById通过id获取节点
  • .attributes获取html标签(元素节点)的属性(也就是属性节点)可以看出属性节点是元素节点的一部分并不是父子关系

4.参考资料

简书-微醺岁月的《深入浅出DOM基础—DOM探索之基础详解篇》
视频-讲的挺详细老师逻辑很清晰
书籍-《JavaScript DOM编程艺术》(第2版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL常用语句总结

一&#xff0c;简介 1.1 数据库是用来存放数据的&#xff0c;对数据库的操作需要用到SQL语句 1.2 数据库种类有也非常多&#xff1a; 关系型数据库&#xff1a; Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite 非关系型数据库&#xff1a; NoSql、Cl…

Vue Cli 之 环境变量和模式

一、环境变量 ​ 我们在使用 Vue-cli 创建的Vue项目中&#xff0c;可以在构建和运行时为项目设置环境变量&#xff0c;这些环境变量会根据环境&#xff08;模式&#xff09;的不同&#xff0c;而自动注入到项目中&#xff0c;也就是说我们可以根据环境不同&#xff0c;设置不同…

二进制单节点搭建 Kubernetes v1.20

目录 第一章.操作系统初始化配置 1.1.安装环境部署 1.2.部署 docker引擎 第二章.部署 etcd 集群 2.1.ETCD简述 2.2.准备签发证书环境 在 master01 节点上操作 2.3. 生成Etcd证书​​​​​​​ 2.4.在 node01 节点上操作 在 node02 节点上操作 2.5.部署 Master 组件…

SpringBoot ( 四 ) 接值

2.5.接值 通过方法的参数来接收请求传来值 请求时传值的方式有三种方式 : URL?namevalueform表单Ajax 异步传值 接收传来的值有三类 : 单一值对象数组 2.5.0.传值 2.5.0.1.URL?传值 URL?标识1值1&标识2值2 URL后面使用 ? 连接参数, 每组参数使用 连接标识与值, 多…

10.过滤器

过滤器是做文本格式化的&#xff0c;只能用在 插值表达式 与 v-bind 上&#xff0c;在vue3中已经被弃用了&#xff0c;这里我简单记录一下并写一下在vue3的替代方法 目录 1 基本使用 1.1 vue2中的写法 1.2 vue3的替代 2 私有过滤器与全局过滤器 2.1 vue2的写法 2.2…

shell脚本----数组

文章目录 一、数组定义的方法二、数组的操作2.1 数组的输出2.2 删除数组2.3 数组切片2.4 数组的替换2.5 判断数组中是否有空值2.6 追加函数2.7 向函数传入参数 一、数组定义的方法 数组定义的规则 数组中的每个元素分分隔符一定为空格隔开每个元素都拥有与其对应的下标&#…

Kubesphere流水线实现蓝绿发布

Kubesphere流水线实现蓝绿发布 1. Gitlab仓库准备 1.1 创建仓库 新建空白项目,名字随便取 greenweb复制克隆地址 http://192.168.31.199/deploy/greenweb.git1.2 初始化并上传代码 克隆并初始化代码仓库 mkdir git cd git git clone http://192.168.31.199/deploy/green…

AIMD 为什么收敛(tcp reno/cubic 为什么好)

TCP 拥塞控制目标是缓解并解除网络拥塞&#xff0c;让所有流量公平共享带宽&#xff0c;合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子&#xff0c;包括 RoCE&#xff0c;BBRv2) 为什么收敛&#xff1f;我一般会给出下面的老图&#xff1a;…

1区(TOP)极速送审,5月SCI/SSCI/EI刊源表已更新,

2023年5月SCI/SSCI/EI期刊目录更新 5月我处新增多本1-2区高分区新刊&#xff0c;包括计算机、医学、环境、化学、材料、生物、工程、社科领域&#xff0c;新刊版面极速送审~ 以下是本月重点期刊推荐&#xff0c;可作参考&#xff1a; 计算机类新刊&#xff1a; 1区计算机科…

钓鱼邮件演练项目实战

1、 使用 setoolkit 克隆站点 Setoolkit 是一个万能的社工工具(社会工程学工具集合) ┌──(root Cwillchris)-[~] └─# setoolkit 翻译成中文: 从菜单中选择: 1)社会工程攻击 2)渗透测试(快速通道) 3)第三方模块 4)更新社会工程师工具包 5)更新 SET 配置…

使用 spring 的 IoC 的实现账户的CRUD(2)双层实现+注解开发

在http://t.csdn.cn/yucl4的基础上进行注解开发 【分析】 xml文件其中spring容器中的bean,因此通过注解把这些放到容器中即可 component:相当xml中的bean的id: 如果不指定 value 属性&#xff0c;默认 bean 的 id 是当前类的类名, 首字母小写。 Controller Service Reposito…

计算机毕业论文选题推荐|软件工程|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)门窗账务管理系…

C++——类和对象(6)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月10日 内容&#xff1a;C类和对象内容讲解 目录 前言&#xff1a; 1.取地址操作符重载&#xff1a; 2.构造函数&#xff08;进阶&#xff09;&#xff1a; 1.初始化列表&#xff1a; 2.static成员&#xff1a; 结尾…

数据可视化工具 - ECharts饼形图的编写

1 饼形图 1年龄分布模块制作 1.1 官网找到类似实例&#xff0c; 适当分析&#xff0c;并且引入到HTML页面中 <!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件…

Android WebRTC+SRS/ZLM视频通话(4):Android使用WebRTC推流SRS/ZLMediaKit

Android WebRTCSRS/ZLM视频通话&#xff08;4&#xff09;&#xff1a;Android使用WebRTC推流SRS/ZLMediaKit 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来记录Android是如何使用WebRTC往SRS或ZLMediaKit进行推流。想要在Android设备上实现高质量的实时流媒体推送…

VirtualBox+Vagrant

1.下载VirtualBox 1.下载 VirtualBox官网下载 下载过程无特别注意事项&#xff0c;注意调整到非 C 盘位置即可&#xff0c;其他部分皆为默认设置 2.修改虚拟电脑存储位置 1.将C:\Users\用户名下的VirtualBox VMs文件夹复制到自定义目标文件夹中 2.打开VirtualBox,在全局设置…

嵌入式TCP/IP协议栈-LwIP

文章目录 LWIP是什么基础知识OSI七层模型TCP/IP五层模型LwIP的模型常见协议ARP协议ICMP协议DHCP协议DNS协议 LwIP APISocket大端模式与小端模式地址字节序IP地址转换 网络并发 LWIP是什么 LWIP是一个轻量级的TCP/IP协议栈&#xff0c;其全称为Lightweight IP&#xff0c;它专门…

UNIX网络编程卷一 学习笔记 第十二章 IPv4与IPv6的互操作性

未来数年内&#xff0c;因特网也许会逐渐从IPv4过渡到IPv6&#xff0c;在过渡阶段&#xff0c;基于IPv4的现有应用能与基于IPv6的全新应用协同工作非常重要。例如&#xff0c;厂商不应只提供仅能与IPv6 telnet服务器程序协同工作的telnet客户程序&#xff0c;而应该提供既能与I…

环境搭建:Visual Studio的安装和创建C++项目

Visual Studio的安装和创建C项目 引言前言下载Visual Studio安装包安装Visual Studio创建项目小结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有难学的技术。 &#x1f449; &#x1f396;️ C…

第五十章 Unity Input Manager 输入系统(上)

Unity的输入系统支持多种输入设备&#xff0c;比如键盘和鼠标&#xff0c;游戏手柄&#xff0c;触摸屏&#xff0c;VR和AR控制器等等。Unity 通过两个独立的系统提供输入支持&#xff1a;第一&#xff0c;输入管理器 (Input Manager) 是 Unity 核心平台的一部分&#xff0c;默认…