博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js节流函数和js防止重复提交的N种方法
阅读量:5760 次
发布时间:2019-06-18

本文共 1876 字,大约阅读时间需要 6 分钟。

应用情景

经典使用情景: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;    });});

 

总结

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

 

 

 

 

 

 

转载地址:http://qwmkx.baihongyu.com/

你可能感兴趣的文章
NLP系列学习:生成型模型和判别型模型
查看>>
算法(八):图解KNN算法
查看>>
ThreeJS 学习笔记——简介
查看>>
最常用的Activity的onBackPressed()与finish()的区别
查看>>
Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
查看>>
关键字static/const的作用
查看>>
javacript深入浅出——闭包
查看>>
“她经济”时代,兜售少女心的乙女游戏将成新风口?
查看>>
我为Redis找到了一个新家——VMWare
查看>>
HAProxy高性能软负载均衡器
查看>>
利用Office宏及Powershell的针对性攻击样本分析
查看>>
零基础学习 Python 之集合
查看>>
设计模式之订阅/发布模式(subscribe/publish)
查看>>
Java Web开发中文乱码问题
查看>>
从服务端视角看高并发问题
查看>>
apkTool反编译apk碰到的问题
查看>>
Huffman树及其应用
查看>>
记一次vue-webpack项目优化实践【更新】
查看>>
qq音乐flac改成mp3格式小妙招
查看>>
WordPress插件Contact Form 7 Database安装的问题
查看>>