纯javaScript打造行走的jack——键盘事件的侦听——防抖和节流的区别

Posted 勇敢*牛牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯javaScript打造行走的jack——键盘事件的侦听——防抖和节流的区别相关的知识,希望对你有一定的参考价值。

键盘事件的侦听

行走的jack

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div
            width: 32px;
            height: 32px;
            background-image: url(./img/Actor01-Braver03.png);
            position: absolute;
            left: 0;
            top: 0;
        
    </style>
</head>
<body>
    <div class="actor"></div>
    <script>
        var actor;
        var x=0,y=0,speed=3,n=0;
        init();
        function init()
            actor=document.querySelector(".actor");
            document.addEventListener("keydown",keyHandler);
        

        function keyHandler(e)
            n++;
            if(n>3)n=0;
            switch(e.keyCode)
                case 37:
                    x-=speed;
                    actor.style.backgroundPositionY="-33px";
                    break;
                case 38:
                    y-=speed;
                    actor.style.backgroundPositionY="-99px";
                    break;
                case 39:
                     x+=speed;
                     actor.style.backgroundPositionY="-66px";
                    break;
                case 40:
                    y+=speed
                    actor.style.backgroundPositionY="0px";
                    break;
            
            actor.style.backgroundPositionX=n*-32+"px";
            actor.style.left=x+"px";
            actor.style.top=y+"px";
         
    </script>
    
</body>
</html>

防抖和节流的区别

抖和节流本质是不一样的。防抖是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行

防抖(debounce):

  • 防抖触发高频率事件时n秒后只会执行一次,如果n秒内再次触发,则会重新计算。
  • 概述:每次触发时都会取消之前的延时调用。

节流(thorttle):

  • 高频事件触发,每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法。
  • 概述:每次触发事件时都会判断是否等待执行的延时函数。

区别:降低回调执行频率,节省计算资源。
函数防抖一定时间连续触发的事件,只在最后执行一次,而函数节流一段时间内只执行一次。

// 最大间隔时间
const MAX_TIME=10;
var actor,direction;
// list [1,3,2,0] 就是精灵图 中左上右下对应的精灵图y轴位置
// time 初始设置的间隔时间
var x=0,y=0,speed=2,list=[-33,-99,-66,0],n=0,time=MAX_TIME;


init();
function init()
    // 获取小人div
    actor=document.querySelector(".actor");
    // 按下键时触发事件
    document.addEventListener("keydown",mouseHandler);
    document.addEventListener("keyup",mouseHandler);
    // 开启动画
    setInterval(animation,16);


function mouseHandler(e)
    // 如果释放键时,direction 被设置为undefined
    if(e.type==="keyup") return direction=undefined;
    // keyCode 37,38,39,40  -37  -->0,1,2,3
    // list[0]-->左方向精灵图的y周位置
    // list[1]-->上方向精灵图的y周位置
    // list[2]-->右方向精灵图的y周位置
    // list[3]-->下方向精灵图的y周位置
    direction=list[e.keyCode-37];
    // 如果没有取到值,说明按下的键不是上下左右,如果一直按下重复时跳出
    if(direction===undefined || e.repeat) return;
    // 并且改变角色的方向
    actor.style.backgroundPositionY=direction+"px";




function animation()
    // direction是undefined在没有按下键或者释放键时
    if(direction===undefined) return;
     // 角色走动
    actorMove();
    actorChange();


// 角色走动
function actorMove()
    // 根据方向,设置x和y做前进还是后退
   if(direction===-33)x-=speed;
   else if(direction===-66) x+=speed;
   else if(direction===-99) y-=speed;
   else  y+=speed;
//    设置角色的位置
   actor.style.left=x+"px";
   actor.style.top=y+"px";


function actorChange()
    // 每次进入让time--,如果不是0,就跳出
    if(--time) return;
    // 如果是0就进入,并且重设为最大间隔时间
    time=MAX_TIME;
    // 这就意味着这个函数每间隔最大间隔次数进入一次,有效的放置连续快速的执行
    // 可以让代码执行次数降低,这种先判断延迟后执行的方式叫做防抖
    // 根据n变化,切换精灵图横向的位置
    n++;
    if(n>3) n=0;
    actor.style.backgroundPositionX=n*-32+"px";

以上是关于纯javaScript打造行走的jack——键盘事件的侦听——防抖和节流的区别的主要内容,如果未能解决你的问题,请参考以下文章

源码案例纯CSS3动画打造一棵会跳舞的树

使用纯 Javascript 隐藏默认日期选择器 UI [重复]

纯JavaScript入门级小游戏:兔子抢金币(附演示地址+源码)

配置具有公共依赖项的 TypeScript 项目以构建多个纯 JavaScript 输出文件

纯手工打造简单分布式爬虫(Python)

css+javascript 写的HTML5 微信端输入支付密码键盘