js节流函数和js防止重复提交的N种方法

应用情景

经典使用情景:js的一些事件,比如:onresize、scroll、mousemove、mousehover等;

还比如:手抖、手误、服务器没有响应之前的重复点击;

这些都是没有意义的,重复的无效的操作,设置对整个系统的影响还可能是致命的,所以我们要对重复点击的事件进行相应的处理!

 

节流函数

所谓的节流函数顾名思义,就是某个时刻限制函数的重复调用。

同样节流函数也是为了解决函数重复提交的问题,而防止重复提交的方法,不止节流函数一种实现。

 

方法汇总

本文整理了我在工作实践当中,觉的防止js重复提交,比较好用的方法,在这里和大家分享一下。

一、setTimeout + clearTimeout(节流函数)

  本文提供两种实现方式:普通节流函数和闭包节流函数

二、设定flag/js加锁

三、通过disable

四、添加浮层比如loading图层防止多次点击

 

具体实现

一、setTimeout + clearTimeout(节流函数)

方式一:闭包节流函数(可传递多个参数)

/**
 * 闭包节流函数方法(可传参数)
 * @param Function fn 延时调用函数
 * @param Number delay 延迟多长时间
 * @return Function 延迟执行的方法
 */
var throttle = function (fn,delay) {
    var timer = null;
    return  () {
        var args = arguments; //参数集合
        clearTimeout(timer);
        timer = setTimeout( () {
            fn.apply(this,args);
        },delay);
    }
}

*
 * 要执行的方法
 * @param String name 传递的参数
  postFun(name) {
    document.writeln("名字:" + name);
}

================测试部分 => 【1s重复点击10次】
var t = throttle(postFun,1000);
var ejector = setInterval(() => {
    t("tiger");
},100);

setTimeout(() => {
    clearInterval(ejector);
},1000);

执行结果:

方式二:普通节流函数方法

*
 * 普通节流函数方法
 * @param Function fn 延时调用函数
 * @param Number delay 延迟多长时间
  throttle(fn,1)">if (fn._id) {
        clearTimeout(fn._id);
    }
    fn._id = window.setTimeout(() => {
        fn();
        fn._id = ;
    },delay);
}

*
 * 要执行的方法
  postFun() {
    document.writeln(new Date().getTime());
}

var interval = setInterval(() => {
    throttle(postFun,1000 {
    clearInterval(interval);
},1000);

执行结果:

二、设定flag/js加锁

var lock = false;
jQuery("#submit").on('click', () {
     (lock) {
        ;
    }
   lock = true; jQuery.post(url,data,
(response) { TODO:业务代码 lock = ; }); });

 

总结

前两种方式实现起来比较方便,而后两种实现起来相对比较繁琐,如果是为了防止事件的多次触发,建议使用闭包,如果是表单提交,适度使用后两种比较稳妥。

 

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...