Javascript:DOM对象

Javascript:DOM-获取对象

    • DOM与JavaScript的关系
    • 什么是DOM
    • DOM相关概念
      • DOM 树
      • DOM 节点
      • DOM对象
    • 获取DOM对象
      • 通过CSS选择器来获取DOM对象
      • 其他方式
    • 操作DOM对象
      • 控制DOM对象内容
      • 控制DOM对象属性
        • 控制HTML标签属性
        • 控制CSS样式
          • 通过style属性操作CSS
          • 通过类名(className) 操作CSS
          • 通过 classList 操作类控制CSS
        • 自定义属性


DOM与JavaScript的关系

严格意义上讲,我们在 JavaScript 语法阶段学习的知识绝大部分属于 ECMAScript 的知识体系,ECMAScript 简称 ES 它提供了一套语言标准规范,如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的。浏览器将 ECMAScript 大部分的规范加以实现,并且在此基础上又扩展一些实用的功能,这些被扩展出来的内容我们称为 Web APIs。

请添加图片描述

ECMAScript 运行在浏览器中然后再结合 Web APIs 才是真正的 JavaScript,Web APIs 的核心是 DOM 和 BOM。


什么是DOM

DOM(Document Object Model)是将整个 HTML 文档的每一个标签元素视为一个对象,这个对象下包含了许多的属性和方法,通过操作这些属性或者调用这些方法实现对 HTML 的动态更新,为实现网页特效以及用户交互提供技术支撑。

简言之 DOM 是用来动态修改 HTML 的,其目的是开发网页特效及用户交互。

观察一个小例子:

请添加图片描述

上述的例子中当用户分分别点击【开始】或【结束】按钮后,通过右侧调试窗口可以观察到 html 标签的内容在不断的发生改变,这便是通过 DOM 实现的。
DOM是浏览器提供的专门用来操纵网页内容的功能


DOM相关概念

DOM 树

我们有以下HTML代码,现在将其转化为DOM树结构:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>标题</title>
</head>
<body>文本<a href="">链接名</a><div id="" class="">文本</div>
</body>
</html>

如下图所示:

请添加图片描述
在HTML文件中,我们的总文档为document,内部有HTML大标签,HTML内有head和body;在head内又有meta,title等等。
这样一直深入,我们就得到了标签之间的层级关系,最后用树状结构展示出来,我们就得到了DOM树。
将 HTML 文档以树状结构直观的表现出来,我们称之为文档树或 DOM 树文档树直观的体现了标签与标签之间的关系。


DOM 节点

节点是文档树的组成部分,每一个节点都是一个 DOM 对象,主要分为元素节点、属性节点、文本节点等。

  1. 【元素节点】其实就是 HTML 标签,如上图中 headdivbody 等都属于元素节点。
  2. 【属性节点】是指 HTML 标签中的属性,如上图中 a 标签的 href 属性、div 标签的 class属性。
  3. 【文本节点】是指 HTML 标签的文字内容,如 title 标签中的文字。
  4. 【根节点】特指 html 标签。
  5. 其它…

要注意,节点是在DOM树中的概念,而对象是JavaScript中的概念,简单来说,这个DOM树转化为DOM对象后,我们就可以在JavaScript中操作对象,从而操纵网页标签。


DOM对象

DOM对象是浏览器根据HTML标签生成的JavaScript对象

我们在讲解DOM节点时已经大致提到,DOM是通过将HTML的标签转化为JavaScript对象从而实现的对HTML操控。

document 是 JavaScript 内置的专门用于 DOM 的对象,该对象包含了若干的属性和方法。

我们先讲解一个熟悉的代码:

  document.write('Hello World!');

这是一个在语法阶段就已经学习过的向浏览器页面写入的语句,观察其结构开头是document ,后面有一个点号.紧接着的是一个函数write()。这串代码的突破点在于这个点号.,点号是JavaScript的对象访问使用的操作符,也就是说document是一个对象,这串代码正在访问document对象中的write()方法(即函数)。
而这个 document.write('Hello World!');过程,就是向网页中写入字符串’Hello World!',这是一个通过JavaScript操作网页的过程,我们使用了document对象。
由此可见:

document确实是一个对象
我们可以通过document对象操控网页


获取DOM对象

刚刚的document对象,我们是可以直接使用的,而在DOM树中,不止document一个对象,对象的某个熟悉也可以是对象,比如document下面的html,body,head都是一个对象。当我们想要操纵这些小对象时,我们要先获取到这个对象。

通过CSS选择器来获取DOM对象

我们有两种方式可以通过CSS的选择器来获取对象分别是querySelector()和querySelectorAll():
这两个方式,都是函数,我们需要向函数传参,参数就是CSS的选择器。在此,选择器既可以是基本选择器,也可以是复合选择器。由于复合选择器可以非常精确的定位的元素,通过选择器获取到的DOM对象也会十分精准,这是获取对象最好用,最主要的方式。

querySelector
语法:

const/let/var 变量 = document.querySelector('CSS选择器')  

既然是DOM树的内容,毫无疑问要通过document对象出发,所以querySelector也是一个document对象的方法。这个querySelector会返回一个对象,也就是符合我们条件的对象,比如document.querySelector('.box p')这串代码就是获得了类名为box的父级元素里面的p标签。
但是要注意,querySelector只能获取第一个符合条件的元素
当我们获取到对象后,就要用变量来接收它,此处用const/let/var三种关键字来定义变量都可以,但是由于我们的对象一般是不修改的,最好使用const。

这个方式只能得到第一个符合条件的元素,我们第二种方法就是来获取所有符合条件的元素的:
querySelectorAll
语法:

const/let/var 变量 = document.querySelectorAll('CSS选择器')  

和刚才的语法是一致的,但是它可以获取符合条件的所有对象,那么最后要如何让一个变量同时接收所有符合条件的对象?
我们先用一串代码观察一下:

  <ul><li>元素</li><li>元素</li><li>元素</li><li>元素</li></ul><script>const lis = document.querySelectorAll('li');console.log(lis);</script>

这串代码中const lis = document.querySelectorAll('li');就是在获取所有的li标签,因为CSS中li这个选择器就是一个标签选择器,选择了所有li标签。
输出结果:
在这里插入图片描述
可以看到,我们的lis,即我们获取的返回值,其实是一个数组,数组里面有符合条件的所有对象。
结论:querySelectorAll可以获得所有符合条件的元素,将它们存放在一个数组中
但是其实这个数组是一个伪数组,它有数组的形式,但是没有数组的所有功能,它不能使用数组的pop(),push()等方法


其他方式

getElementById
getElementsByTagName
getElementsByClassName
通过这三个名字就可以看出来,getElementById是通过id选择器来获取元素;getElementsByTagName是通过标签名来获得一类元素;getElementsByClassName是通过类选择器来获得元素。
对于这些方式,我们不过多讲解,querySelector()和querySelectorAll()已经足够好用,这些只做了解。


操作DOM对象

我们已经获得到了DOM对象,接下来就要学习如何通过DOM对象来操控页面内的元素了:

控制DOM对象内容

通过修改 DOM 的文本内容,动态改变网页的内容。
什么是DOM对象的内容?比如我们有一个li标签:<li>你好</li>,其中“你好”这个字符串就是li标签的内容,当我们获取到li标签的对象,就可以修改其内部的内容了。

  1. innerText 将文本内容添加/更新到任意标签,文本中包含的标签不会被解析。
<script>const intro = document.querySelector('.intro')intro.innerText = '嗨~ 我叫李雷!'intro.innerText = '<h4>嗨~ 我叫李雷!</h4>'
</script>

代码解析
首先,我们通过const intro = document.querySelector('.intro'),获取到了类名为intro的元素对象,innerText 可以在对象内部写入文本,比如第二句代码中:intro.innerText = '嗨~ 我叫李雷!'就是在我们对象对应的标签中写入“嗨~ 我叫李雷!”这个字符串。
但是这样写入的文本,不会被解析,这是什么意思?我们看到第三行代码:
我们通过innerText向网页写入了一个字符串,字符串被h4标签包裹,我们运行一下看看效果:

在这里插入图片描述
最后我们的<h4></h4>没有被解析为标签,而是被解析为了文本。

  1. innerHTML 将文本内容添加/更新到任意标签位置,文本中包含的标签会被解析。
<script>const intro = document.querySelector('.intro')intro.innerHTML = '嗨~ 我叫韩梅梅!'intro.innerHTML = '<h4>嗨~ 我叫韩梅梅!</h4>'
</script>

其与innerText的唯一区别就是,它可以解析HTML标签,我们再运行一下试试看:
在这里插入图片描述
此时我们的<h4></h4>就被解析为了四级标题标签。

在实际开发中,绝大部分场景都使用 innerHTML ,除非你真的想在网页内输出文本形式的标签。


控制DOM对象属性

控制HTML标签属性

对于一些简单的HTML属性,它们会被存放在相应的对象中,需要使用时直接调用即可:

语法:

对象.属性 =

示例:

<script>// 1. 获取 img 对应的 DOM 元素const pic = document.querySelector('.pic')// 2. 修改属性pic.src = './images/lion.webp'pic.width = 400;pic.alt = '图片不见了...'
</script>

src,alt,width都是HTML中的img自带的属性,它们本身就存在于img的对象中,需要时直接调用,对其赋值即可。

绝大部分在HTML中直接出现的标签属性值,都可以用这种方式来修改。


控制CSS样式
通过style属性操作CSS

先前的属性,是直接在HTML中可以使用的属性,而绝大部分属性,是处于CSS中的,在这一类属性,会存在于DOM对象的style属性中。
语法:

对象.style.属性 = “属性值”

通过元素节点获得的 style 属性本身的数据类型也是对象,如 box.style.colorbox.style.width 分别用来获取元素节点 CSS 样式的 colorwidth 的值。
示例:

  <div class="box">随便一些文本内容</div><script>// 获取 DOM 节点const box = document.querySelector('.intro')box.style.color = 'red'box.style.width = '300px'box.style.backgroundColor = 'skyblue'</script>

css 属性的 - 连接符与 JavaScript 的 减运算符冲突,此时要改为驼峰命名法。
任何标签都有 style 属性,通过 style 属性可以动态更改网页标签的样式,如要遇到 css 属性中包含字符 - 时,要将 - 去掉并将其后面的字母改成大写,如 background-color 要写成 box.style.backgroundColor


通过类名(className) 操作CSS

如果修改的样式比较多,直接通过style属性修改比较繁琐,我们可以通过借助于css类名的形式。
DOM对象有一个属性className,其存储这这个元素具有的CSS类,当我们想要修改的值太多,就可以把修改后的值都写到一个类选择器中,然后将对象的类修改为对于的类选择器。

示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>练习 - 修改样式</title><style>.blue {background: blue;color: skyblue;}</style>
</head>
<body><div class="box">随便一些文本内容</div><script>// 获取 DOM 节点const box = document.querySelector('.intro')box.className = 'blue'</script>
</body>
</html>

解析:
在上述代码这种,我们提取了box这个对象,然后将字体颜色和背景封装在了一个名为blue的类中,当我们想要在JavaScript中改变box的字体颜色和背景,只需要将blue这个类给box即可。

注意:

className是使用新值换旧值, 我们在添加新的类后,原先的类会被覆盖

基于这个特性,这个方法其实并不好用,而下一个方法可以非常好的解决这个问题。


通过 classList 操作类控制CSS

为了解决className 容易覆盖以前的类名,我们可以通过classList方式追加和删除类名
classList是DOM对象所具有的全部类的集合,classList下面有方法可以实现类的追加和删除:

追加:

对象.classList.add('类名')

删除:

对象.box.classList.remove('类名')

切换状态(有就删掉,没有就加上):

对象.box.classList.toggle('类名')

示例:

<!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><style>div {width: 200px;height: 200px;background-color: pink;}.active {width: 300px;height: 300px;background-color: hotpink;margin-left: 100px;}</style>
</head><body><div class="one"></div><script>// 1.获取元素let box = document.querySelector('div')// add是个方法 添加  追加box.classList.add('active')// remove() 移除 类box.classList.remove('one')// 切换类box.classList.toggle('one')</script>
</body></html>

自定义属性

标准属性: 标签天生自带的属性 比如class id title等, 可以直接使用点语法操作比如: disabled、checked、selected

自定义属性:

在html5中推出来了专门的data-自定义属性,在标签上一律以data-开头,在DOM对象上一律以dataset.对象方式获取。

<body><div data-id="1"> </div><script>// 1. 获取元素let div = document.querySelector('div')// 2. 获取自定义属性值console.log(div.dataset.id)</script>
</body>

这里的自定义属性值,可以存一些标识符号,用于后续JavaScript寻找符合条件的对象等等,在此不做展开了。


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

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

相关文章

详解KMP算法

KMP算法应该是每一本《数据结构》书都会讲的&#xff0c;算是知名度最高的算法之一了&#xff0c;但很可惜&#xff0c;我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章&#xff0c;看久了好像也知道是怎么一回事&#xff0c;但总感觉有些地方自己…

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制 前言0. 基础Qt/PyQt5介绍/关联Qt的优缺点&#xff08;为什么要用qt来做界面&#xff09;Qt 的核心机制请简要介绍一下Qt中的主窗口&#xff08;MainWindow&#xff09;类&#xff0c;它有哪些重要的函数和成员变量&#xff…

【ArduinoOTA无线(OTA)更新的EASY指南】

【ArduinoOTA无线&#xff08;OTA&#xff09;更新的EASY指南】 1. 前言2. 了解 ESP32 的 ArduinoOTA3. 无线更新案例4. ArduinoOTA入门5. 安装必备组件6. 设置硬件7. ESP32 OTA 的最低代码8. 按照我们的流程学习Arduino编程➜9. 这对OTA来说非常重要10. 通过无线方式将草图上传…

携手河南恩坤德,共创养殖新篇章

在这个充满机遇与挑战的时代&#xff0c;养殖业正在经历一场前所未有的变革。作为养殖户&#xff0c;您需要一个能够与您共同应对变革、共创未来的合作伙伴。河南恩坤德农业正是这样一个值得信赖的伙伴&#xff0c;我们携手共创养殖新篇章。 河南恩坤德农业以客户需求为导向&am…

Ai图片处理

Ai也可以直接导入PS文件&#xff0c;只不过需要进行一个相关的选择&#xff0c;一般来说是将图层转化为对象 第二个为图层拼合为单个图像&#xff08;不常用&#xff09; 第三个则是将隐藏的图片也进行显示 如果你觉得图片的信息的过少好想插入其他的图片&#xff0c;可以选择…

【mongoose】 Model.create() no longer accepts a callback 报错解决

在最新版的 mongoose 操作 MongoDB 数据库的时候&#xff0c;当我们插入一条数据时候&#xff0c;会报错 &#xff1a;Model.create() no longer accepts a callback&#xff0c;看了很多文章都说是&#xff0c;版本太高&#xff0c;都妥协选择了降低回旧版本&#xff0c;但我就…

消息队列之关于如何实现延时队列

一、延时队列的应用 1.1 什么是延时队列&#xff1f; 顾名思义&#xff1a;首先它要具有队列的特性&#xff0c;再给它附加一个延迟消费队列消息的功能&#xff0c;也就是说可以指定队列中的消息在哪个时间点被消费。 延时队列在项目中的应用还是比较多的&#xff0c;尤其像…

【matlab】绘制竖状单组渐变柱状图

【matlab】绘制竖状单组渐变柱状图 % matlab绘制渐变柱状图 clear;clc;close all; x1:100; a[]; for i1:length(x) if mod(i,2)0 i-i; end a[a i]; end close all; b0.8; for nm3:69 cmapload([‘D:\m…

机器学习笔记 - Swish激活函数的定义和优势

一、Swish激活函数简述 首先,Swish 是像 ReLU、sigmoid 和 tanh 一样的非线性函数,使神经网络能够对输入和输出之间的复杂关系进行建模。非线性函数对于深度学习的工作至关重要,因为它们能够捕获和表示复杂的模式。 与 ReLU 等其他常用激活函数相比,Swish 具有独特的形状。…

C# 判断两个时间段是否重叠

public static bool IsOverlap(DateTime startTime1, DateTime endTime1, DateTime startTime2, DateTime endTime2){// 判断两个时间段是否有重叠return !(endTime1 < startTime2 || startTime1 > endTime2);//根据德摩根定律&#xff0c;等效为&#xff1a;endTime1 &g…

leetcode 268. 丢失的数字(优质解法)

链接&#xff1a;268. 丢失的数字 代码: class Solution {public int missingNumber(int[] nums) {int result0;for(int i0;i<nums.length;i){result^i;}for(int i0;i<nums.length;i){result^nums[i];}return result;} } 题解&#xff1a; 本题是比较简单的题&#xff…

天文观测与计算机技术:粉丝的视角

天文观测与计算机技术&#xff1a;粉丝的视角 在浩瀚无垠的宇宙中&#xff0c;每一颗星星都像是神秘的密码&#xff0c;等待我们去破译。作为天文观测的粉丝&#xff0c;我深知每一个美丽的星图背后都离不开计算机技术的支持。在这篇文章中&#xff0c;我将分享我对天文观测与…

ei论文会被scopus检索吗

scopus数据库能检索的专业范围是比较广泛的&#xff0c;涵盖了医学&#xff0c;地球环境科学&#xff0c;化学&#xff0c;数学&#xff0c;工程学&#xff0c;物理&#xff0c;生物科学等领域&#xff0c;也收录了很多会议论文&#xff0c;那么ei论文被其检索吗?其实严格说来…

最小二乘法简介

最小二乘法简介 1、背景描述2、最小二乘法2.1、最小二乘准则2.2、最小二乘法 3、最小二乘法与线性回归3.1、最小二乘法与线性回归3.2、最小二乘法与最大似然估计 4、正态分布&#xff08;高斯分布&#xff09; 1、背景描述 在工程应用中&#xff0c;我们通常会用一组观测数据去…

基于javaWeb的高校后勤报修系统的设计与实现论文

基于JavaWeb的高校后勤报修系统的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前学校对于后勤报修信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&…

如何查看内存卡使用记录-查看的设备有:U盘、移动硬盘、MP3、SD卡等-供大家学习研究参考

主要功能 USB Viewer&#xff08;USB移动存储设备使用记录查看器&#xff09;可用于查看本机的USB移动存储设备使用记录。可查看的设备有&#xff1a;U盘、移动硬盘、MP3、SD卡……等。   可用于兵器、航空、航天、政府、军队等对保密要求较高的单位&#xff0c;可在计算机保…

快手ID商品详情API:电商的新机遇

快手ID商品详情API&#xff1a;电商的新机遇 随着互联网的普及和科技的飞速发展&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分。作为国内领先的短视频平台&#xff0c;快手一直致力于为用户提供优质的内容和服务。近年来&#xff0c;快手推出了ID商品详情API&…

Jmeter实现性能测试--高频率(高吞吐量)

高频率场景通常涉及系统需要在极短时间内处理大量请求或事件。这些场景可能要求系统在短时间内执行多次操作&#xff0c;例如高频率的数据更新、传感器数据采集、金融交易、实时监控等。以下是一些高频率场景的示例&#xff1a; 金融交易&#xff1a; 高频交易系统需要在极短时…

银河麒麟v10 二进制安装包 安装mysql 8.35

银河麒麟v10 二进制安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装依赖包3.2、安装Mysql3.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突&#xff0c;因此首先需要卸载系统自带的mariadb 查看系统…

一个简单的获取显示器长宽和显示器分辨的代码

最近在做大屏显示&#xff0c;在现显示的时候有些显示器是不规则的&#xff0c;投到大屏上显示效果不好&#xff0c;可以直接获取显示器的分辨率&#xff0c;本地调整好&#xff0c;再直接部署。 <!DOCTYPE html> <html lang"en"> <head><meta …