zoukankan      html  css  js  c++  java
  • js:防抖动与节流【转载】

    源文:https://blog.csdn.net/crystal6918/article/details/62236730#reply

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <div id="container" style="height: 300px;background: red;overflow: auto">
            <div style="height: 3000px;background: yellow;"></div>
        </div>
    </body>
    <script>
        //初级防抖
        /* // 将会包装事件的 debounce 函数
        function debounce(fn, delay) {
            // 维护一个 timer
            let timer = null;
    
            return function () {
                // 通过 ‘this’ 和 ‘arguments’ 获取函数的作用域和变量
                let context = this;            
                let args = arguments;
    
                clearTimeout(timer);
                timer = setTimeout(function () {
                    fn.apply(context, args);
                }, delay);
            }
        }
        // 当用户滚动时被调用的函数
        function foo() {
            console.log('You are scrolling!');
        }
    
        // 在 debounce 中包装我们的函数,过 2 秒触发一次
        let elem = document.getElementById('container');
        elem.addEventListener('scroll', debounce(foo, 500)); */
    
        //更高级防抖
    
       /*  function debounce(func, delay, immediate) {
            var timer = null;
            return function () {
                var context = this;
                var args = arguments;
                if (timer) clearTimeout(timer);
                if (immediate) {
                    //根据距离上次触发操作的时间是否到达delay来决定是否要现在执行函数
                    var doNow = !timer;
                    //每一次都重新设置timer,就是要保证每一次执行的至少delay秒后才可以执行
                    timer = setTimeout(function () {
                        timer = null;
                    }, delay);
                    //立即执行
                    if (doNow) {
                        func.apply(context, args);
                    }
                } else {
                    timer = setTimeout(function () {
                        func.apply(context, args);
                    }, delay);
                }
            }
        }
        function foo() {
            console.log('You are scrolling!');
        }
        let elem = document.getElementById('container');
        elem.addEventListener('scroll', debounce(foo, 500, true)); */
    </script>
    <script>
        //节流1.时间戳版
        /*  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()
                 func.apply(context,args);
                 prev = Date.now();
             }
         }
     } */
        //节流2.定时器版
        /* 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);
                }
            }
        } */
        //节流3.综合使用时间戳与定时器
        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 foo() {
            console.log('arguments');
        }
        let elem = document.getElementById('container');
        elem.addEventListener('scroll', throttle(foo, 500, true));
    </script>
    
    </html>
    

      

  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/webSong/p/8991986.html
Copyright © 2011-2022 走看看