WebAPI的定时器-间歇函数、事件

391 阅读2分钟

定时器-间歇函数

作用:可以根据时间自动重复执行某些代码

开启定时器

setInterval(函数,间隔时间)//间隔时间是毫秒

注意:

  • 函数名字不需要加括号
  • 定时器返回的是一个id数字

关闭定时器

let 变量名 = setInterval(函数,间隔时间)
clearInterval(变量名)

案例:按钮60秒之后才可以使用

<button></button>
    <script>
        //获取btn元素
        let btn = document.querySelector('button')
        //声明计数器
        let i = 60
        //声明操作函数
        function btnOnclik() {
            btn.disabled = true
            btn.innerText = `已阅读协议${i}`
            if (i === 0) {
                btn.disabled = false
                btn.innerText = `同意`
                clearInterval(set)//关闭定时器
                return
            }
            i--
        }
        //开启定时器
        let set = setInterval(btnOnclik, 1000);
    </script>

案例:随机点名

 //名字数据
        let names = ['曹节', '曹操', '曹嵩', '曹仁', '曹洪', '曹豹', '曹性', '曹昂', '曹丕', '曹植', '曹纯', '曹休', '曹永', '曹彰', '曹熊', '曹睿', '曹真', '曹遵', '曹宇', '曹芳', '曹爽', '曹羲', '曹训', '曹彦', '曹据', '曹髦', '曹德', '曹奂', '曹霖', '曹安民']
        let lick = document.querySelector('p')//装抽中的名字容器
        let btn1 = document.querySelector('button')//querySelector默认获取第一个button元素
        let timer
        function Ran() { //随机抽取名字
            let ran = parseInt(Math.random() * names.length)
            lick.innerText = `${names[ran]}`
        }
        function start() {//开启定时器,调用Ran()开始点名
            btn1.disabled = true
           timer = setInterval(Ran, 100)
        }
        function end() {//关闭定时器
            clearInterval(timer)
            btn1.disabled = false
        }

事件

事件监听

给某元素添加监听事件,一旦有事件触发,就立即调用一个函数做出响应,也称为 注册事件

语法:

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

事件监听的三要素

  • 事件源:获取某个dom元素添加事件
  • 事件:用什么方式触发,如click点击、鼠标经过mouseover
  • 事件调用的函数

例:

// 获取元素
let btn = document.querySelector('button')
//添加事件监听
btn.addEventListener('click',function(){
alert('被点击了')
})

注意:

  1. 事件类型加引号
  2. 函数只有触发才会执行,每触发一次都会执行一次

案例:点击关闭二维码

 <div>
        <!-- 关闭按钮(字体图标) -->
        <i class="iconfont icon-guanbi1"></i>
        <p>去领红包</p>
        <img src="./img/code.png" alt="">
    </div>
    <script>
        //获取父盒子
        let box = document.querySelector('div')
        //获取添加事件的元素
        let btn = document.querySelector('i')
        //添加事件监听
        btn.addEventListener('click', function () {
            box.style.display = 'none'
        })
    </script>

事件监听版本(拓展)

  • DOM L0

    事件源.on事件 = function() { }
    
  • DOM L0

    事件源.addEventListener(‘事件’, 事件处理函数)
    
  • 发展史

    • DOM L0 :是 DOM 的发展的第一个版本
    • DOM L1:DOM级别1 于1998年10月1日成为W3C推荐标准
    • DOM L2:使用addEventListener注册事件
    • DOM L3: DOM3级事件模块在DOM2级事件的基础上重新定义了这些事件,也添加了一些新事件类型

事件类型

鼠标事件、焦点事件、键盘事件、文本事件

鼠标事件
事件描述
click单击事件
mousedown按下鼠标键时触发
mouseup释放按下的鼠标键时触发
mousemove鼠标移动事件
mouseover移入事件
mouseout移出事件
mouseenter移入事件
mouseleave移出事件

注意:mouseover事件和mouseenter事件,都是鼠标进入一个节点时触发。两者的区别是,mouseenter事件只触发一次,而只要鼠标在节点内部移动 ,mouseover事件会在子节点上触发多次

案例:全选文本框案例

需求:用户点击全选,则下面复选框全部选择,取消全选则全部取消,文字对应变化

分析:

  • 遍历下面的所有的checkbox,添加点击事件
  • 在事件内部,遍历所有的checkbox状态,只要有一个为false 就将全选状态设置为false , 把文字改为全选,并且直接return (退出循环)
  • 在循环结束将全选的状态直接设置为true

结构:

 <table>
        <tr>
            <th class="allCheck">
                <input type="checkbox" name="" id="checkAll" />
                <span class="all">全选</span>
            </th>
            <th>商品</th>
            <th>商家</th>
            <th>价格</th>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="check" class="ck" />
            </td>
            <td>小米手机</td>
            <td>小米</td>
            <td>¥1999</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="check" class="ck" />
            </td>
            <td>小米净水器</td>
            <td>小米</td>
            <td>¥4999</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="check" class="ck" />
            </td>
            <td>小米电视</td>
            <td>小米</td>
            <td>¥5999</td>
        </tr>
    </table>

js:

 <script>
        // 1.获取全选复选框
        let checkAll = document.querySelector("#checkAll")
        let cks = document.querySelectorAll('.ck')
        let all = document.querySelector('.all')
        // 2.为全选复选框添加单击事件
        checkAll.addEventListener('click', function () {
            checkAll.checked ? all.innerHTML = '取消' : all.innerHTML = '全选'
           // 为单选复选框添加全选复选框的checked状态
            for (let i = 0; i < cks.length; i++) {
                cks[i].checked = checkAll.checked
            }
        })
​
        //3.为单选复选框添加事件
        for (let i = 0; i < cks.length; i++) {
            cks[i].addEventListener('click', function () {
                for (let j = 0; j < cks.length; j++) {
                    //遍历单选复选框checked 只要有FALSE则全选复选框为FALSE
                    if (!cks[j].checked) {
                        checkAll.checked = false
                        all.innerHTML = '全选'
                        return
                    }
                }
                //遍历完单选复选框的checked都为true设置全选复选框为true
                checkAll.checked = true
                all.innerHTML = '取消'
            })
        }
    </script>
焦点事件

表单获得焦点

focus获得焦点
blur失去焦点

案例:小米搜索框案例

需求:当表单得到焦点,显示下拉菜单,失去焦点隐藏下来菜单

分析:

  • 开始下拉菜单要进行隐藏
  • 表单获得焦点 focus,则显示下拉菜单,并且文本框变色(添加类)
  • 表单失去焦点,反向操作
//样式
<style>
        input {
            outline: 1px solid #ff6700;
            border: none;
        }
        ul {
            display: none;
            padding: 0;
            margin: 0;
            width: 172px;
            border: 1px solid #ff6700;
        }
        li {
            list-style: none;
        }
    </style>
<div>
        <input type="text" placeholder="小米笔记本">
        <ul>
            <li>手机</li>
            <li>黑鲨5s</li>
            <li>空调</li>
            <li>耳机</li>
        </ul>
    </div>
    <script>
        let int = document.querySelector('input')
        let myul = document.querySelector('ul')
        //给input添加监听焦点事件
        int.addEventListener('focus', function () {
            myul.style.display = 'block'
        })
        //给input添加监听失焦事件
        int.addEventListener('blur', function () {
            myul.style.display = 'none'
        })
    </script>
键盘事件

键盘触发

Keydown键盘按下触发
Keyup键盘抬起触发

例:

 document.addEventListener('keydown', function () {
            console.log('键盘按下去了');
        })
document.addEventListener('keyup', function () {
            console.log('键盘抬起来了');
        })

案例:打印用户在键盘输入键

分析:

  • 文档添加键盘监听事件
  • 根据E对象获取用户输入的key
  • 获取的key打印
 你输入的是:<span></span>
 <script>
 let youKey = document.querySelector('span')
        //页面添加键盘监听事件
        document.addEventListener('keyup', function (e) {
            youKey.innerHTML = `${e.key}`
​
        })
</script>
文本事件

表单输入触发

input用户输入事件 、内容变化立即触发
focus聚焦事件
blur失焦事件
change失焦事件、 内容改变才能触发

案例:微博输入案例

需求:用户输入文字,可以计算用户输入的字数

分析:

  • 判断用输入事件 input
  • 不断取得文本框里面的字符长度
  • 把获得数字给下面文本框

结构:

 <div class="w">
        <div class="controls">
            <textarea placeholder="说点什么吧..." id="area" cols="30" rows="10" maxlength="200"></textarea>
            <div>
                <span class="useCount">0</span>
                <span>/</span>
                <span>200</span>
                <button id="send">发布</button>
            </div>
​
        </div>
        <div class="contentList">
            <ul>
​
            </ul>
        </div>
    </div>

js:

<script>
        //获取文本域
        let text = document.querySelector('textarea')
        //获取发布区域
        let contentList = document.querySelector('.contentList')
        //计数容器
        let useCount = document.querySelector('.useCount')
        //发布按钮
        let send = document.querySelector('#send')
        //为文本域添加input事件
        text.addEventListener('input', function () {
            let textnum = text.value.length
            useCount.innerHTML = `${textnum}`
        })
        //为发布按钮添加点击事件
        send.addEventListener('click', function () {
            contentList.innerHTML = `${text.value}`
        })
    </script>