zoukankan      html  css  js  c++  java
  • 浅谈js的防抖和节流

    如果一个事件触发的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少触发的频率,同时又不影响实际效果。
    比如说搜索框的请求优化,搜索的这个需求基本上随处可见,几乎每个项目都会有搜索。
    输入搜索词条需要立即触发搜索请求时,防抖和节流可以将多个请求合并为一个请求

    现在利用一小例子简单理解一下防抖和节流

    首先需要一个盒子
      <!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 {font-size:100px;100%;height:400px;border:4px solid #f00;display:flex;justify-content:center;align-items:center;}
    
          </style>
      </head>
      <body>
          <div class="box"></div>
      </body>
    
    简单写一个绑定鼠标事件 当鼠标移动时让num++
      var num=0;
      var box=document.querySelector('.box');
    
      //DOM0级事件绑定--pc端
      //box.onmousemove=debounce(move,2000)
    
      //DOM2级事件绑定
      box.addEventListener('mousemove',debounce(move,2000),false)
    
      function move(e) {
          num++;
          this.innerHTML=num;
    
      }
    
    防抖

    简单来说就是防止抖动
    当持续触发事件时,debounce 会合并事件且不会去触发事件,当一定时间内没有触发再这个事件时,才真正去触发事件。
    防抖主要利用定时器实现

      //用定时器实现防抖
      function debounce(func,wait) {
          var timer=null;
          return function() {
          //保存当前调用的dom对象
           var _this=this;
           //保存事件对象
           var args=arguments;
           clearTimeout(timer)
           timer=setTimeout(function() {
               func.apply(_this,args)
           },wait)
          }      
      }
    
    节流

    hrottle(节流),当持续触发事件时,保证隔间时间触发一次事件。
    持续触发事件时,throttle 会合并一定时间内的事件,并在该时间结束时真正去触发一次事件。
    防抖主要有两种方式实现

    第一种:时间戳

    //时间戳版本实现节流
    function throttle(func,wait) {
        //定义初始时间
        var oldTime=0;
        return function() {
            var _this=this;
            var args=arguments;
    
            //当前时间戳
            var newTime=+new Date();
    
            //判断用当前时间减去旧的时间,如果大于wait指定的时间就会触发
            if(newTime-oldTime>wait) {
                //执行触发的函数
                func.apply(_this,args)
                //将旧时间更新
                oldTime=newTime;
            }
    
        }
    

    第二种:定时器

    //时间戳版本实现节流
    function throttle(func,wait) {
        var timer=null;
        return function() {
            var _this=this;
            var args=arguments;
           if(!timer) {
                timer=setTimeout(function() {
                    timer=null;
                    func.apply(_this,args)
                },wait)
           }
        }
    }
    
  • 相关阅读:
    BS文件夹上传操作(一)
    ext.net 开发学习— 2012 上半年 总结
    C#泛型泛型方法
    C#泛型泛型类
    文件读取,保存操作
    itools下载链接被360警告:虚假招聘网站
    读书推荐:《wordpresss博客建站与经营》
    Net CF简单介绍
    木杉大话微软手机系统
    wp7和wp8的区别
  • 原文地址:https://www.cnblogs.com/mxnl/p/13593777.html
Copyright © 2011-2022 走看看