javascript - 如何防止用户短时间内重复操作造成的代码重复执行
高洛峰
高洛峰 2017-04-11 12:29:27
[JavaScript讨论组]

举个例子:
button按钮绑定了一个函数,是5s之后打印数字0;如果我们连续点击button按钮多次,会在控制台输出多个0

期望的输出时,控制台最后只输出一个0,是我们最后点击的那一次

思考:假设在真实的项目中,我们有按钮是绑定了一些交互效果的,比如旋转缩放等,如何防止用户重复操作,代码重复执行导致效果累加?



function test(){
   var timer=setTimeout(function(){
      console.log(0);
   }, 5000)
}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(8)
PHPz

点击之后禁用按钮 执行完毕后再启用

伊谢尔伦

交互设计原则: 不该被使用的元素请禁用之

怪我咯
  function test(){
        console.log(0);
    }
    
    function throttle(fun){
        if(fun.timeoutId) {window.clearTimeout(fun.timeoutId);}
        fun.timeoutId = window.setTimeout(function(){
            fun();
           fun.timeoutId = null;
        }, 1000);
    }
    
    throttle(test);
    throttle(test);
    throttle(test);
    throttle(test);

这样吗?

PHPz
//禁用按钮
$('button').prop('disabled',true);
//回调函数启用按钮
$('button').prop('disabled',false);

如果想要最后一次点击生效,把timer定时器放在函数外每次调用进行检测;
如果不涉及定时器,就在函数内部把函数赋值给自己让每次调用都执行新的逻辑

var timer;
var foo = function() {
    timer && clearTimeout(timer);
    timer = setTimeout(function() {
        console.log(0);
    }, 5000);
    //something
}
迷茫

看一下js的throttle和debounce,很多类库中都有实现

黄舟

一般都是作标记位吧。

ringa_lee

我们都是设置一个状态值,然后当js开始执行的时候,就将其设置为true,然后等js完成之后,再变成false,然后如果用户中途多次点击按钮触发js,那么就会判断状态值是否为true,如果为true,就阻拦这次的点击事件。

PHPz

做一个延迟执行就行了。

var tout ;
$('.btn').click(function(){
    if(tout)
        clearTimeout(tout);
    tout = setTimeout(handler,1000);
});

function handler(){
    tout = null;
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号