防抖与节流

防抖

原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时,最后一次有效。
适用场景:

  • 按钮提交场景:防止多次提交按钮,只执行最后提交的一次
  • 服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词功能类似
<!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>
    <style>
        #iii,
        #jjj {
            height: 100px;
            width: 200px;
            background: lightblue;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <div id="jjj">防抖</div>
</body>
<script>
    // 防抖
    function debounce(fn, wait) {
        let timeout = null;
        return function () {
            if (timeout !== null) clearTimeout(timeout);
            timeout = setTimeout(fn, wait);
        }
    }
    // 处理函数
    function handle() {
        console.log(Math.random());
    }
    var jjj = document.getElementById('jjj');
    jjj.onclick = debounce.call(this, handle, 1000);
</script>
</html>

节流

解决问题:防止在单位时间内多次触发。例如拖拽
原理:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

<!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>
    <style>
        body {
            height: 100000px;
        }
    </style>
</head>

<body>
    打开控制台,滚动屏幕
</body>
<script>
    const throttle = (fn, delay = 500) => {
        let flag = true;
        return (...args) => {
            if (!flag) return;
            flag = false;
            setTimeout(() => {
                fn.apply(this, args);
                flag = true;
            }, delay);
        };
    };
    // 处理函数
    function handle() {
        console.log(Math.random());
    }
    window.addEventListener('scroll', throttle(handle, 1000));
</script>

</html>

适用场景:

  • 拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动
  • 缩放场景:监控浏览器resize
  • 动画场景:避免短时间内多次触发动画引起性能问题
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇课题,或许早已是烂大街的解读文章。不过春招系列面试下来,不少伙伴们还是似懂非懂地栽倒在(~面试官~)深意的笑容...
    以乐之名阅读 1,816评论 0 9
  • 防抖与节流,其实是控制事件触发频率的方法。 在网页的实际运行的某些场景下,有些事件会持续被触发,比如resize不...
    喵喵喵不吃小鱼干阅读 316评论 0 1
  • debounce/防抖:抖完以后在执行等待-执行 throttle/节流:按计划"节制"执行(我会直接翻译成节制)...
    刘程源阅读 605评论 0 0
  • 函数防抖(debounce) 假设我们网站有个搜索框,用户输入文本我们会自动联想匹配出一些结果供用户选择。我们可能...
    tobAlier阅读 2,168评论 0 1
  • 晨练第395天:站桩30分钟 读经第275天: 诗经·简兮 简兮简兮,方将万舞。日之方中,在前上处。 硕人俣俣,公...
    山缘有约阅读 230评论 0 0