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 function () {
        var args = arguments; //参数集合
        clearTimeout(timer);
        timer = setTimeout(function () {
            fn.apply(this, args);
        }, delay);
    }
}

/**
 * 要执行的方法
 * @param String name 传递的参数
 */
function 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 延迟多长时间
 */
function throttle(fn, delay) {
    if (fn._id) {
        clearTimeout(fn._id);
    }
    fn._id = window.setTimeout(() => {
        fn();
        fn._id = null;
    }, delay);
}

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

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

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

执行结果:

二、设定flag/js加锁

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

总结

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Modeng的专栏

Vue中如何使用方法、计算属性或观察者

熟悉 Vue 的都知道 方法methods、计算属性computed、观察者watcher 在 Vue 中有着非常重要的作用,有些时候我们实现一个功能的时候可以...

1402
来自专栏盛国存的专栏

A Bite of GoLang(中)

上述的 v 就称为局部变量, sum 称为自由变量,`func(v int) int {

6307
来自专栏HTML5学堂

拉手网面试题,不一样的难度

正文 1、JavaScriptalert(0.4*0.2);结果是多少?和你预期的一样吗?如果不一样该如何处理? 2、JavaScript以下哪条语句会产生运行...

3608
来自专栏吴裕超

大搜车知乎live中的面试题结题方法记录

1、HTML&CSS(分别10分) 1. 一个div,宽度是100px,此时设置padding是20px,添加一个什么css属性可以让div的实际宽度仍然保持在...

55311
来自专栏菩提树下的杨过

javascript:巧用eval函数组装表单输入项为json对象

在ajax方式做web开发时,经常会遇到会保存前,收集表单输入项,组成json对象,然后把对象直接post到服务端的场景 常规做法是在js里写类似如下的代码: ...

2215
来自专栏SpringBoot

第二节,Springboot自定义配置文件

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

2033
来自专栏达摩兵的技术空间

js面试题系列003

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。 2、属性和方法被加入到 this 引用的对象中。 3、新创建的对象由 thi...

3133
来自专栏数据结构笔记

python爬虫系列之 xpath:html解析神器

通过前面的文章,我们已经知道了如何获取网页和下载文件,但是前面我们获取的网页都是未经处理的,冗余的信息太多,无法进行分析和利用

3493
来自专栏Python小屋

Python实现中英文混排时行号对齐

问题描述:编写程序,输出一个列表中的所有字符串,要求在所有字符串后加上行号,要求行号以井号开头,并且所有行的井号对齐。

1352
来自专栏王磊的博客

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

2713

扫码关注云+社区

领取腾讯云代金券