zoukankan      html  css  js  c++  java
  • 防抖与节流

    防抖节流

    防抖和节流是对应的

    防抖是规定时间内触发就一直延迟,直到规定时间内不触发了就执行最后一次事件;

    节流是执行第一次,在规定时间内不会再次触发,过了规定时间就会再次触发的。

    防抖代码:

     function debounce(fn, wait) {

                var timeout = null;//每次执行函数的时候如果上次没有执行完成就重新赋值

                return function() {

                    if(timeout !== null)

                        clearTimeout(timeout);//如果之前有定时器的话就清除定时器

                    timeout = setTimeout(fn, wait);//每次触发都重新执行定时器

                }

            }

            // 处理函数

            function handle() {

                console.log(Math.random());

            }

            // 滚动事件

            window.addEventListener('scroll', debounce(handle, 1000));

     

    节流代码:

    时间戳方案 

      var throttle = function(func, delay) {

                var prev = Date.now();

                return function() {

                    var context = this;

                    var args = arguments;

                    var now = Date.now();

                    if (now - prev >= delay) {

                        func.apply(context, args);

                        prev = Date.now();

                    }

                }

            }

            function handle() {

                console.log(Math.random());

            }

            window.addEventListener('scroll', throttle(handle, 1000));

    定时器方案 

    var throttle = function(func, delay) {

                var timer = null;

                return function() {

                    var context = this;

                    var args = arguments;

                    if (!timer) {

                        timer = setTimeout(function() {

                            func.apply(context, args);

                            timer = null;

                        }, delay);

                    }

                }

            }

            function handle() {

                console.log(Math.random());

            }

            window.addEventListener('scroll', throttle(handle, 1000));

     时间戳+定时器

    var throttle = function(func, delay) {

         var timer = null;

         var startTime = Date.now();

         return function() {

                 var curTime = Date.now();

                 var remaining = delay - (curTime - startTime);

                 var context = this;

                 var args = arguments;

                 clearTimeout(timer);

                  if (remaining <= 0) {

                        func.apply(context, args);

                        startTime = Date.now();

                  } else {

                        timer = setTimeout(func, remaining);

                  }

          }

    }

    function handle() {

          console.log(Math.random());

    }

     window.addEventListener('scroll', throttle(handle, 1000));

  • 相关阅读:
    mysql 视图
    CSS 上下居中和最低高度语法
    escape()、encodeURI()、encodeURIComponent()区别详解
    YII事件EVENT示例
    linux history命令优化
    mysql 之full join
    redis学习之数据类型
    <canvas>设置宽高遇到的问题
    关于块级元素撑满整个浏览器窗口
    jquery中bind()绑定多个事件
  • 原文地址:https://www.cnblogs.com/wyongz/p/11032401.html
Copyright © 2011-2022 走看看