JavaScript知识点DOM 模型详细讲解

news2025/1/9 1:08:18

DOM 模型

DOM 全称是 Document Object Model 文档对象模型

大白话,就是把文档中的标签,属性,文本,转换成为对象来管理。

Document 对象

在这里插入图片描述

Document对象的理解:

​ 第一点:Document 它管理了所有的 HTML 文档内容。

​ 第二点:document 它是一种树结构的文档。有层级关系。

​ 第三点:它让我们把所有的标签 都 对象化

​ 第四点:我们可以通过 document 访问所有的标签对象。

请问什么是对象化?

举例: 有一个人有年龄:18 岁,性别:女,名字:张某某 我们要把这个人的信息对象化怎么办!

Class Person {

​ private int age;

​ private String sex;

​ private String name;

}

那么 html 标签 要 对象化 怎么办?

在这里插入图片描述

模拟对象化,相当于:

class Dom{

private String id; // id 属性

private String tagName; //表示标签名

private Dom parentNode; //父亲

private List children; // 孩子结点

private String innerHTML; // 起始标签和结束标签中间的内容

}

Document 对象中的方法介绍

document.getElementById(elementId)

通过标签的 id 属性查找标签 dom 对象,elementId 是标签的 id 属性值

document.getElementsByName(elementName)

通过标签的 name 属性查找标签 dom 对象,elementName 标签的 name 属性值

document.getElementsByTagName(tagname)

通过标签名查找标签 dom 对象。tagname 是标签名

document.createElement( tagName)

方法,通过给定的标签名,创建一个标签对象。tagName 是要创建的标签名

注:

  1. document 对象的三个查询方法 如果有 id 属性优先使用 getElementById 方法来进行查询
  2. 如果没有 id 属性,则优先使用 getElementsByName 方法来进行查询
  3. 如果 id 属性和 name 属性都没有最后再按标签名查 getElementsByTagName

以上三个方法,一定要在页面加载完成之后执行,才能查询到标签对象。


getElementById 方法示例代码:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        /*
        * 需求:当用户点击了较验按钮,要获取输出框中的内容。然后验证其是否合法。<br/>
        * 验证的规则是:必须由字母,数字。下划线组成。并且长度是 5 到 12 位。
        * */
        function onclickFun() {
            // 1 当我们要操作一个标签的时候,一定要先获取这个标签对象。
            var usernameObj = document.getElementById("username");
            // [object HTMLInputElement] 它就是 dom 对象
            var usernameText = usernameObj.value;
            // 如何 验证 字符串,符合某个规则 ,需要使用正则表达式技术
            var patt = /^\w{5,12}$/;
            /*
            * test()方法用于测试某个字符串,是不是匹配我的规则 ,
            * 匹配就返回 true。不匹配就返回 false.
            * */
            var usernameSpanObj = document.getElementById("usernameSpan");
            // innerHTML 表示起始标签和结束标签中的内容
            // innerHTML 这个属性可读,可写
            usernameSpanObj.innerHTML = "真可爱!";
            if (patt.test(usernameText)) {
                // alert("用户名合法!");
                // usernameSpanObj.innerHTML = "用户名合法!";
                usernameSpanObj.innerHTML = "<img src=\"right.png\" width=\"18\" height=\"18\">";
            } else {
                // alert("用户名不合法!");
                // usernameSpanObj.innerHTML = "用户名不合法!";
                usernameSpanObj.innerHTML = "<img src=\"wrong.png\" width=\"18\" height=\"18\">";
            }
        }
    </script>
</head>

<body>
    用户名:<input type="text" id="username" value="wzg" />
    <span id="usernameSpan" style="color:red;">
    </span>
    <button onclick="onclickFun()">较验</button>
</body>

</html>

getElementsByName 方法示例代码:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        // 全选
        function checkAll() {
            // 让所有复选框都选中
            // document.getElementsByName();是根据 指定的 name 属性查询返回多个标签对象集合
            // 这个集合的操作跟数组 一样
            // 集合中每个元素都是 dom 对象
            // 这个集合中的元素顺序是他们在 html 页面中从上到下的顺序
            var hobbies = document.getElementsByName("hobby");
            // checked 表示复选框的选中状态。如果选中是 true,不选中是 false
            // checked 这个属性可读,可写
            for (var i = 0; i < hobbies.length; i++) {
                hobbies[i].checked = true;
            }
        }
        //全不选
        function checkNo() {
            var hobbies = document.getElementsByName("hobby");
            // checked 表示复选框的选中状态。如果选中是 true,不选中是 false
            // checked 这个属性可读,可写
            for (var i = 0; i < hobbies.length; i++) {
                hobbies[i].checked = false;
            }
        }
        // 反选
        function checkReverse() {
            var hobbies = document.getElementsByName("hobby");
            for (var i = 0; i < hobbies.length; i++) {
                hobbies[i].checked = !hobbies[i].checked;
                // if (hobbies[i].checked) {
                // hobbies[i].checked = false;
                // }else {
                // hobbies[i].checked = true;
                // }
            }
        }
    </script>
</head>

<body>
    兴趣爱好:
    <input type="checkbox" name="hobby" value="cpp" checked="checked">C++
    <input type="checkbox" name="hobby" value="java">Java
    <input type="checkbox" name="hobby" value="js">JavaScript
    <br />
    <button onclick="checkAll()">全选</button>
    <button onclick="checkNo()">全不选</button>
    <button onclick="checkReverse()">反选</button>
</body>

</html>

getElementsByTagName 方法示例代码:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        // 全选
        function checkAll() {
            // document.getElementsByTagName("input");
            // 是按照指定标签名来进行查询并返回集合
            // 这个集合的操作跟数组 一样
            // 集合中都是 dom 对象
            // 集合中元素顺序 是他们在 html 页面中从上到下的顺序。
            var inputs = document.getElementsByTagName("input");
            for (var i = 0; i < inputs.length; i++) {
                inputs[i].checked = true;
            }
        }
    </script>
</head>

<body>
    兴趣爱好:
    <input type="checkbox" value="cpp" checked="checked">C++
    <input type="checkbox" value="java">Java
    <input type="checkbox" value="js">JavaScript
    <br />
    <button onclick="checkAll()">全选</button>
</body>

</html>

createElement 方法示例代码:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        window.onload = function () {
            // 现在需要我们使用 js 代码来创建 html 标签,并显示在页面上
            // 标签的内容就是:<div>我爱你,我爱你</div>
            var divObj = document.createElement("div"); // 在内存中 <div></div>
            var textNodeObj = document.createTextNode("我爱你,我爱你"); // 有一个文本节点对象 #国哥,我
            爱你
            divObj.appendChild(textNodeObj); // <div>我爱你</div>
            // divObj.innerHTML = "我爱你,我爱你"; // <div>我爱你</div>,但,还只是在内存中
            // 添加子元素
            document.body.appendChild(divObj);
        }
    </script>
</head>

<body>
</body>

</html>

节点的常用属性和方法


节点就是标签对象

方法:

通过具体的元素节点调用

getElementsByTagName()

方法,获取当前节点的指定标签名孩子节点

appendChild( oChildNode )

方法,可以添加一个子节点,oChildNode 是要添加的孩子节点

属性:

  1. childNodes 属性,获取当前节点的所有子节点

  2. firstChild 属性,获取当前节点的第一个子节点

  3. lastChild 属性,获取当前节点的最后一个子节点

  4. parentNode 属性,获取当前节点的父节点

  5. nextSibling 属性,获取当前节点的下一个节点

  6. previousSibling 属性,获取当前节点的上一个节点

  7. className 用于获取或设置标签的 class 属性值

  8. innerHTML 属性,表示获取/设置起始标签和结束标签中的内容

  9. innerText 属性,表示获取/设置起始标签和结束标签中的文本


    DOM 查询练习

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>dom 查询</title>
    <link rel="stylesheet" type="text/css" href="style/css.css" />
    <script type="text/javascript">
        window.onload = function () {
            //1.查找#bj 节点
            document.getElementById("btn01").onclick = function () {
                var bjObj = document.getElementById("bj");
                alert(bjObj.innerHTML);
            }
            //2.查找所有 li 节点
            var btn02Ele = document.getElementById("btn02");
            btn02Ele.onclick = function () {
                var lis = document.getElementsByTagName("li");
                alert(lis.length)
            };
            //3.查找 name=gender 的所有节点
            var btn03Ele = document.getElementById("btn03");
            btn03Ele.onclick = function () {
                var genders = document.getElementsByName("gender");
                alert(genders.length)
            };
            //4.查找#city 下所有 li 节点
            var btn04Ele = document.getElementById("btn04");
            btn04Ele.onclick = function () {
                //1 获取 id 为 city 的节点
                //2 通过 city 节点.getElementsByTagName 按标签名查子节点
                var lis = document.getElementById("city").getElementsByTagName("li");
                alert(lis.length)
            };
            //5.返回#city 的所有子节点
            var btn05Ele = document.getElementById("btn05");
            btn05Ele.onclick = function () {
                //1 获取 id 为 city 的节点
                //2 通过 city 获取所有子节点
                alert(document.getElementById("city").childNodes.length);
            };
            //6.返回#phone 的第一个子节点
            var btn06Ele = document.getElementById("btn06");
            btn06Ele.onclick = function () {
                // 查询 id 为 phone 的节点
                alert(document.getElementById("phone").firstChild.innerHTML);
            };
            //7.返回#bj 的父节点
            var btn07Ele = document.getElementById("btn07");
            btn07Ele.onclick = function () {
                //1 查询 id 为 bj 的节点
                var bjObj = document.getElementById("bj");
                //2 bj 节点获取父节点
                alert(bjObj.parentNode.innerHTML);
            };
            //8.返回#android 的前一个兄弟节点
            var btn08Ele = document.getElementById("btn08");
            btn08Ele.onclick = function () {
                // 获取 id 为 android 的节点
                // 通过 android 节点获取前面兄弟节点
                alert(document.getElementById("android").previousSibling.innerHTML);
            };
            //9.读取#username 的 value 属性值
            var btn09Ele = document.getElementById("btn09");
            btn09Ele.onclick = function () {
                alert(document.getElementById("username").value);
            };
            //10.设置#username 的 value 属性值
            var btn10Ele = document.getElementById("btn10");
            btn10Ele.onclick = function () {
                document.getElementById("username").value = "国哥你真牛逼";
            };
            //11.返回#bj 的文本值
            var btn11Ele = document.getElementById("btn11");
            btn11Ele.onclick = function () {
                alert(document.getElementById("city").innerHTML);
                // alert(document.getElementById("city").innerText);
            };
        };
    </script>
</head>

<body>
    <div id="total">
        <div class="inner">
            <p>
                你喜欢哪个城市?
            </p>
            <ul id="city">
                <li id="bj">北京</li>
                <li>上海</li>
                <li>东京</li>
                <li>首尔</li>
            </ul>
            <br>
            <br>
            <p>
                你喜欢哪款单机游戏?
            </p>
            <ul id="game">
                <li id="rl">红警</li>
                <li>实况</li>
                <li>极品飞车</li>
                <li>魔兽</li>
            </ul>
            <br />
            <br />
            <p>
                你手机的操作系统是?
            </p>
            <ul id="phone">
                <li>IOS</li>
                <li id="android">Android</li>
                <li>Windows Phone</li>
            </ul>
        </div>
        <div class="inner">
            gender:
            <input type="radio" name="gender" value="male" />
            Male
            <input type="radio" name="gender" value="female" />
            Female
            <br>
            <br>
            name:
            <input type="text" name="name" id="username" value="abcde" />
        </div>
    </div>
    <div id="btnList">
        <div><button id="btn01">查找#bj 节点</button></div>
        <div><button id="btn02">查找所有 li 节点</button></div>
        <div><button id="btn03">查找 name=gender 的所有节点</button></div>
        <div><button id="btn04">查找#city 下所有 li 节点</button></div>
        <div><button id="btn05">返回#city 的所有子节点</button></div>
        <div><button id="btn06">返回#phone 的第一个子节点</button></div>
        <div><button id="btn07">返回#bj 的父节点</button></div>
        <div><button id="btn08">返回#android 的前一个兄弟节点</button></div>
        <div><button id="btn09">返回#username 的 value 属性值</button></div>
        <div><button id="btn10">设置#username 的 value 属性值</button></div>
        <div><button id="btn11">返回#bj 的文本值</button></div>
    </div>
</body>

</html>

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

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

相关文章

三次登录验证和验证码功能实现

三次登录验证和验证码功能实现 最近手头上的事忙的差不多了&#xff0c;就想着自己写写小demo玩一下&#xff0c;结果突然看到我们旧系统的登录好像有点拉胯&#xff0c;然后就自己写了个小demo&#xff0c;指不定哪天就用上了呢 一、pom文件 首先当然是pom文件啦&#xff0…

【JS】1724- 重学 JavaScript API - Drag and Drop API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API 8. WebStorage API 9. WebSockets API 10. Fullscreen API 11. Geolocation API ❞ &#x1f3dd; 1. 快速…

ThinkPHP6.0 数据迁移工具 migration 入门使用教程

文章目录 安装数据库迁移工具创建迁移文件执行迁移回滚参考资料 开始前需要做好的准备工作&#xff1a; 搭建好 PHP 开发环境&#xff08;推荐 phpstudy&#xff0c;PHP>7.2.5&#xff0c;MySql5.7.x&#xff09;。安装好 ThinkPHP6.0&#xff0c;并做配置可正常连接到 MySq…

docker安装nginx,发布部署vue项目

场景 前后端项目&#xff0c;实现前后端简单部署到服务器。前端vue&#xff0c;后端springboot。服务器ubuntu&#xff08;18.04&#xff09;<linux系统同理>. 后端通过(nohup java -jar xxx.jar &) 指令简单部署。该文主要说明部署前端vue项目。 部署vue需要安装ng…

一文看懂51单片机和stm32区别,怎么用怎么学怎么选

一文看懂51单片机和stm32区别&#xff0c;怎么用怎么学怎么选 对于初学单片机的童鞋而言&#xff0c;开始会有这样的疑问&#xff1f;到底选哪个怎么选呢&#xff1f; 1、工业控制51优于stm&#xff1f; 2、没区别,51就是个入门级,不过也有贵的,我用的就是51,用的还可以&…

PG系列4:linux下编译安装PG15

文章目录 一. 源码安装1.1 下载并解压1.2 安装依赖包1.3 开始编译安装1.4 创建用户1.5 创建目录及修改权限1.6 设置环境变量1.7 初始化数据库1.8 启动和关闭数据库 二. 验证2.1 查看数据库后台进程2.2 验证和登陆数据库2.3 查看数据库版本2.4 查看数据库运行状态2.5 修改白名单…

Sangfor华东天勇战队:h2数据库console命令执行( CVE-2021-42392 漏洞)

漏洞版本 1.1.100 < H2 Console < 2.0.204 漏洞复现 此处复现版本1.4.197 启动项目如下 在Driver Class中输入javax.naming.InitialContext 在JDBCURL中输入jndi注入恶意链接 生成链接命令&#xff1a; java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C …

CCD与CMOS

#1, 相机内部结构 https://zhuanlan.zhihu.com/p/158502818 #2&#xff0c;

大数据从0到1的完美落地之Hive分区

分区简介 为什么分区 Hive的Select查询时&#xff0c;一般会扫描整个表内容。随着系统运行的时间越来越长&#xff0c;表的数据量越来越大&#xff0c;而hive查询做全表扫描&#xff0c;会消耗很多时间&#xff0c;降低效率。而有时候&#xff0c;我们需求的数据只需要扫描表…

java面试高频面试题

文章目录 面向对象 什么是面向对象&#xff1f;封装继承多态 和equals比较hashCode与equals重载和重写的区别Final类加载器spring是什么AOP的理解谈谈你对IOC的理解零拷贝RocketMQ 架构设计RocketMq 事务消息原理RockeMq顺序消息消费原理简述RockerMQ持久化机制RocketMQ如何保…

redis学习整理

目录 一、简述 二、作用 三、五大基本数据类型 Key命令 1.String字符串 2.List列表 3.Set(集合&#xff09; 4.Hash&#xff08;哈希&#xff09; 5.zSet&#xff08;有序集合&#xff09; 四、主从复制 与 哨兵模式 1. 主从复制&#xff1a; 2. 哨兵模式&#xff…

【正点原子STM32连载】 第四十一章 游戏手柄实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录 前言&#xff1a; 委托构造函数&#xff1a; 类内初始化&#xff1a; 空指针&#xff1a; 枚举类&#xff1a; 总结&#xff1a; 前言&#xff1a; C的学习难度大&#xff0c;内容繁多。因此我们要及时掌握C的各种特性&#xff0c;因此我们更新本篇文章&#xff0c;向…

部署vue element-ui admin报错(vue2)

部署vue element-ui admin报错(vue2) 目录 部署vue element-ui admin报错(vue2) 一、官方安装说明 二、部署报错的关键影响因素 2.1、“开发模板”版本 2.2、完整版 2.2.1、基础知识和基础依赖 2.2.2、原理-安装过程 三、完整版 3.3、win10环境 四、效果 4.1、win7…

云安全技术——kvm虚拟化技术

目录 10-1 kvm简介 10-2 在CentOS 7 图形化界面下安装KVM 使用IDEA开发读写MySQL数据库程序 实验目的 了解 CentOS7图形化界面的部署方法 了解 KVM的组成和作用 了解 KVM的技术架构 了解KVM的安装方法 了解 KVM创建虚拟机的方法 了解KVM的常用管理命令 实验要求 能部署图形化…

为什么建议孩子学Python?理由都在这!

近几年&#xff0c;越来越多的家长选择让孩子学习编程&#xff0c;以此提高孩子的逻辑思维、信息素养等综合能力。 Python作为一种计算机程序设计语言&#xff0c;在科技行业中有广泛的应用&#xff0c;逐渐成为少儿编程教育中必学课程之一。今天&#xff0c;编编就为大家详细…

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了HTML / JSP编辑器、智能代码完成和内容辅助等功能&#xff0c;本文将继续介绍Emmet支持、Outline 视图功能等。 MyEclipse v2023.1正式版下载 如果您有HTML或JSP文件要编辑&#xff0c;这里…

chatgpt赋能python:Python聊天程序:现代化交流的必备工具

Python聊天程序&#xff1a;现代化交流的必备工具 在信息技术快速发展的现代社会&#xff0c;聊天作为一种流行的交流方式已经取代了传统的语音电话和短信。由于智能手机和电脑的广泛普及&#xff0c;越来越多的人习惯于使用聊天软件来与朋友、家人和同事保持联系。因此&#…

GBASE南大通用携手麒麟软件、索信达 共推金融信创联合解决方案

在国家信创战略推动下&#xff0c;我国正逐步实现基础硬件-基础软件-行业应用软件的国产化替代。信创浪潮中&#xff0c;各产业链以及不同垂直细分领域的创新主体&#xff0c;正以开放、创新、团结的姿态&#xff0c;形成高凝聚力的生态合作&#xff0c;共推信创产业发展&#…

【Java】JVM学习(三)

JVM的整体内存结构 本地方法栈 本地方法栈跟 Java 虚拟机栈的功能类似&#xff0c;Java 虚拟机栈用于管理 Java 函数的调用&#xff0c;而本地方法栈则用于管理本地方法的调用。但本地方法并不是用 Java 实现的&#xff0c;而是由 C 语言实现的(比如Object.hashcode方法)。 …