JavaScript中DOM操作

article/2025/10/19 14:16:53

Web前端基础修炼

HTML基本标签详解与运行截图

CSS基本操作详解及截图演示

JavaScript基础(ECMAScript)

JavaScript中DOM操作

JavaScript中BOM操作


目录

DOM介绍

获取元素

操作元素 

节点操作


DOM介绍

JavaScript一共包括三部分,分别是ECMAScript也就是JavaScript基础、DOM和BOM。

今天来将一下DOM,先说说什么是DOM,DOM(Document Object Model)文档对象模型,所谓文档,也就是对网页中的内容、结构和样式进行操作,对象也就是在操作过程中返回值为对象类型,我们学习DOM主要就是对元素进行创建、增、删、改、查、属性操作、时间操作,来看下DOM树吧,最顶层就是Document

获取元素

获取元素有很多方法,可以通过id获取,可以通过类获取,其中querySelector既可以通过id也能通过类,详细内容都在注释里

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>获取元素</title>
</head>
<body>
<div id="time">2019.10.12</div>
<div class="box">盒子</div>
<div class="box">盒子</div>
<ul id="ul"><li>我是丽丽</li><li>我是丽丽</li><li>我是丽丽</li><li>我是丽丽</li><li>我是丽丽</li>
</ul>
<script>//js是从上往下执行的,所以js要写到div下面//通过id获得元素var time = document.getElementById('time');console.log(time);//这里就获得了<div id="time">2019.10.12</div>元素console.log(typeof time);//返回的time是一个object对象//获取多个元素var lis = document.getElementsByTagName('li');//这里返回的是个集合,伪数组的形式console.log(lis);//这里可以通过下标访问,第一个元素是lis[0]//如果这里有很多的li而你只想获得ul中的li可以如下指定获取方法var ul = document.getElementById('ul');var lis1 = ul.getElementsByTagName('li');console.log(lis1);//通过class获得元素var boxs = document.getElementsByClassName('box');console.log(boxs);//querySelector() 返回指定选择器的第一个元素,类要加. id要加#,这个比较常用var box = document.querySelector('.box');//这是类选择器console.log(box);var ul1 = document.querySelector('#ul');//这是id选择器console.log(ul1);var li = document.querySelector('li');//标签选择器console.log(li);//querySelectorAll() 返回一个集合,是个伪数组的形式var allBox = document.querySelectorAll('.box');console.log(allBox);var lis2 = document.querySelectorAll('li');console.log(lis2);
</script>
</body>
</html>

运行结果

操作元素 

操作元素是个重头戏了,可以通过元素内容、元素属性、表单属性、样式属性进行操作,具体操作都有注释,由于运行是交互式的结果,这里就进行演示了,只能截一张表面上的图了,感兴趣的可以复制代码自己尝试下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>操作元素</title><style>.d {width: 200px;height: 200px;background-color: green;}.change {width: 500px;height: 500px;background-color: pink;}</style>
</head>
<body>
<button id="btn">点击我</button>
<div>点击按钮,我会发生变化</div>
<button id="btn1">盒子1</button>
<button id="btn2">盒子2</button><br>
<img src="btn1.jpg" alt="我是盒子1"><br>
<button id="btn3">按钮</button>
<input type="text" value="输入内容">
<div class="d"></div>
<div id="dd" data-index="2"></div>
<script>//元素内容操作var btn = document.querySelector('#btn');var div = document.querySelector('div');//这里用到了onclick点击事件,后面会着重讲解事件btn.onclick = function () {//div.innerText = '<strong>我变化了</strong>';//innerText是不能识别HTML标签的,而innerTHML可以识别HTML标签,后者比较常用div.innerHTML = '<strong>我变化了</strong>';}//元素属性操作var btn1 = document.querySelector('#btn1');var btn2 = document.querySelector('#btn2');var img = document.querySelector('img');btn1.onclick = function () {img.src = 'btn1.jpg';img.alt = '我是盒子1';}btn2.onclick = function () {img.src = 'btn2.jpg';img.alt = '我是盒子2';}//表单属性操作var btn3 = document.querySelector('#btn3');var input = document.querySelector('input');btn3.onclick = function () {input.value = '我被点击了';//当点击之后可以通过disabled禁用点击按钮btn3.disabled = true;//也可以用this.disabled = true;}//样式属性操作var di = document.querySelector('.d');di.onclick = function () {//单个改变样式// this.style.backgroundColor = 'blue';// this.style.width = '300px';//通过类的方式修改多个样式this.className = 'change';}//自定义属性操作var dd = document.querySelector('#dd');console.log(dd.id);//元素直接点属性,这里的属性是内置的属性console.log(dd.getAttribute('data-index'));//这里通过getAttribute()获得自定义属性,一般是data-开头dd.setAttribute('data-time',10);//这是设置属性
</script>
</body>
</html>

运行结果:

节点操作

在DOM中所有的节点组成了一棵树,树中的各个节点有父子关系和兄弟关系,这里演示了获得父节点、获得子节点、获得第一个和最后一个节点、获得兄弟节点、动态创建节点、删除节点还有辅助节点,在这里我都写到了一个文件中,方便读者复制了,自己运行,好好思考其中的意思

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>节点操作</title>
</head>
<body>
<div class="box"><span class="x">x</span>
</div>
<ul><li>hello</li><li></li><li></li>
</ul>
<ol><li></li><li></li><li></li>
</ol>
<div class="box1">我是div</div>
<span class="sp">我是span</span>
<script>//获得父节点var x = document.querySelector('.x');//这是拿到了span元素console.log(x);var div = x.parentNode;//用节点操作,可以直接拿到离它最近的父节点,节点也就是上面展示的DOM树console.log(div);//获得子节点var ul = document.querySelector('ul');var lis = ul.childNodes;//这里会得到7个元素,其中有3个元素节点li,4个文本节点这里是换行console.log(lis);var lis1 = ul.children;//这里得到的是4个元素,都是liconsole.log(lis1);//获得第一个和最后一个节点,当然了也可以通过上面获得的lis[0]来访问第一个,长度减1获得最后一个var ol = document.querySelector('ol');console.log(ol.firstChild);//这是第一个节点,但是这是text文本节点console.log(ol.lastChild);//这是最后一个节点,但是这是text文本节点console.log(ol.firstElementChild);//这是第一个元素,也就是liconsole.log(ol.lastElementChild);//这是最后一个元素,也就是li//获得兄弟节点var div1 = document.querySelector('.box1');console.log(div1.nextSibling);//这里获得的是下一个节点,这里是text文本节点console.log(div1.previousSibling);//这里获得的是上一个节点,这里是text文本节点console.log(div1.nextElementSibling);//这里获得的是span也就是下一个元素节点console.log(div1.previousElementSibling);//这里返回的是ol也就是上一个元素节点//动态创建节点var li = document.createElement('li');var ul1 = document.querySelector('ul');ul1.appendChild(li);//将li节点追加到ul后面var li1 = document.createElement('li');ul1.insertBefore(li1,ul.children[0]);//在某个元素前插入元素//删除节点var ul2 = document.querySelector('ul');ul2.removeChild(ul.children[0]);//删除父元素中的子节点//复制节点var ul3 = document.querySelector('ul');var li3 = ul3.children[0].cloneNode();//这里的复制是只复制标签,不复制内容ul3.appendChild(li3);var li4 = ul3.children[0].cloneNode(true);//这里父子的有内容ul3.appendChild(li4);
</script>
</body>
</html>

运行结果:

事件操作 

事件注册操作

事件注册操作中,有两种常用的方法,一种是传统的方式,另一种是比较常用的方式,在这里一一列出,这里需要自己运行点击才能看到结果,所以这个就不截图了

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>事件注册操作</title>
</head>
<body>
<button>传统注册事件</button>
<button>方法监听注册事件</button>
<script>//在下面的测试中,屏幕只会弹出一个world框框,该传统方式会把第一个框框覆盖掉var btns = document.querySelectorAll('button');btns[0].onclick = function () {alert('hello');}btns[0].onclick = function () {alert('world');}//这个是用事件监听注册事件,解决了传统的覆盖问题,比较常用btns[1].addEventListener('click',function () {alert('欢迎');});btns[1].addEventListener('click',function () {alert('光临');});
</script>
</body>
</html>

删除事件

有些事件你只想执行有限次,所以你需要用到删除事件,就像注册账号时,发送过一个验证码之后,需要等一定的事件才能再次发送一样,这里也是展示两种方式的删除

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>删除事件</title><style>div {width: 100px;height: 100px;background-color: green;}</style>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<script>var divs = document.querySelectorAll('div');//传统方式删除事件divs[0].onclick = function () {alert('1');divs[0].onclick = null;}divs[1].addEventListener('click',fn);function fn() {alert('2');divs[1].removeEventListener('click',fn);}
</script>
</body>
</html>

DOM事件流

关于这个DOM事件流的描述,我都写到了注释里了,简单来说就是事件执行是有一定顺序的,可以理解为从父到子,从子到父

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>DOM事件流</title><style>.father {width: 200px;height: 200px;;background-color: green;}.son {width: 100px;height: 100px;background-color: blue;}</style>
</head>
<body>
<!--DOM事件流分为三个阶段,一个是捕获阶段,一个是目标阶段,最后一个是冒泡阶段
如果我们给div注册了点击事件,那么首先是document接收到点击事件,没有执行程序,然后html接收到点击事件
没有执行程序,然后再是body接受到点击事件,也没有执行程序,这是捕获阶段。然后找到div,有执行程序,
找到div就是目标阶段了。 然后再回到body,收到点击事件,没有执行程序,再到html,也没有执行程序,最后到
document,也没有执行程序,这就是冒泡阶段-->
<div class="father"><div class="son">son</div>
</div><script>//捕获阶段,addEventListener 第三个参数为true// document->html->body->father->sonvar son = document.querySelector('.son');/*son.addEventListener('click',function () {alert('son');},true);var father = document.querySelector('.father');father.addEventListener('click',function () {alert('father');},true);*///冒泡阶段, addEventListener 第三个参数为false,或者是省略// son->father->body->html->documentson.addEventListener('click',function () {alert('son');},false);var father = document.querySelector('.father');father.addEventListener('click',function () {alert('father');},false);</script>
</body>
</html>

事件对象

事件对象,也就相当于一个形参,是系统自动设置的,里面有很多的参数,这里截图展示下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>事件对象</title>
</head>
<body>
<div>点击试试</div>
<script>//传统方式var div = document.querySelector('div');// div.onclick = function (event) {//     //这里的event就是一个事件对象,是系统自动创建的,里面是事件的相关数据的集合//     //这里的event也可以写成e,反正只是个形参//     console.log(event);// }//添加监听方式div.addEventListener('click',function (e) {console.log(e);});
</script>
</body>
</html>

 上面有一个是target,返回的是div,在这里很容易与this产生混淆,这里举例单独说下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>常见事件</title><style>div {width: 100px;height: 100px;background-color: green;}</style>
</head>
<body>
<div>123</div>
<ul><li>abc</li><li>abc</li><li>abc</li>
</ul>
<script>var div = document.querySelector('div');div.addEventListener('click',function (e) {console.log(e.target);//返回的是触发事件的对象console.log(this);//返回的是绑定事件的对象})var ul = document.querySelector('ul');ul.addEventListener('click',function (e) {console.log(e.target);//这里指向我们点击的对象,点击li返回就是liconsole.log(this);//这里指向的绑定事件,也就是ul})
</script>
</body>
</html>

当点击ul中的li的时候,返回的结果是不一样的


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

相关文章

Dom操作的性能优化

在 开发过程中&#xff0c;或多或少都会遇到要操作dom的情况&#xff0c;而dom操作多多少少都会耗费一些性能&#xff0c;那今天我们就一起来看看在操作dom的时候有哪些性能优化方式吧&#xff1a; 1.选择性能更好的获取dom元素的方法 首先&#xff0c;我们一起来看看&#xf…

常见的DOM操作有哪些

这里是修真院前端小课堂&#xff0c;本篇分析的主题是 【常见的DOM操作有哪些】 这里是修真院前端小课堂&#xff0c;每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析前端知识/技能&…

js中Dom操作

简单的Dom获取 什么是Dom操作&#xff1f; 1.DOM使一个"使程序"和"脚本"有能力的"动态地访问"和"更新文档内容结构"&#xff0c;以及"样式"的平台和语言中立的接口. 2.在HTML和JavaScript的学习中&#xff0c;DOM操作可谓时…

TypeScript Dom操作

文章目录 介绍获取元素类型断言获取多个DOM元素操作文本内容操作样式操作事件 介绍 DOM 是浏览器提供的&#xff08;浏览器特有)&#xff0c;专门用来操作网页内容的一些JS对象(API) 通过DOM操作&#xff0c;可以让Js/Ts控制页面&#xff08;(HTML)内容&#xff0c;让页面“动…

JavaScript DOM操作

文章目录 JavaScript DOM操作DOM操作元素DOM查询修改元素内容/属性获取元素节点 DOM的增删改 DOM操作CSS内联样式获得当前正在显示的样式 DOM的事件操作事件对象事件对象的属性 事件的冒泡和事件的委托事件冒泡事件委派事件的传播事件的绑定 JavaScript DOM操作 DOM操作元素 …

DOM的操作

一、DOM的操作 1、复制节点 cloneNode(deep) 参数deep是boolean类型&#xff0c;true/false true&#xff1a;表示深度复制&#xff08;将节点及其子节点都进行复制&#xff09; --- 深拷贝 false&#xff1a;表示浅复制&#xff08;只复制节点而不复制子节点&#xff09; ----…

DOM(操作)

DOM 1 作用和分类 作用&#xff1a;使用 JS 去操作 html 和浏览器 分类&#xff1a;DOM(文档对象模型)、BOM(浏览 器对象模型) DOM 是用来呈现以及与任意HTML 或 XML文档交互的API简单说&#xff1a;DOM 是浏览器提供的一套专门用来 操作网页内容 的功能DOM的作用&am…

13前端学习之WebAPI(三):节点操作、事件高级、DOM事件流、事件委托冒泡

文章目录 一、节点操作:1. 删除节点:1.2. 案例&#xff1a;删除留言 2. 赋值(克隆)节点:3. 案例:动态生成表格:3.1 案例分析:3.2 实现: 4. 创建元素的三种方式:4.1 区别:4.2 innerTHML和createElement效率对比: 5. DOM的核心总结:5.1 创建:5.2 增加:5.3 删除:5.4 改:5.5 查&…

DOM操作

今天开始进入JS的核心操作 DOM&#xff0c;DOM操作其实很简单&#xff0c;就是增删改查这几个操作&#xff0c;先看一下思维导图&#xff1a; 1.增加操作 1.新建&#xff1a; fn creatElement(标签名) 创建元素节点 fn setAttribute&#xff08;name,value&#xff09;直接设置…

JS中DOM元素的操作

一、DOM元素的获取 1&#xff09;document.getElementsByClassName ( “class”) 返回集 htmlcollection ,用法和数组一致 说明: class为DOM元素上class属性的值 2&#xff09;document.getElementById( “id” ) 功能:返回对拥有指定ID的第一个对象的引用 返回值: DOM对象 说明…

java锁结构之无锁偏向锁轻量级锁重量级锁

一、对象的本质&#xff08;锁在对象中的体现&#xff09; 1.1、对象的结构 对象由多部分构成的&#xff0c;对象头、属性字段、补齐字段等。补齐字段是指如果对象总大小不是4字节的整数倍&#xff0c;会填充上一段内存地址是之成为4的整数倍。 其中&#xff0c;对象头在对象…

简单理解重量级锁、轻量级锁、偏向锁

全文使用synchronized来说明。 synchronized给对象上锁&#xff0c;先上偏向锁&#xff0c;在上轻量级锁&#xff0c;最后上重量级锁。上什么锁&#xff0c;是jvm根据竞争程度自行变换的。 重量级锁 计算机操作系统本有Monitor对象&#xff0c;称为管程。在java里面看不到此对…

synchronized锁升级之偏向锁

目录 一、什么是偏向锁&#xff1f; 二、偏向锁原理 三、偏向锁演示 四、偏向锁的处理流程 五、偏向锁的撤销 六、偏向锁的好处 一、什么是偏向锁&#xff1f; HotSpot作者经过研究实践发现&#xff0c;在大多数情况下&#xff0c;锁不仅不存在多线程竞争&#xff0c;而…

Java无锁、偏向锁、轻量级锁、重量级锁,锁升级过程

2. 锁 2.1 无锁 Java对象刚创建时还没有任何线程来竞争&#xff0c;说明该对象处于无锁状态&#xff08;无线程竞争它&#xff09;&#xff0c;这时偏向锁标识位是0&#xff0c;锁状态是01 。 2.2 偏向锁 偏向锁是指一段同步代码一直被同一个线程所访问&#xff0c;那么该…

偏向锁的获取和撤销详解

Java SE 1.6 为了减少获得锁和释放锁带来的性能消耗&#xff0c;引入了偏向锁和轻量级锁&#xff1b;在Java SE 1.6 中&#xff0c;锁共有4种状态&#xff0c;级别从底到高依次是&#xff1a;无锁状态、偏向锁状态、轻量级锁和重量级锁状态&#xff0c;这几种状态会随着竞争情况…

一篇文章说清 :无锁、偏向锁、轻量级锁、重量级锁

文章目录 前言一、无锁二、偏向锁三、轻量级锁&#xff08;自选锁&#xff09;四、重量级锁锁升级场景 前言 JDK1.6为了减少获得锁和释放锁所带来的性能消耗&#xff0c;引入了“偏向锁”和“轻量级锁”&#xff0c;所以在JDK1.6里锁一共有四种状态&#xff0c;无锁状态&#x…

synchronized的偏向锁、轻量级锁和重量级锁

文章目录 Java对象头偏向锁批量重偏向批量撤销 轻量级锁重量级锁Monitor 原理 Java对象头 普通对象 Mark Word在64 位虚拟机中的结构为 Mark Word后三&#xff08;两&#xff09;位表示 001&#xff1a;无锁状态101&#xff1a; 偏向锁00&#xff1a; 轻量级锁10&#xff1a…

Java synchronized偏向锁、轻量级锁、重量级锁

简介 synchronized锁共有偏向锁、轻量级锁、重量级锁三种类型&#xff0c;而这三种类型的加锁方式都是相同的&#xff0c;写代码时不用考虑加哪种锁。使用锁时对象首先会变为偏向锁状态&#xff0c;当有其它线程获取锁时会升级为轻量级锁&#xff08;没有竞争锁&#xff09;&am…

java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

之前做过一个测试&#xff0c;详情见这篇文章《多线程 1操作的几种实现方式&#xff0c;及效率对比》&#xff0c;当时对这个测试结果很疑惑&#xff0c;反复执行过多次&#xff0c;发现结果是一样的: 1. 单线程下synchronized效率最高&#xff08;当时感觉它的效率应该是最差…

偏向锁、轻量级锁、重量级锁的区别和解析

为了换取性能&#xff0c;JVM在内置锁上做了非常多的优化&#xff0c;膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题&#xff0c;几种锁的分配和膨胀过程&#xff0c;有助于编写并优化基于锁的并发程序。 内置锁的分配和膨胀过程较为复杂&…