1.获取元素
语法:
document.querySelsctor('css选择器')
只能获取符合条件的第一个元素,可以对其修改
document.querySelsctorALL('css选择器')
可以获取符合条件的所有元素,得到的是伪数组,需要遍历得到每一个元素
2.操作元素内容
语法:
元素.innerText =
只能识别文本,不能解析标签
元素.innerHTML =
能是被文本,也能解析标签
3.操作元素属性
3.1 操作元素常用属性
语法:对象.属性 = 值
实例:
// 获取元素 const pic = document.querySelector('img) // 操作元素 pic.src = '图片.jpg' pic.title = '周杰伦的图片'
3.2 操作元素样式属性
1.通过style属性操作CSS;
语法:对象.style.样式属性 = 值
实例:
// 获取元素 const box = document.querySelector('类名') // 操作元素 box.style.width = '200px' box.style.backgroundColor = 'pink'
2.操作类名操作CSS;
语法:元素.className = '.box'
注意:使用className可以同时修改多个样式,直接使用className赋值会覆盖之前的类名
3.通过clssList操作类控制CSS
语法:
// 追加一个类 元素.classList.add('类名') // 删除一个类 元素.classList.remove('类名') // 切换一个类 元素.classList.toggle('类名')
4. 操作表单元素
获取:DOM对象.属性名
设置:DOM对象.属性名 = 新值
5.自定义属性
在标签上一律以‘’data-名字‘’开头
在DOM对象上一律以dataset对象方式获取
<body> <div class="box" data-id="10">盒子</div> <script> const box = document.querySelector('.box') console.log(box.dataset.id) </script> </body>
6.定时器间歇函数
语法:
开启定时器:let 变量名 = setInterval(函数,间隔时间)
关闭定时器:clearInterval(变量名)
二、第二天
1.事件监听(绑定)
语法:元素对象.addEventListener('事件类型',要执行的函数)
实例:
<button>按钮<button> <script> const btn = document.querySelector('.btn') btn.addEventListener('click',function(){ 函数执行过程 }) </script>
2.事件类型
鼠标事件:鼠标点击click;鼠标经过mouseenter;鼠标离开mouseleave
焦点事件:获得焦点focus;失去焦点blur
键盘事件:键盘按下出发Keydown;键盘抬起触发Keyup;
文本事件:用户输入事件input
3.事件对象
事件对象也是个对象,这个对象里有事件触发时的相关信息。
例如:鼠标点击事件中事件对象就存了鼠标点击那个位置等信息。
在事件绑定的回调函数的第一个参数就是事件对象,一般命名为event,ev,e
语法:元素.addEventListener('click',function(e){ 函数执行过程 })
事件对象常用属性:
type:获取当前的事件类型
clientX/clientY:获取光标相对于浏览器可见窗口左上角的位置
offsetX/offsetY:获取光标相对于当前DOM元素左上角的位置
key:用户按下的键盘键的值
4.环境对象
环境对象指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境,谁调用this就是谁
5.回调函数
如果将函数A作为参数传递给函数B时,我们就称函数A为回调函数。
三、第三天
1.事件流
事件流指的是事件完整执行过程中的流动路径。
当触发事件时会经历两个阶段,从父到子是捕获阶段,从子到父是冒泡阶段。实际工作都是使用事件冒泡为主。
2.事件捕获与冒泡
<div class="father"> <div class="son"></div> </div> <script> const father = document.querySelector('.father') const son = document.querySelector('.son') // 事件冒泡 document.addEventListener('click',function() { alert('我是爷爷') }) father.addEventListener('click',function() { alert('我是爸爸') }) son.addEventListener('click',function(e) { alert('我是儿子') // 阻止冒泡,需要借助事件对象 e.stopPropagation() }) // 事件捕获 // document.addEventListener('click',function() { // alert('我是爷爷') // },false) // father.addEventListener('click',function() { // alert('我是爸爸') // },false) // son.addEventListener('click',function() { // alert('我是儿子') // },false) </script>
3.事件解绑
<body> <button>按钮</button> <script> // 方法一 const btn = document.querySelector('button') btn.onclick = function () { alert('点击了') // 事件解绑,直接用null覆盖掉之前的值,null为空对象,之前的function也是一个对象 btn.onclick = null } // 方法二 function fn () { alert('点击了') } // 事件绑定,匿名函数无法解绑,所以要给函数命名 btn.addEventListener('click',fn) // 事件解绑 btn.removeEventListener('click',fn) </script> </body>
4.事件委托
<body> <!-- ul>li{第$个孩子}*5 --> <ul> <li>第1个孩子</li> <li>第2个孩子</li> <li>第3个孩子</li> <li>第4个孩子</li> <li>第5个孩子</li> <p>我不需要变色</p> </ul> <script> const ul = document.querySelector('ul') // 委托给父元素 ul.addEventListener('click',function (e) { // alert(1) // this.style.color = 'red' // 利用事件对象e.target,实现点击的那个对象执行操作,但是这个点击p也会变色 // e.target.style.color = 'red' // 只有点击li才会变色 if (e.target.tagName === 'LI') { e.target.style.color = 'red' } }) </script> </body>
5.阻止默认行为
<body> <form action="http://www.itcast.cn"> <input type="submit" value="免费注册"> </form> <script> const form = document.querySelector('form') form.addEventListener('submit',function (e) { // 阻止默认行为 e.preventDefault() }) </script> </body>
6.其他事件
1.页面加载事件
两种事件:
-
load事件
加载外部资源(如图片,外联CSS和JS等)加载完毕时触发的事件
监听页面所有资源加载完毕:给window添加load事件
语法:
window.addEventListener('load',function () { })
-
DOMcontentLoaded事件
当初始的HTML文档被完全加载和解析完成之后,DOMcontentLoaded事件被触发,而无需等待样式表、图像等完全加载
监听页面DOM加载完毕:给document添加DOMContentLoaded事件
语法:
document.addEventListener('DOMContentLoaded', function () {})
2.页面滚动事件
-
scroll事件
监听整个页面滚动:给window或document添加scroll事件
语法:
window.addEventListener('scroll', function () {})
监听某个元素内部滚动直接给某个元素加scroll事件即可
-
scrollTop监测滚动距离
// 给整个页面加,也可以给某个元素加 window.addEventListener('scroll', function () { console.log(document.documentElement.scrollTop) }) // document.documentElement.scrollTop获取的值为可读写的,可以给其赋值,数字型,不带单位 // document.documentElement.scrollTop = 800
3.页面尺寸事件
-
resize事件
会在窗口尺寸发生变化时触发的事件
语法:
window.addEventListener('resize',function () {})
-
clientWidth监测屏幕宽度,不包含边框
window.addEventListener('scroll', function () { console.log(document.documentElement.clientWidth) })
7.元素的尺寸与位置
-
获取宽高
offsetwidth或offsetHeight获取元素宽度或高度,包含元素自身设置的宽度、padding、border
-
获取位置
offsetLeft或offsetTop获取元素距离自己最近一级定位了的祖先元素的左或上距离,是只读属性
四、第四天
1.日期对象
-
得到当前时间
const date = new Date()
-
指定时间
const date = new Date('2024-2-29 12:00:00')
2.时间戳
// getTime,可以得到指定时间戳 const date = new Date() console.log(date.getTime) // +new Date,可以得到指定时间戳 console.log(+new Date) // Date.now(),只能得到当前时间戳 console.log(Date.now())
3.节点操作
-
查找节点
父节点: 孩子.parentNode属性
子节点: 父亲.children属性,得到的是伪数组,使用需要遍历
兄弟节点: 兄弟.nextElementSibling属性、兄弟.previousElementSibling属性
-
增加节点
语法:
document.createElement('标签名')
<body> <ul> <li>我是老大</li> </ul> <script> const ul = document.querySelector('ul') // 1.创建节点 const li = document.createElement('li') // 2.追加节点 作为最后一个子元素 ul.appendChild(li) li.innerHTML = '我是追加的li' // 3.追加节点 作为第一个子元素 // insertBefore(要插入的元素,放到哪个元素的前面) ul.insertBefore(li, ul.children[0]) </script> </body>
-
删除结点
语法:
父元素.removeChild(子元素)
<body> <ul> <li>1</li> <li>要删除的li</li> <li>2</li> </ul> <script> const ul = document.querySelector('ul') // 必须通过父元素删除节点 父元素.removeChild(子元素) ul.removeChild(ul.children[1]) </script> </body>
-
克隆节点
语法:
元素.cloneNode(true)
<body> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> <script> const ul = document.querySelector('ul') // 1.克隆节点 元素.cloneNode(true),true克隆内容,false只克隆标签没有内容 const li1 = ul.children[0].cloneNode(true) // 2.追加节点 ul.appendChild(li1) // ul.appendChild(ul.children[0].cloneNode(true)) </script> </body>
五、第五天
1、定时器-延时函数
语法:setTimeout(回调函数,等待的毫秒数)
清除延时函数:clearTimeout(setTimeout(回调函数,等待的毫秒数))
2、location对象
location的数据类型是对象,它拆分并保存了 URL 地址的各个组成部分
常用属性和方法:
href 属性获取完整的 URL 地址,对其赋值时用于地址的跳转
search 属性获取地址中携带的参数,符号 ?后面部分
hash 属性获取地址中的啥希值,符号 # 后面部分
reload 属性用来刷新当前页面,传入参数 true 时表示强制刷新
3、navigator对象
navigator的数据类型是对象,该对象下记录了浏览器自身的相关信息
常用属性和方法:
通过 userAgent 检测浏览器的版本及平台
4、histroy对象
history 的数据类型是对象,主要管理历史记录, 该对象与浏览器地址栏的操作相对应,如前进、后退、历史记录等
前进:history.go(1)
后退:history.go(-1)
5、本地存储
-
localStorage
可以将数据永久存储在本地(用户的电脑), 除非手动删除,否则关闭页面也会存在,可以多窗口(页面)共享
存储数据:localStorage.setItem(key,value)
获取数据:localStorage.getItem(key)
删除数据:localStorage.removeItem(key)
-
sessionStorage
生命周期为关闭浏览器窗口,在同一窗口(页面)下数据可以共享,用法与localStorage基本相同
-
存储复杂数据类型
本地只能存储字符串,无法存储复杂数据类型(如对象、数组),要存储复杂数据类型需要将其转换成JSON字符串,再存储到本地,到用时再将取出的字符串转换为对象
const obj = { uname: '孙燕姿', age: 18, gender: '女' } // 存 必须转换为JSON字符串存储,属性和值都有引号,且都为双引号 localStorage.getItem('obj', JSON.stringify(obj)) // 取 console.log(JSON.parse(localStorage.getItem(obj)))
六、第六天
1、正则表达式
语法:const 变量名 = /表达式/
-
text()用于判断是否有符合规则的字符串,返回的是布尔值
-
exec()用于检索(查找)符合规则的字符串,找到返回数组,否则为null
边界符:^表示匹配行首的文本以谁开始;$表示匹配行尾的文本以谁结束
console.log(/哈/.text('哈')) // true console.log(/二哈/.text('二哈哈')) // true console.log(/二哈/.text('第二哈哈')) // true // ^ 开头 console.log(/^二哈/.text('二哈哈')) // true console.log(/^二哈/.text('第二哈哈')) // false // $ 结尾 console.log(/^二哈$/.text('第二哈哈')) // false console.log(/^二哈$/.text('二哈二哈')) // false console.log(/^二哈$/.text('二哈')) // true
量词:用来设定某个模式出现的次数
// * 0次或更多次 console.log(/^哈*$/.text('')) // true console.log(/^哈*$/.text('哈')) // true console.log(/^哈*$/.text('哈哈')) // true // + 1次或更多次 console.log(/^哈+$/.text('')) // false console.log(/^哈+$/.text('哈')) // true console.log(/^哈+$/.text('哈哈')) // true // ? 0次或1次 console.log(/^哈?$/.text('')) // true console.log(/^哈?$/.text('哈')) // true console.log(/^哈?$/.text('哈哈')) // false // {n} n次 // {n,} n次或更多次 // {n,m} n到m次
字符类:
// 只要有[]中的任意一个字符都为true console.log(/[abc]/.text('baby')) // true console.log(/[abc]/.text('city')) // true console.log(/[abc]/.text('die')) // false // - 连字符,a-z表示a到z之间的所有字符 console.log(/^[a-z]$/.text('h')) // true // [a-zA-A] 表示大小写都可以 // [0-9] 表示0到9都可以 // ^ 取反,[^a-z] 表示除了小写字母以外的字符 // .匹配除换行符之外的任何单个字符
预定义:指的是某些常见模式的简写方式
\d 相当于[0-9] \D 为取反
\w 相当于[A-Za-z0-9] \W为取反
\s 相当于[\t\r\n\v\f] \S为取反
修饰符:约束正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等
i:不区分大小写
g:匹配所有满足正则表达式的结果
语法:/表达式/修饰符,console.log(/a/i.text('A')) // true