js中的防抖、节流、点击事件回调

  以前,贴吧骗赞有个说法,快速点击两次可以赞两下哦,这个情况倒是可以发生的,就是将点赞信息提交了多次。就算后端帮助判断了不能点赞多次,将错误信息返回前台,频繁提示“不能多次点赞”看起来也是很Low。我们可以根据需求来使用下面几种方式让效果、性能都能完美实现。

  防抖的原理是在规定触发时间内,多次点击,都会重新刷新触发时间,直到触发时间完成回调才会触发。防抖的运用场景大多在搜索关联词匹配、window窗口的变化已经滚动条的滚动。

  节流的原理是在规定时间内不管点击多少次都只会执行一次。而像我们提交信息的话,需要的是当后台返回信息后,我们做自己的逻辑判断。节流的运用场景在瀑布流更新列表信息、当然短时间内不能重复提交、点击事件也可以拿来使用。

  防抖的核心实现代码如下:

 1             //防抖
 2             function debounce(fun, delay = 200) {
 3                 return function (args) {
 4                     //获取函数的作用域和变量
 5                     let that = this
 6                     let _args = args
 7                     //每次事件被触发,都会清除当前的timeer,然后重写设置超时调用
 8                     clearTimeout(fun.id)
 9                     fun.id = setTimeout(function () {
10                         fun.call(that, _args)
11                     }, delay)
12                 }
13             }

  节流的核心实现代码如下:

 1             //节流
 2             function throttle(fun, delay = 1000) {
 3                 let last, deferTimer;
 4                 return function (args) {
 5                     let that = this;
 6                     let _args = arguments;
 7 
 8                     let now = +new Date();
 9                     if (last && now < last + delay) {
10                         clearTimeout(deferTimer);
11                         deferTimer = setTimeout(function () {
12                             last = now;
13                             fun.apply(that, _args);
14                         }, delay)
15                     } else {
16                         last = now;
17                         fun.apply(that, _args);
18                     }
19                 }
20             }

  而点击期间不能再次点击,我们可以设置一个全局变量,用户点击后变量切换状态,该状态不能再次点击操作。

posted @ 2018-12-20 11:59  艾路  阅读(4934)  评论(1编辑  收藏  举报