第七天
【1】修改元素属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<img src="./1 2023-07-25 160959.png" alt="" title="国际大牌">
<script src="./1-修改元素属性.js"></script>
</body>
</html>
// 1、获取元素对象
let img = document.querySelector('img')
console.log(img)
// 2、修改元素属性 元素.属性名 = 属性值
img.title = "我已更改"
img.src = "./4 2023-07-25 161142.png"
【2】修改元素样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box1 {
width: 200px;
height: 200px;
background-color: aqua;
}
.box2 {
width: 200px;
height: 200px;
border: 2px solid black;
}
.pink {
background-color: pink;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
<script src="./2-修改元素样式.js"></script>
</body>
</html>
// 1、获取元素
const box = document.querySelector('.box1')
const box2 = document.querySelector('.box2')
console.log(box)
// 2、修改元素样式1:通过style操作 样式多时,不适用
// box.style.backgroundColor = 'pink'
// box.style.width = "1200px"
// 3、修改元素样式2:通过操作class名更改样式
// className :原来的类名不复存在
// box2.className = 'pink'
// 4、修改元素样式3:classList
// 元素对象.classList.add():添加类名,保留原类名
box2.classList.add('pink')
// 移除类名
box2.classList.remove('box2')
// 类名有则删除,类名没有则添加
box2.classList.toggle('box2')
【3】修改设置表单元素属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>我同意该协议</button>
<form action="#">
<input type="text" name="" id="">
</form>
<script src="./3-修改设置表单元素.js"></script>
</body>
</html>
// 1、获取元素对象
const btn = document.querySelector('button')
// 2、设置按钮可点击 添加true/false
btn.disabled = false
ipt.type = "passeord"
【4】事件监听
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
display: none;
width: 300px;
height: 300px;
background-color: aqua;
}
</style>
</head>
<body>
<button>显示</button>
<button>隐藏</button>
<div class="box">我是一个盒子</div>
<script src="./4-事件监听.js"></script>
</body>
</html>
// 事件监听:程序检测某事件有没有发生,一旦事件发生,立刻调用一个函数作为响应
//
const start = document.querySelector('button:first-child')
const end = document.querySelector('button:nth-child(2)')
const box = document.querySelector('.box')
console.log(start, end ,box)
// 语法:元素(事件源:谁触发).addEventListener('事件(什么事件)',执行的函数(要做什么事情,事件触发一次,执行一次),冒泡或捕获(true/false))
start.addEventListener('click', function(){
box.style.display = 'block'
})
function fn() {
box.style.display = 'none'
}
end.addEventListener('click', fn)
【5】加载事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
display: none;
width: 300px;
height: 300px;
background-color: aqua;
}
</style>
<script>
// 解决方法
window.addEventListener('load', function() {
// 事件监听:程序检测某事件有没有发生,一旦事件发生,立刻调用一个函数作为响应
//
const start = document.querySelector('button:first-child')
const end = document.querySelector('button:nth-child(2)')
const box = document.querySelector('.box')
console.log(start, end ,box)
// 语法:元素(事件源:谁触发).addEventListener('事件(什么事件)',执行的函数(要做什么事情,事件触发一次,执行一次),冒泡或捕获(true/false))
start.addEventListener('click', function(){
box.style.display = 'block'
})
function fn() {
box.style.display = 'none'
}
end.addEventListener('click', fn)
})
</script>
</head>
<body>
<button>显示</button>
<button>隐藏</button>
<div class="box">我是一个盒子</div>
</body>
</html>
【6】常见的事件类型
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
height: 4000px;
}
</style>
</head>
<body>
<input type="text" name="" id="">
<script src="./6-常见的事件类型.js"></script>
</body>
</html>
// 点击事件 click
// 鼠标经过 mouseenter
// 鼠标离开 mouseleave
// 获取焦点 focus
// 失去焦点 blur
// 键盘按下/弹出 keydown\keyup
// 滚动事件 scroll
const ipt = document.querySelector('input')
ipt.addEventListener('focus',function() {
ipt.style.backgroundColor = 'pink'
})
ipt.addEventListener('blur', function() {
ipt.style.backgroundColor = 'green'
})
window.addEventListener('scroll', function() {
console.log(document.documentElement.scrollTop)
})
// resize事件 :窗口尺寸发生变化时触发的事件
【7】事件对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="./7-事件对象.js"></script>
</body>
</html>
window.addEventListener('keydown', function(e) {
// 事件对象:记录事件触发的相关信息的
// console.log('111')
// console.log(e)
if(e.key === 'Enter'){
console.log('111')
}
else {
console.log('出错')
}
})
【8】事件绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
.box {
display: none;
width: 300px;
height: 300px;
background-color: aqua;
}
</style>
<body>
<button>显示</button>
<button>隐藏</button>
<div class="box">我是一个盒子</div>
<script src="./8-事件绑定.js"></script>
</body>
</html>
// 1、获取元素
const start = document.querySelector('button:first-child')
const end = document.querySelector('button:nth-child(2)')
const box = document.querySelector('.box')
// 2、事件绑定
start.onclick = function () {
box.style.display = 'block'
}
【9】捕获冒泡
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.grandFather {
width: 1200px;
height: 1200px;
background-color: aqua;
}
.father {
width: 800px;
height: 800px;
background-color: aquamarine;
}
.son {
width: 300px;
height: 300px;
background-color: pink;
}
</style>
</head>
<body>
<div class="grandFather">
<div class="father">
<div class="son"></div>
</div>
</div>
<script src="./9-捕获冒泡.js"></script>
</body>
</html>
// 1、获取元素
const gf = document.querySelector('.grandFather')
const f = document.querySelector('.father')
const son = document.querySelector('.son')
// 2、添加事件 第三个参数默认是false即为冒泡
// true: 即为捕获 (爷爷————》爸爸————》儿子)
gf.addEventListener('click',(e) => {
alert('爷爷')
// 阻止默认冒泡/捕获的行为
e.stopPropagation()
}, true)
f.addEventListener('click',() => {
alert('爸爸')
e.stopPropagation()
}, true)
son.addEventListener('click',() => {
alert('儿子')
e.stopPropagation()
}, true)
【10】查找节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="father">
<div class="son">son1</div>
<div class="son">son2</div>
<div class="son">son3</div>
<div class="son">son4</div>
</div>
<script src="./10-查找节点.js"></script>
</body>
</html>
const father = document.querySelector('.father')
const son = document.querySelector('.son')
const son2 = document.querySelector('.two')
console.log(father)
// 查找子节点 父元素.children[]
console.log(father.children[0])
// father.childNodes 查找节点、文本、空格…… 了解即可
// 查找父节点
console.log(son.parentNode)
// 查找兄弟节点 了解即可
son2.nextElementSibling
son2.previousElementSibling
【11】克隆节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script src="./11-克隆节点.js"></script>
</body>
</html>
const ul = document.querySelector('ul')
console.log(ul.cloneNode(true))
// true代表子节点一起克隆
【12】创建节点和追加节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
</ul>
<button>点击</button>
<script src="./12-创建节点和追加节点.js"></script>
</body>
</html>
// 1、获取元素
const ul = document.querySelector('ul')
// 1:创建li
let li = document.createElement('li')
// 2:给创建的节点添加内容
li.innerHTML = `<h1>我是li</h1>`
// 3:插入
// 父元素
// 追加到父元素的最后一个子元素
ul.append(li)
// 插入到指定位置的前面
ul.insertBefore(li, ul.children[0])
const btn = document.querySelector('button')
btn.addEventListener('click', function() {
ul.insertBefore(li, ul.children[0])
})
【13】删除节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li class="three">3</li>
<li>4</li>
</ul>
<script src="./13-删除节点.js"></script>
</body>
</html>
const ul = document.querySelector('ul')
const li3 = document.querySelector('.three')
// 删除节点一定是通过父元素来
ul.removeChild(li3)
【14】定时器
// 1、setTimeout:某个函数或者某段代码(字符串格式),在多少毫秒之后执行,返回一个整数,用来标识定时器
const timer = setTimeout(function() {
console.log('111')
}, 2000);
// 2000:2秒
// console.log(timer)
const timer2 = setTimeout("alerrt('nihao')", 2000)
console.log(`timer2=${timer2}`)
const timer3 = setTimeout(function(a, b) {
console.log(a + b)
},3000, 2, 3)
// 3s之后,作为参数传入执行的函数
//
let x = 1
let obj = {
x: 2,
y: function () {
console.log(`方法打印出来的是:{$this.x}`)
}
}
// console.log(obj.y())
// setTimeout(obj.y, 2000)
// 第一个参数为对象的方法时,this指向windows,而不是obj本身
// 解决办法:
// 1、
setTimeout(function() { obj.y()}, 2000)
// 2、改变this指向
setTimeout(obj.y.bind(obj), 2000)
// 2、setInterval:函数或者一段代码,每隔一段时间,执行一次
function fn() {
console.log(111)
}
// setInterval (fn, 1000)
const timer4 = setInterval(fn, 1000)
console.log(timer4)
// 清除定时器
clearInterval(timer4)
【15】事件委托
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script src="./15-事件委托.js"></script>
</body>
</html>
const ul = document.querySelector('ul')
ul.addEventListener('click', function(e) {
e.target.style.backgroundColor = 'pink'
})
【16】箭头函数
// 简化代码,解决this问题
// 回调函数、函数表达式
// const fn = function (a, b) {
// console.log(a + b)
// }
// fn(1, 4)
// 箭头函数基本语法:() =>{}
const fn = (a, b) => {
console.log(a + b)
}
fn(2, 3)
// 只有一个参数,小括号可省略
const fn1 = a => {
console.log(a)
}
fn1('111')
// 只有一行代码,{}可省略
const fn2 = a => console.log(a)
fn2('222')
// 只有一行代码时,return可以省略
const fn3 = () => a = 3
let c = fn3()
console.log(c)
// 直接返回对象
const fn4= () => ({uname:'喜羊羊' })
【17】this指向
console.log(this)
// windows
function fn() {
console.log(this)
}
window.fn()
// 函数谁调用,指向谁
const btn =document.querySelector('button')
btn.addEventListener('click', function() {
this.style.backgroundColor = 'pink'
})
// 事件监听里边的this指向事件源
let obj = {
x: 4,
y: function () {
console.log(this)
}
}
obj.y()
// 对象方法中的this指向对象本身
setInterval(function () {
console.log(this)
}, 1000)
// this指向window
// 箭头函数中的this,箭头函数中没有this的作用域,不会创建自己的this,只会继承上一层的this
btn.addEventListener('click', () => {
console.log(this)
this.style.backgroundColor = 'pink'
})
let obj1 = {
x: 4,
y: () => {
console.log(this)
}
}
obj1.y()
// 构造函数中的this,指向构造函数实例化的对象
【18】location
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>刷新</button>
<script src="./19-location.js"></script>
</body>
</html>
location.href = "http://www.baidu.com"
document.querySelector('button').addEventListener('click', function( ){
location.reload(true)
// 强制刷新 ctrl+f5
})
【19】navigator
console.log(navigator.userAgent)
// 伪装成浏览器
【20】history
back():可以后退功能
forword():前进功能
go():1:前进一个页面 -1:后退一个页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>后退</button>
<button>前进</button>
<script src="./21-history.js"></script>
</body>
</html>
const back = document.querySelector('button:first-child')
const forword = back.nextElementSibling
back.addEventListener('click', function() {
// history.back()
history.go(-1)
})
forword.addEventListener('click', function() {
// history.forward()
history.go(-1)
})
【21】localStorage
localStorage.setItem('uname', '喜羊羊')
console.log(localStorage.getItem('uname'))
【22】剩余参数
// 剩余参数
function getSum(...arr) {
let sum = 0
for (let i = 0; i <arr.length ;i++) {
sum += arr[i]
}
return sum
}
let n = getSum(2, 3, 4, 5, 6)
console.log(n)
// 多个立即函数之间,必须添加;
(function() {
console.log('222')
})();
(function() {
console.log('333')
})()
【23】展开运算符
let arr=[1, 2, 3, 4, 5]
// 展开运算符(在外边): ...arr 如果在函数里当形参则为剩余参数
console.log(...arr)
【24】js执行机制
console.log('111')
setTimeout(function () {
console.log('222')
}, 0)
// 同步任务:一件事情未完成不去执行下一件
// 异步任务:一件事情进行时同时做另一件事情
// js是单线程。同一时刻只能执行一个任务
// js执行机制:同步任务放入执行栈执行,异步任务————》任务队列
// 等待同步任务执行完毕之后,会去任务队列,查看是否由准备好的异步任务,
// 有,则将其放入执行栈中
【25】bom:浏览器对象模型,整个浏览器页面就是bom
bom包含:dom、navigator、location、history、screen
所有通过var定义的全局变量、函数都会变成window的属性和方法
【26】块作用域
js中,被{}包含的,都是代码块,其中声明的变量可能无法被访问