Web APIs 知识总结【事件与定时器】

148 阅读5分钟

事件与定时器

事件

事件监听

什么是事件

事件是在编程时系统内发生的动作或者发生的事情 ,比如点击按钮 click ,焦点事件 focus

什么是事件监听

就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 注册事件

语法

元素.addEventListener('事件',要执行的函数)

事件监听三要素

  • 事件源: 那个 dom 元素被事件触发了,要获取 dom 元素

  • 事件: 用什么方式触发,比如鼠标单击 click 、鼠标经过 mouseover

  • 事件调用的函数: 要做什么事

注意

  1. 事件类型要加引号

  2. 函数是点击之后再去执行,每次点击都会执行一次

  3. 我们只是传递一个当事件触发之后的处理函数,但是函数并不是开发者直接调用的,而是事件处理机制监听到事件触发之后再调用的

  4. 如果为元素重复绑定同一个事件,那么后面绑定的事件会覆盖前面的事件 => 不允许为元素绑定同名事件



监听版本

事件源.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 :

    1. 普通的输入框:内容改变同时失焦

    2. 对于 file: 文件选择完毕之后



定时器

定义

每隔一段时间需要自动执行一段代码,不需要我们手动去触发

let timeId = setinterval()


分类

  1. 间歇函数 setInterval(函数,时间)

  2. 一次性函数 setTimeout(函数,时间)

注意:

函数名字不需要加括号

定时器返回的是一个id数字



关闭定时器

clearInterval(定时器变量名)


总结

事件与定时器.png



习题解析

全选反选案例

图例.png 效果如上图所示,点击全选框后下面的复选框都会被选中,全选字样改为取消;点击单个复选框时全选框无变化,复选框全被点击后全选框被勾选,取消字样改为全选。

题目解析:

  1. 获取元素,总共要获取三个元素, span 标签、全选框与复选框。

  2. 为全选框绑定点击事件,触发点击事件后执行回调函数:

    1. 获取全选框的选中状态 .checked

    2. 让所有复选框的选中状态等于全选框的选中状态,从而实现点击全部选中和取消。

    3. 三元表达式判断,更改 span 标签的文本。

  3. 利用循环遍历获取所有复选框的伪数组,得到每一项 dom 元素,为其绑定点击事件,触发事件后执行回调函数:

    1. 设置一个变量 flag ,用于判断是否所有复选框都被选中,初始值为 true ,默认为都被选中了。

    2. 再次循环所有复选框,同时进行判断,只要有一个复选框没被选中,则把 flag 改为 false

    3. 让全选框的选中状态等于 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
            })
        })

随机点名-定时器版

随机点名.png

效果如上图所示,点击开始按钮框内自动刷新名字,点击结束按钮停止刷新。重复这几步直到全部名字都被选中。

题目解析:

  1. 获取事件源开始按钮、结束按钮与框框;定义一个数组 names 存放好名字数据;定义一个全局变量 index 与一个全局变量 timeId

  2. 点击开始按钮时,触发点击事件,执行回调函数:

    1. 设置定时器,用变量 timeId 存储,设置函数与时间。

    2. 用变量 index 用于接收随机数,作为数组的索引下标。

    3. 框框的文本内容等于数组中被选到的名字。

    4. 禁用开始按钮,解除结束按钮的禁用。

  3. 点击结束按钮时触发点击事件执行回调函数:

    1. 清除定时器,语法为 clearTnterval()

    2. 禁用结束按钮,解除开始按钮的禁用。

    3. 把选中的名字从数组中删除,用到的知识点是 arr.splice(要删除的索引值,删除几个) 。由于前面把定时器变量与索引值变量放到全局作用域中声明,因此这里能够引用到。如果放到开始按钮点击事件的回调函数中声明,则这几步会报错,提示变量 index 未声明。

    4. 判断数组长度,如果数组长度为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
            }
        })