事件与定时器
事件
事件监听
什么是事件
事件是在编程时系统内发生的动作或者发生的事情
,比如点击按钮 click ,焦点事件 focus
什么是事件监听
就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 注册事件
语法
元素.addEventListener('事件',要执行的函数)
事件监听三要素
-
事件源: 那个
dom元素被事件触发了,要获取dom元素 -
事件: 用什么方式触发,比如鼠标单击
click、鼠标经过mouseover等 -
事件调用的函数: 要做什么事
注意
事件类型要加引号
函数是点击之后再去执行,每次点击都会执行一次
我们只是传递一个当事件触发之后的处理函数,但是函数并不是开发者直接调用的,而是事件处理机制监听到事件触发之后再调用的
如果为元素重复绑定同一个事件,那么后面绑定的事件会覆盖前面的事件 => 不允许为元素绑定同名事件
监听版本
事件源.on事件 = function() { }
不能设置在什么阶段触发事件:事件捕获、事件冒泡
let btn = document.querySelector('button')
btn.onclick = function() {
console.log(123);
};
btn.onclick = function() {
console.log(456);
};
最终输出456,123被覆盖了。
事件源.addEventListener(事件,事件处理函数)
有兼容性,IE678不兼容
btn.addEventListener('click', function() {
console.log(123);
})
btn.addEventListener('click', function() {
console.log(123);
})
最终输出123456。
事件类型
-
click:鼠标单击 -
dblclick:鼠标双击 -
mouseenter:鼠标进入 -
mouseleave:鼠标离开 -
keydown:按键按下 -
keyup:按键松开 -
focus:聚焦事件 -
blur:失焦事件 -
input:内容改变事件 -
change:-
普通的输入框:内容改变同时失焦
-
对于
file:文件选择完毕之后
-
定时器
定义
每隔一段时间需要自动执行一段代码,不需要我们手动去触发
let timeId = setinterval()
分类
-
间歇函数
setInterval(函数,时间) -
一次性函数
setTimeout(函数,时间)
注意:
函数名字不需要加括号
定时器返回的是一个id数字
关闭定时器
clearInterval(定时器变量名)
总结
习题解析
全选反选案例
效果如上图所示,点击全选框后下面的复选框都会被选中,全选字样改为取消;点击单个复选框时全选框无变化,复选框全被点击后全选框被勾选,取消字样改为全选。
题目解析:
-
获取元素,总共要获取三个元素,
span标签、全选框与复选框。 -
为全选框绑定点击事件,触发点击事件后执行回调函数:
-
获取全选框的选中状态
.checked。 -
让所有复选框的选中状态等于全选框的选中状态,从而实现点击全部选中和取消。
-
三元表达式判断,更改
span标签的文本。
-
-
利用循环遍历获取所有复选框的伪数组,得到每一项
dom元素,为其绑定点击事件,触发事件后执行回调函数:-
设置一个变量
flag,用于判断是否所有复选框都被选中,初始值为true,默认为都被选中了。 -
再次循环所有复选框,同时进行判断,只要有一个复选框没被选中,则把
flag改为false。 -
让全选框的选中状态等于
flag。
-
代码展示:
// 获取事件源
let checkAll = document.querySelector('#checkAll')
let cks = document.querySelectorAll('.ck')
let all = document.querySelector('.all')
// 点击全选框后判断全选框的选中状态
checkAll.addEventListener('click', function() {
let status = this.checked
cks.forEach(ele => {
ele.checked = status
})
all.innerHTML = status ? '取消' : '全选'
})
// 利用forEach进行循环遍历判断每个复选框的选中状态
cks.forEach(element => {
element.addEventListener('click', function() {
let flag = true
cks.forEach(ele => {
if (ele.checked === false) {
flag = false
}
})
all.innerHTML = flag ? '取消' : '全选'
checkAll.checked = flag ? true : false
})
})
随机点名-定时器版
效果如上图所示,点击开始按钮框内自动刷新名字,点击结束按钮停止刷新。重复这几步直到全部名字都被选中。
题目解析:
-
获取事件源开始按钮、结束按钮与框框;定义一个数组
names存放好名字数据;定义一个全局变量index与一个全局变量timeId。 -
点击开始按钮时,触发点击事件,执行回调函数:
-
设置定时器,用变量
timeId存储,设置函数与时间。 -
用变量
index用于接收随机数,作为数组的索引下标。 -
框框的文本内容等于数组中被选到的名字。
-
禁用开始按钮,解除结束按钮的禁用。
-
-
点击结束按钮时触发点击事件执行回调函数:
-
清除定时器,语法为
clearTnterval()。 -
禁用结束按钮,解除开始按钮的禁用。
-
把选中的名字从数组中删除,用到的知识点是
arr.splice(要删除的索引值,删除几个)。由于前面把定时器变量与索引值变量放到全局作用域中声明,因此这里能够引用到。如果放到开始按钮点击事件的回调函数中声明,则这几步会报错,提示变量index未声明。 -
判断数组长度,如果数组长度为0说明全部被选中,禁用两个按钮,框框内给出提示。
-
代码展示:
// 获取事件源
let btns = document.querySelectorAll('button')
let p = document.querySelector('p')
// 设置一个数组存放名字
let names = ['andy', 'baby', 'cady', 'dady', 'elly', 'faby', 'galy']
// 声明两个全局变量,index存储数组索引,timeId存储定时器,这样两个函数都能使用
let timeId
let index
btns[0].addEventListener('click', function() {
btns[1].disabled = false
this.disabled = true
timeId = setInterval((v, i) => {
index = Math.floor(Math.random() * names.length)
p.innerText = names[index]
})
})
btns[1].disabled = true
btns[1].addEventListener('click', function() {
btns[0].disabled = false
this.disabled = true
clearInterval(timeId)
names.splice(index, 1)
console.log(names);
if (names.length === 0) {
btns[0].disabled = true
}
})