首页
Preview

JS防抖与限流

防抖与限流

如果你是一个有经验的前端开发者,那么你一定会经常遇到一些需要处理用户输入的场景,比如搜索框、下拉框、滚动加载等等。

但是,这些场景都存在一个共同的问题:用户的输入或者滚动事件可能会触发多次,给页面带来不必要的性能负担和用户体验问题。

为了解决这个问题,我们可以使用防抖和限流的技术手段来优化页面性能和用户体验。

防抖

防抖是指在一定时间内,如果事件被触发多次,那么只会执行一次。通常情况下,我们会在用户输入框输入内容时使用防抖来避免多次触发搜索请求。

下面是一个简单的防抖函数实现:

function debounce(func, delay) {
  let timer = null;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

上面的代码中,我们传入需要防抖的函数和防抖时间间隔,然后返回一个新的函数。这个新函数内部使用了 setTimeout 来实现防抖。

我们可以使用这个防抖函数来优化搜索框的输入事件:

const searchInput = document.querySelector('#search-input');

function search() {
  console.log('searching...');
}

searchInput.addEventListener('input', debounce(search, 500));

上面的代码中,我们在 searchInput 元素上绑定了一个 input 事件,并使用 debounce 函数来包装了 search 函数。这样,当用户输入内容时,只有在 500ms 内没有再次输入时,搜索请求才会真正发出。

限流

限流是指在一定时间内,如果事件被触发多次,那么只会按照一定的频率执行。通常情况下,我们会在滚动加载等场景中使用限流来避免多次触发请求。

下面是一个简单的限流函数实现:

function throttle(func, delay) {
  let timer = null;
  let lastTime = 0;
  return function() {
    const now = new Date().getTime();
    if (now - lastTime >= delay) {
      func.apply(this, arguments);
      lastTime = now;
    } else {
      clearTimeout(timer);
      timer = setTimeout(() => {
        func.apply(this, arguments);
      }, delay - (now - lastTime));
    }
  };
}

上面的代码中,我们传入需要限流的函数和限流时间间隔,然后返回一个新的函数。这个新函数内部使用了 setTimeoutclearTimeout 来实现限流。

我们可以使用这个限流函数来优化滚动加载事件:

function loadMore() {
  console.log('loading...');
}

window.addEventListener('scroll', throttle(loadMore, 500));

上面的代码中,我们在 window 元素上绑定了一个 scroll 事件,并使用 throttle 函数来包装了 loadMore 函数。这样,当用户滚动页面时,只会按照一定的频率触发加载事件,避免多次触发请求。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
小小粉刷匠
用追剧的耐心去看他们的演讲和传记。 用黑粉的态度去扒他们每句话背后的意图。 用买周边的钱去提升自己,去成功人士的身边工作,哪怕只是一个小职员。

评论(0)

添加评论