TypeScript Dom操作

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

文章目录

  • 介绍
  • 获取元素
  • 类型断言
  • 获取多个DOM元素
  • 操作文本内容
  • 操作样式
  • 操作事件

介绍

DOM 是浏览器提供的(浏览器特有),专门用来操作网页内容的一些JS对象(API)

通过DOM操作,可以让Js/Ts控制页面((HTML)内容,让页面“动”起来,从而实现web开发

HTML标签和DOM的关系:每个HTML标签都有对应的DOM对象

DOM操作的套路(技巧)︰先找到 后修改

1、我们来看一个简单例子。首先我们在终端运行tsc --watch hello.ts
2、然后在根目录新建 demo.html,引入生成的 hello.js

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>标题</title><link rel="stylesheet" href="public/css/bootstrap.css"><script src="hello.js"></script>
</head>
<body>
</body>
</html>

3、在 hello.ts 中修改网页标题

//document对象:文档对象(整个页面),是操作页面内容的入口对象
document.title = 'TS学习'

4、运行 demo.html,发现标题已经变了
在这里插入图片描述

获取元素

1、queryselector (selector):获取某一个DOM元素
document 对象:文档对象(整个页面),是操作页面内容的入口对象
selector 参数:是一个css选择器(标签、类、id选择器等)
作用:查询(获取)与选择器参数匹配的 DOM元素,但是,只能获取到第一个!
推荐:使用id选择器(唯一)

例如:获取页面中 id 为 title 的 DOM元素

let title = document.queryselector ( '#title ')

demo.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>标题</title><link rel="stylesheet" href="public/css/bootstrap.css">
</head>
<body>
<h1 id="title">发如雪</h1>
<p class="c1">狼牙月 伊人憔悴</p>
<p class="c1">我举杯 饮尽了风雪</p>
<script src="hello.js"></script>
</body>
</html>

hello.ts

let title = document.querySelector("#title")
console.log(title)

运行 demo.html 打印出了 h1 标签
在这里插入图片描述
修改 hello.ts

// 都只能获取第一个 p 标签
let title = document.querySelector("p")
// let title = document.querySelector("c1")
console.log(title)

在这里插入图片描述

2、queryselectorAll (selector)作用:同时获取多个DOM元素

类型断言

调用queryselector()通过 id 选择器获取 DOM元素时,拿到的元素类型都是Element,因为无法根据 id 来确定元素的类型,所以该方法就返回了一个宽泛的类型:元素(Element)类型

不管是 h1 还是 img 都是元素。但这样导致新问题:无法访问 img 元素的src属性了。因为 Element 类型只包含所有元素共有的属性和方法(比如: id属性)

解决方式:使用类型断言,来手动指定更加具体的类型(比如,此处应该比 Element 类型更加具体)。使用as指定更具体的类型
index.html中

<body><h1 id="title">发如雪</h1><image id="image" src="./1.png"></image><script src="hello.js"></script>
</body>

hello.ts中

//获取h1元素
let title = document.querySelector("#title")
//获取img元素
let img = document.querySelector("#image") as HTMLImageElement
img.src = './2.png'

解释:我们确定id="image"的元素是图片元素,所以,我们将类型指定为HTMLImageElement

技巧:通过console.dir()打印DOM元素,在属性的最后面,即可看到该元素的类型

let title = document.querySelector("#title")
console.dir(title)

在这里插入图片描述

获取多个DOM元素

使用:document.queryselectorAll(selector)可以获取所有与选择器参数匹配的DOM元素,返回值是一个列表

推荐:使用 class 选择器

示例:let list = document.queryselectorAll('.a')可以获取页面中所有 class 属性包含 a 的元素

<p class="a">狼牙月 伊人憔悴</p>
<p class="b">我举杯 饮尽了风雪</p>
<p class="a c">是谁打翻前世柜 惹尘埃是非</p>
<script src="hello.js"></script>
let list = document.querySelectorAll(".a")
console.log(list)

在这里插入图片描述

操作文本内容

//读取
dom.innerText
//设置
dom.innerText = ‘xxx’

注意:需要通过类型断言来指定DOM元素的具体类型,才可以使用innerText属性

<h1 id="title">发如雪</h1>
let title = document.querySelector("#title") as HTMLHeadingElement
console.log(title.innerText)
title.innerText = '东风破'

在这里插入图片描述
注意:设置内容时,会覆盖原来的内容,如果想实现追加内容可以:

title.innerText += '东风破'

练习:给每个p标签前增加索引
原来 html

<p class="a">狼牙月 伊人憔悴</p>
<p class="b a">我举杯 饮尽了风雪</p>
<p class="a c d">是谁打翻前世柜 惹尘埃是非</p>
let list = document.querySelectorAll('.a')
list.forEach(function (item,index) {let p = item as HTMLParagraphElementp.innerText = "[" + index + "]" + p.innerText
})

在这里插入图片描述

操作样式

方式一
dom.style属性:行内样式操作,可以设置每一个样式属性(比如,字体大小、文字颜色等)

说明:所有的样式名称都与 css 相通,但命名规则为驼峰命名法

dom.style.fontSize = '30px'
dom.style.display = 'none'

我们来在代码中练习一下

<p id="txt">狼牙月 伊人憔悴</p>
let p = document.querySelector('#txt') as HTMLParagraphElement
//读取
console.log("字体大小:" + p.style.fontSize)
//设置
p.style.fontSize = '30px'
p.style.color = 'red'
console.log("字体大小:" + p.style.fontSize)

在这里插入图片描述
在这里插入图片描述
开始没有打印出字体大小,因为我们还没设置,设置后再打印就有值了

方式二
dom.classList属性:类样式操作,也就是操作类名,比如,添加类名、移除类名等。它包含三个常用方法:添加、移除、判断是否存在

【添加】
dom.classList.add(类名1,类名2,...)

参数表示:要添加的类名,可以同时添加多个

比如:
<p class="a"></p>
dom.classList.add ( 'b ', 'c')
就是添加 class 样式为 class=“a b c”

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>标题</title><link rel="stylesheet" href="public/css/bootstrap.css"><style>.a {font-size: 30px;}.b {color: green;}.c {background-color: skyblue;}</style>
</head>
<body>
<p id="txt" class="a">狼牙月 伊人憔悴</p>
<script src="hello.js"></script>
</body>
</html>
let p = document.querySelector('#txt') as HTMLParagraphElement
p.classList.add('b','c')

在这里插入图片描述
【移除】
dom.classListremove(类名1,类名2, ...)

参数表示:要移除的类名,可以同时移除多个。

比如:
<p class="a b c"></p>
dom.classList,remove ( 'a', 'c')
那么移除 class 样式后就变成了 class=“b”

还是上边的 html,我们把 class a 移除

let p = document.querySelector('#txt') as HTMLParagraphElement
p.classList.remove('a')

在这里插入图片描述
【判断类名是否存在】
let has = dom.classList.contains(类名)

参数表示:要判断存在的类名

比如:
<p class="b"></p>
dom.classList.contains( 'a' )//false
dom.classList.contains ('b')//true

还是刚才的 html

let p = document.querySelector('#txt') as HTMLParagraphElement
console.log(p.classList.contains('a'))//true

操作事件

在浏览网页时,我们经常会通过移入鼠标、点击鼠标、敲击键盘等操作,来使用网站提供的功能。如果要让我们自己实现这样的功能,就需要通过操作事件来实现
实际上,移入鼠标、点击鼠标、敲击键盘等,都是常见的DOM事件

操作事件的两个方法:
addEventListener添加(绑定)事件
removeEventListener移除(解绑)事件

addEventListener添加事件
dom. addEventListener (事件名称,事件处理程序)
作用:给DOM元素添加事件
事件名称:字符串,比如: click(鼠标点击事件)、 mouseenter(鼠标进入事件)
事件处理程序:回调函数、指定要实现的功能,该函数会在触发事件时调用

示例:鼠标点击按钮,打印内容

btn.addEventListener('click', function() {console.log ('鼠标点击事件触发了')
})

实践一下,我们给 button 绑定点击事件

<button id="btn">点我打印</button>
let btn = document.querySelector('#btn')
btn.addEventListener('click',function () {console.log("点击事件触发了")
})

在这里插入图片描述
也可以绑定鼠标移入事件

btn.addEventListener('mouseenter',function () {console.log("鼠标移入事件触发了")
})

在这里插入图片描述
事件对象(event),是事件处理程序(回调函数)的参数,表示与当前事件相关的信息,比如:事件类型(type)、触发事件的DOM元素(target)等

比如:

btn.addEventListener ( 'click ', function (event){console.log (event.type)//clickconsole.log(event.target)//btn元素
})

来做个练习,点击按钮让文字变大
在这里插入图片描述

<button id="btn">点我变大</button>
let btn = document.querySelector('#btn')
btn.addEventListener('click', function (event) {console.log(event.type)//clickconsole.log(event.target)//btn元素let target = event.target as HTMLButtonElementtarget.style.fontSize = '30px'
})

同时,控制台输出了
在这里插入图片描述
removeEventListener移除(解绑)事件
dom.removeEventListener(事件名称,事件处理程序)
作用:移除给DOM元素添加的事件,移除后,事件就不再触发了
事件名称:同添加事件的第一个参数
事件处理程序:必须要跟添加事件时的事件处理程序是同一个,否则无法移除!

正确方式:

function handleclick () { }
btn.addEventListener('click ', handleclick)
btn.removeEventListener('click', handleclick)

说明:添加和移除事件时,事件处理程序是同一个,都是函数 handleclick

错误演示:

btn.addEventListener ( 'click ' , function () { })
btn.removeEventListener ( 'click ', function () { })

注意:以上两个函数虽然长的一样,却是不同的函数(双胞胎,不是同一个人)

<button id="btn">点我</button>
<button id="remove">移除上面按钮click事件</button>
let btn = document.querySelector('#btn')
let removeBtn = document.querySelector('#remove')function handleClick() {console.log("click事件触发了")
}btn.addEventListener('click', handleClick)
removeBtn.addEventListener('click', function () {btn.removeEventListener('click', handleClick)
})

在这里插入图片描述
如果事件只需要触发—次,可以在添加事件时处理,即传入第三个参数,将once属性设置为trueonce如果值为 true,会在触发事件后,自动将事件移除,达到只触发一次的目的

btn.addEventListener ( 'click', function () {}, { once: true })
let btn = document.querySelector('#btn')btn.addEventListener('click', function () {console.log("click事件触发了")
}, {once: true})

在这里插入图片描述
函数声明形式的事件处理程序说明

可以先使用函数,再声明函数
原因:函数声明在当前 ts 文件中的任意位置都有定义,所以可以先调用,再声明

btn.addEventListener ( 'click ', handleclick)
function handleclick() { }

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

相关文章

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;有助于编写并优化基于锁的并发程序。 内置锁的分配和膨胀过程较为复杂&…

偏向锁是什么

偏向锁操作流程偏向锁&#xff0c;顾名思义&#xff0c;它会偏向于第一个访问锁的线程&#xff0c;如果在接下来的运行过程中&#xff0c;该锁没有被其他的线程访问&#xff0c;则持有偏向锁的线程将永远不需要触发同步 但是从我们跑的代码输出却看不到偏向锁这个东东。为啥对…

偏向锁的基本原理

偏向锁的基本原理 前面说过&#xff0c;大部分情况下&#xff0c;锁不仅仅不存在多线程竞争&#xff0c;而是总是由同一个线程多次获得&#xff0c;为了让线程获取锁的代价更低就引入了偏向锁的概念。怎么理解偏向锁呢&#xff1f;当一个线程访问加了同步锁的代码块时&#xff…

偏向锁,轻量级锁,重量级锁的核心原理

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章是关于并发编程中偏向锁&#xff0c;轻量级锁&#xff0c;重量级锁的核心原理知识记录。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适…

深入探究synchronize锁机制

synchronized 有三种方式来加锁&#xff0c;分别是&#xff1a; **1. 修饰实例方法&#xff1a;**作用于当前实例加锁&#xff0c;进入同步代码前要获得当前实例的锁 **2. 静态方法&#xff1a;**作用于当前类加锁&#xff0c;进入同步代码前要获得当前类的锁 **3. 修饰代码块&…