在变量声明的过程中给我们通常用let
来声明变量,但是有些变量后续并不需要被改变,这样我们为什么不用const
来声明呢,实际上,在react
框架中,也基本上用const
来声明变量,而且const
的语义化更好我们可以先用const
来声明,如果后续需要改变,我们再改为let
。
这里注意一个点哦,数组和对象这种比较复杂的数据类型用const定义后也可以对其进行增加或者删除,但是不可以把另一个新数组赋值给他。
这里需要解释一下栈堆的一些只是,复杂数据类的数据存储在堆里,像数组名指向栈里面的地址,而地址指向了堆里面的数组,你追加或者删除了东西,数组还是那个数组,地址没有改变,数组也相当于没有改变,所以用const不会报错,而赋值新数组则是一个新数组在堆区开辟了一块空间,然后这块空间对应的栈区的地址赋值给了数组,数组地址发生了改变,当然数组也就改变了,就会报错。
作用:使用JS区操作html和浏览器
分类:DOM (文档对象模型)、BOM(浏览器对象模型)
简单来说就是浏览器提供的一套操作网页内容的功能,用于开发网页特效和实现用户交互
将HTML文档以树状结构表现出来。
浏览器根据html标签生成的JS对象
- 所有标签属性可以在这个对象上面找到
- 修改这个对象的属性会直接映射到标签上
核心思想就是把网页当作对象来处理,
document是DOM里面最大的一个对象,所以它提供的属性和方法都是用来访问和操作网页内容的,网页的所有内容都在document里面
语法:
| document.querySelector('css选择器') |
我们直接从例子来看
| <style> .box{ width: 100px; height: 100px; background-color: red; } </style> </head> <body> <div class = "box">123</div> <div class="box">abc</div> <script> const box = document.querySelector('div') console.log(box) </script> </body> |
从例子中我们可以发现,获取只有匹配的第一个元素,注意返回值的对象。
当然我们也可以更改一下元素属性值
| <body> <div class = "box">123</div> <div class="box">abc</div> <script> const box = document.querySelector('div') box.style.backgroundColor = 'green' console.log(box) </script> </body> |
语法
返回值是匹配的NodeList对象的集合
我们看例子
| <body> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> <script> const lis = document.querySelectorAll('li') console.log(lis) </script> </body> |
那么我能堆其中元素进行修改吗,是比可以直接实现的,但是可以通过遍历来实现,
注意通过这样获取的返回值是一个伪数组
这里得到的是一个有长度有索引号的数组但是没有pop() push()等数组方法,但是要获得里面的每一个对象还是要通过for来遍历。
| for(let i = 0;i < lis.length;i++){ console.log(lis[i]) } |
目标:能够修改元素的文本更换内容。
| <body> |
| <div class="box">我是文字内容</div> |
| <script> |
| |
| let box = document.querySelector('.box') |
| |
| console.log('box.innerText'); |
| box.innerText = '<strong>原神,启动!</strong>' |
| console.log('box.innerText'); |
| </script> |
| </body> |
注意这里是不识别标签的。那么有没有能解析标签的呢,有的有的兄弟,那就是用innerHTML
来修改
| <body> |
| <div class="box">我是文字内容</div> |
| <script> |
| |
| let box = document.querySelector('.box') |
| |
| console.log('box.innerText'); |
| box.innerHTML = '<strong>原神,启动!</strong>' |
| console.log('box.innerText'); |
| </script> |
| </body> |
目标:操作元素的常用属性,样式属性,表单元素属性以及自定义属性
常见属性比如:href、title、src等
语法:
我们来找点栗子
| <body> |
| <h1>明年今日</h1> |
| <img src = "https://ttdr-img.oss-cn-shanghai.aliyuncs.com/i/20250211201345662.png" alt=""> |
| <script> |
| |
| const img = document.querySelector('img') |
| |
| img.src = "https://ttdr-img.oss-cn-shanghai.aliyuncs.com/i/20250211201408784.png" |
| img.title = '明年今日' |
| </script> |
| </body> |
这里我们有三种途径来操作css,
语法:
举例:
| <style> div{ width: 100px; height: 100px; background-color: red; } </style> </head> <body> <div></div> <script> const div = document.querySelector('div') div.style.width = '200px' div.style.backgroundColor= 'green' </script> </body> |
注意:如果输入background-color中间的小短线会识别为破折号,这里需要小驼峰命名法来实现修改背景颜色
如果修改的样式比较多,直接通过style属性修改比较繁琐,我们可以通过css类名的形式
语法:
注意:
- 由于
class
是关键字所以要用className
来代替
className
是通过新值换旧值,如果需要添加一个新的类,需要保留之前的类名
栗子:
| <style> |
| div{ |
| width: 100px; |
| height: 100px; |
| background-color: red; |
| } |
| .box{ |
| width: 300px; |
| height: 300px; |
| border: 1px solid red; |
| margin: 100px auto; |
| padding: 10px; |
| background-color: aquamarine; |
| } |
| </style> |
| </head> |
| |
| <body> |
| <div></div> |
| <script> |
| |
| const div = document.querySelector('div') |
| |
| div.className = 'box' |
| </script> |
| </body> |
为了解决className
容易覆盖以前的类名,我们可以通过classList
来追加或者删除类名
语法
| |
| 元素.classList.add('类名') |
| |
| 元素.classList.remove('类名') |
| |
| 元素.classList.toggle('类名') |
我们来看例子
| <style> |
| .box{ |
| width: 300px; |
| height: 300px; |
| color: red; |
| } |
| .active{ |
| color: blue; |
| background-color: yellow; |
| } |
| </style> |
| </head> |
| |
| <body> |
| <div class="box">我是文字</div> |
| <script> |
| |
| const box = document.querySelector('.box') |
| box.classList.add('active') |
| </script> |
| </body> |
注意:add()里面类名不加点而且是字符串
表单有很多情况,也需要修改属性,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框,具体操作方法差不多我们直接上栗子
| <body> |
| <input type="text" value="ttdr"> |
| <script> |
| |
| const uname = document.querySelector('input') |
| |
| console.log(uname.value) |
| uname.value = 'ttdr2' |
| console.log(uname.type) |
| uname.type = 'password' |
| </script> |
| </body> |
获得值用的是value
。
表单属性添加就有效果,移除就没效果,一律使用布尔值表示,如果true代表添加了该属性false表示移除了该属性。比如:disabled、checked、selected
我们来看栗子
| <body> |
| <input type="checkbox" checked> |
| <script> |
| const ipt = document.querySelector('input') |
| ipt.checked = true |
| </script> |
| </body> |
在H5中推出的专门的data-自定义属性,这些属性一律是以data开头,在DOM对象上一律以dataset对象获取方式获取
上栗子了
| <body> <div data-id="1" data-game="???">1</div> <div data-id="2">2</div> <div data-id=3>3</div> <div data-id="4">4</div> <div data-id="5">5</div> <script> const one = document.querySelector('div') console.log(one.dataset) console.log(one.dataset.id) </script> </body> |
目标:了解使用场景
网页中通常需要一个功能,间隔一段时间会自动执行一段代码,不需要我们手动去出发,例如网页中的倒计时,要实现这种需求需要定时器函数,具体由两种,这里仅讲解定时器函数
语法:
作用每间隔多少时间调用一下这个函数,间隔的时间单位是毫秒
举例:
| <body> |
| <script> |
| setInterval(function(){ console.log('一秒来一次');},1000) |
| function fn(){ |
| console.log('一秒来一次'); |
| } |
| setInterval(fn,1000) |
| </script> |
| </body> |
这里定时器实际上是由返回值的,返回值是一个id数字,每个定时器的id数字是独一无二的,为了防止多个定时器之间的干扰,我们这里需要让返回的数字个性化一些,这样方便我们辨别
| let n = setInterval(fn,1000) |
这里没有用const,定时器需要开和关,所以值可能会变
我们定时器不能一直开着,我们有些时候我们需要关闭定时器。
语法:
看看例子:
| <body> <script> setInterval(function(){ console.log('一秒来一次');},1000) function fn(){ console.log('一秒来一次'); } let n = setInterval(fn,1000) clearInterval(n) </script> </body> |
当然我们并不会定时器刚开始就关闭,通常会加一些条件。
## 抽奖案例
抽奖案例,我们从数组中抽取一等奖二等奖,三等奖,并显示到对应的标签里面去,同时要求抽奖结果不重复
我们这里主要锻炼的是上面所学,所以我们先给一个死的模板
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>抽奖案例</title> <style> .wrapper { width: 840px; height: 420px; background: url(http://www.ttdr.top/wp-content/uploads/2025/01/cropped-cropped-8ace47468cb8ea5d7e0717a2f641342b-1.jpg) no-repeat center / cover; padding: 100px 250px; box-sizing: border-box; } .wrapper h1, .wrapper h3, .wrapper h5 , strong{ color: red; } </style> </head> <body> <div class="wrapper"> <strong>抽奖案例</strong> <h1>一等奖:<span id="one">???</span></h1> <h3>二等奖:<span id="two">???</span></h3> <h5>三等奖:<span id="three">???</span></h5> </div> </body> </html> |
案例实现
| |
| <body> |
| <div class="wrapper"> |
| <strong>抽奖案例</strong> |
| <h1>一等奖:<span id="one">???</span></h1> |
| <h3>二等奖:<span id="two">???</span></h3> |
| <h5>三等奖:<span id="three">???</span></h5> |
| </div> |
| <script> |
| const personArr = ['陈奕迅','毛不易','周传雄','薛之谦','赵英俊'] |
| |
| |
| const random = Math.floor(Math.random() * personArr.length) |
| console.log(personArr[random]); |
| |
| const one = document.querySelector('#one') |
| one.innerHTML = personArr[random] |
| |
| personArr.splice(random,1) |
| |
| |
| const random2 = Math.floor(Math.random() * personArr.length) |
| console.log(personArr[random2]); |
| |
| const two = document.querySelector('#two') |
| two.innerHTML = personArr[random2] |
| |
| personArr.splice(random2,1) |
| |
| |
| const random3 = Math.floor(Math.random() * personArr.length) |
| console.log(personArr[random3]); |
| |
| const three = document.querySelector('#three') |
| three.innerHTML = personArr[random3] |
| |
| personArr.splice(random3,1) |
| </script> |
| </body> |
需求:刷新页面的时候页面中随机显示不同的图片
PS :这里博主通过部署了图床来实现图片存储并非在本地
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>网页刷新换图案例</title> |
| <style> |
| |
| </style> |
| </head> |
| |
| <body> |
| <img src="" alt=""> |
| <script> |
| function getRandom(N,M){ |
| return Math.floor(Math.random() * (M - N + 1)) + N |
| } |
| const arr = ['20250211202546919','20250211202609273','20250211202707901','20250211202524095','20250211202503154','20250211202408770'] |
| const random = getRandom(0,arr.length - 1) |
| |
| const img = document.querySelector('img') |
| |
| img.src = `https://ttdr-img.oss-cn-shanghai.aliyuncs.com/i/${arr[random]}.png` |
| </script> |
| </body> |
| |
| </html> |
| <body> |
| <textarea name="" id="" cols="30" rows="10"> |
| 欢迎您使用腾讯统一身份产品及服务!为使用腾讯统一身份产品(以下统称“本产品”)及服务(以下统称“本服务”),您应当阅读并遵守《腾讯统一身份用户服务协议》(以下简称“本协议”),以及 《腾讯服务协议》、 《腾讯隐私政策》、 《腾讯统一身份隐私保护指引》。 请您在注册成为腾讯统一身份用户前务必审慎阅读、充分理解各条款内容,特别是免除或者限制腾讯责任的条款、对用户权利进行限制的条款、约定争议解决方式和司法管辖的条款等,以及开通或使用某项服务的单独协议。限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您应重点阅读,如果您对协议有任何疑问,请联系我们进行咨询。除非您已阅读并接受本协议所有条款,否则您无权使用腾讯统一身份服务。您的注册、登录、发布信息等行为即视为您已阅读并同意本协议的约束。如果您因年龄、智力等因素而不具有完全民事行为能力,请在法定监护人(以下简称"监护人")的陪同下阅读和判断是否同意本协议。如果您是中国大陆地区以外的用户,您订立或履行本协议以及使用本服务的行为还需要同时遵守您所属和/或所处国家或地区的法律。 |
| </textarea> |
| <br> |
| <button id="btn" disabled>我已阅读用户协议(5s)</button> |
| <script> |
| |
| const btn = document.querySelector('#btn') |
| |
| let i = 5 |
| let n = setInterval(function () { |
| i-- |
| btn.innerHTML = `我已阅读用户协议(${i}s)` |
| if(i === 0){ |
| clearInterval(n) |
| btn.disabled = false |
| } |
| },1000) |
| </script> |
| </body> |