美文网首页
js防抖、截流

js防抖、截流

作者: who_are_you_ | 来源:发表于2024-02-29 14:44 被阅读0次

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div style='width: 80%; height: 200px; border: 1px solid #999; border-radius: 8px;padding: 8px;box-shadow: 3px 4px 5px #999; margin: 0 auto;'>
    <h2>截流测试区域-频繁点击</h2>
    执行次数:
    <div id='throttle'></div>
    点击次数:
    <div id='current'></div>
    <button id='throttleBtn'>点击</button>
  </div>
  <div style='width: 80%; height: 200px; border: 1px solid #999; border-radius: 8px;padding: 8px;box-shadow: 3px 4px 5px #999; margin: 20px auto;'>
    <h2>防抖测试区域-频繁输入</h2>
    <input id='debounceIpt' />
    <div id='debounceType' >
    </div>
  </div>
  <script>
    // 截流函数
    // 概念:控制比如服务器请求次数,指定时间内只能执行一次,稀释函数执行频率
    let throttleBtn = document.querySelector('#throttleBtn');
    // 执行输出函数
    function throttleFn(n, current) {
      document.querySelector('#throttle').innerHTML = n;
      document.querySelector('#current').innerHTML = current;
    }
    // 非立即执行函数 用户一次性计时器
    function throttle (fn) {
      let timer;
      // 当前点击了多少次
      let current = 0;
      // 函数执行次数
      let n = 0;
      return function() {
        ++current;
        if (!timer) {
          timer  = setTimeout(() => {
            ++n;
            fn.call(this, n, current);
            clearTimeout(timer);
            timer = null;
          }, 1000)
        }
      }
    }
    // 立即执行函数 运用时间戳
    function throttleTwo (fn, timer) {
      let pre = 0;
      let current = 0;
      let n = 0;
      return function() {
        let now = new Date().getTime();
        ++current;
        if (now - pre > timer) {
            pre = now;
            ++n;
            fn.apply(this, [n, current])
        }
      }
    }
    let Fn = throttle(throttleFn);
    let Fn2 = throttleTwo(throttleFn, 2000);
    // throttleBtn.addEventListener( 'click', Fn);
    throttleBtn.addEventListener( 'click', Fn2);
    // 防抖函数
    // 防抖概念:在一定时间内再次触发,重新计算计时器
    // 举例: 例如用户远程搜索框,连续输入,重新计算计时器,发送服务端请求

    // 最后一次执行 非立即执行
    function debounce (fn, time) {
      let timer;
      return function() {
        fn.call(this, '搜索中....');
        timer && clearTimeout(timer);
        timer = setTimeout(() => {
          fn.call(this, '搜索成功!');
        }, time)
      }
    }
    // 立即执行
    function debounceTwo (fn, time) {
      let timer;
      return function() {
        !timer && fn.call(this, '第一次立即执行');
        timer && clearTimeout(timer);
        timer = setTimeout(() => {
          timer = null;
          fn.call(this, '输入后可继续执行');
        }, time);
      }
    }
    // 事件执行
    function debounceFn(val) {
      document.querySelector('#debounceType').innerHTML = val;
    }
    // 非立即执行
    let debounceEv = debounce(debounceFn, 1000);
    // 第一次立即执行
    let debounceTwoEv = debounceTwo(debounceFn, 1000);
    let debounceIpt = document.querySelector('#debounceIpt');
    debounceIpt.addEventListener('input', debounceTwoEv);
  </script>
</body>
</html>

相关文章

网友评论

      本文标题:js防抖、截流

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