美文网首页
防抖与节流

防抖与节流

作者: YoungEvita | 来源:发表于2021-09-09 21:27 被阅读0次

防抖

短时间内大量触发,只执行一次,若这段事件内再次触发,则重新计时

<!DOCTYPE html>
<html>
<head>
    <title> </title>
</head>
<body>
    <input type="text" id="inputText">
</body>
<script type="text/javascript">
    document.querySelector("#inputText").addEventListener('input', 
        debounce(function(){
            console.log(this.value)
        }, 3000, true)
    )
    function debounce(fn, delay, isImmediate) {
        var timer = null; // 初始化timer,作为计时器清除依据
        return function () {
            var context = this; // 获取函数所在作用域this
            var args = arguments; // 取得传入的参数
            timer && clearTimeout(timer)
            if (isImmediate && timer === null) {
                // 时间间隔外立即执行
                fn.apply(context, args);
                timer = 0;
                return;
            }
            timer = setTimeout(function() {
                fn.apply(context, args);
                timer = null;
            }, delay)
        }
    }
</script>
</html> 

节流

短时间触发同一事件,那么在函数执行一次后,该函数在指定期间内不在工作,直到过了时间段

// 时间戳实现
    function throttle(fn, delay) {
        var prev = Date.now();
        return function () {
            var context = this;
            var args = arguments;
            var now = Date.now();
            if (now-pre >= delay) {
                fn.apply(context, args);
                prev = Date.now();
            }
        }
    }
// 定时器
    function throttle(fn, delay) {
        var timer = null;
        var args = arguments;
        if (timer === null) {
            timer = setTimeout(function () {
                fn.apply(context, args);
                timer = null;
            })
        }
    }
<!DOCTYPE html>
<html>
<head>
    <title> </title>
</head>
<body>
    <input type="text" id="inputText">
    <div id="blackpanel" style="background: gray; width: 500px; height: 500px">
        <span id="num"></span>
    </div>
</body>
<script type="text/javascript">
    var count = 0;
    document.querySelector("#blackpanel").onmouseover = throttle(showNum, 3000, 
        {"leading": false, "trailing": true})
    function showNum () {
        count = count +1
        document.querySelector("#num").innerHTML = count
    }
    // 时间戳 + 定时器 
    // options = {leading: false, trailing:false} leading: 首次是否执行,trailing 结束后是否执行
    function throttle(fn, delay, options) {
        var timeout, context, args, result;
        var previous = 0; // 开始时间
        if (!options) options = {};
        var later = function () {
            previous = options.leading === false ? 0 : Date.now()
            timeout = null;
            result = fn.apply(context, args);
            if(!timeout) context=args=null;
        }
        var throttled = function() {
            var now = Date.now()
            if(!previous && options.leading===false) previous = now; // 是否首次执行
            var remaining = delay - (now - previous) // 下次触发fn剩余事件,假设delay事件很大,则remaining为正数
            context = this;
            args = arguments;
            if (remaining <= 0 || remaining > delay) { // 如果没有剩余事件或者改了系统时间
                if (timeout) {
                    clearTimeout(timeout)
                    timeout = null
                }
                previous = now;
                fn.apply(context, args)
                if (!timeout) context = args = null;
            } else if (!timeout && options.trailing !== false) { // 是否结束后还执行
                timeout = setTimeout(later, remaining);  // setTiemout中remaining 超过最大值,则会立即执行
            }
        }
        return throttled

    }
</script>
</html>     

参考

浅谈防抖节流
JavaScript专题之跟着 underscore 学节流

相关文章

网友评论

      本文标题:防抖与节流

      本文链接:https://www.haomeiwen.com/subject/vgipwltx.html