[转载]js节流与防抖,防止重复提交、防止频繁重复点击

原文
https://blog.csdn.net/web_xyk/article/details/80165824

此文仅用于学习笔记:
一、节流、防止短时间多次提交操作
现有一提交按钮提交点击后提交表单信息。

但是经常会出现: 1.不小心点了多次,就提交了多次
2.网络卡顿的时候网页没反应,用户频繁点击的情况

// 即这种写法:
var subBtn = document.getElementById('submit');
subBtn.addEventListener('click', ajaxForm, false)
 
// 提交方法
function ajaxForm(e) {
    console.log(e.target)
    console.log('执行提交操作', new Date().getTime())
}

通过添加节流函数来解决

/*节流函数,通过控制每次事件执行的时间间隔控制短时间多次执行方法
handler:要执行的方法
wait:每次点击事件执行的时间间隔(毫秒)
*/

function throttle(handler, wait) {
    var lastTime = 0;
    return function () {
        var nowTime = new Date().getTime();
        if (nowTime - lastTime > wait) {
            handler.apply(this, arguments);
            lastTime = nowTime;
        }
   }
}

 
// 提交方法
function ajaxForm(e) {
    console.log(e.target)
    console.log('执行提交操作', new Date().getTime())
}


 
var subBtn = document.getElementById('submit');
subBtn.addEventListener('click', throttle(ajaxForm, 1000), false)

二、防抖动

应用场景:模糊查询,根据输入内容提示相关完整内容 (浏览器必备功能)

不好的写法:

function showAll(e) {
    console.log(e.target)
    console.log('执行查询操作', new Date().getTime())
}


 
var searchInput = document.getElementById('search');
searchInput.addEventListener('keyup', showAll, false)

例:查询 ESP(我们并不想查询E或者ES),会执行三次,无论输入多快

通过添加防抖函数来优化查询体验

/*防抖函数,通过推迟每次事件执行的时间来减少不必要的查询
handler:要执行的方法
delay:每次事件执行的推迟时间(毫秒)
*/
 


function debounce(handler, delay) {
    var timer;
 
    return function () {
        var self = this, arg = arguments;
 
        clearTimeout(timer);
 
        timer = setTimeout(function () {
            handler.apply(self, arg)
        }, delay)
    }
}
 
function showAll(e) {
    console.log(e.target)
    console.log('执行查询操作', new Date().getTime())
}
 
var searchInput = document.getElementById('search');
searchInput.addEventListener('keyup', debounce(showAll, 500), false)

查询 ESP,输入较快的情况只会执行一次查询ESP

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值