一般的后台站,如何防止用户重复点击/误点击 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lovecy
V2EX    问与答

一般的后台站,如何防止用户重复点击/误点击

  • nbsp;
  •   lovecy 2020-07-10 14:13:01 +08:00 2656 次点击
    这是一个创建于 1920 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如某些删除修改的功能,前端 WEB 页面,防止用户双击,或者点击了 A 功能,还未响应时又点击 B 功能

    • 仅为前端简单限制,并非后端
    • 主要是想有一种思路,比如加遮罩,或者请求时禁用所有可点击元素?

    昨天发生一个问题就是有个用户同时点击了两个操作按钮,导致数据错乱了,现在想优化一下,以上列举的两种思路感觉都不是很优雅?

    14 条回复    2020-07-11 03:30:53 +08:00
    myEzekiel
        1
    myEzekiel  
       2020-07-10 14:50:21 +08:00   1
    点击,弹出遮罩层,提示加载中或第一次点击完把按钮设为不可点击,直到成功或失败,再变为可点击
    lovecy
        2
    lovecy  
    OP
       2020-07-10 15:15:40 +08:00
    @myEzekiel 请问下有比较好的封装么,自己写的很丑。
    w292614191
        3
    w292614191  
       2020-07-10 15:53:38 +08:00   1
    ajaxSetup({
    beforeSend:function(){
    loading...
    }

    });
    wafm
        4
    wafm  
       2020-07-10 15:54:27 +08:00
    来个个位数算法确认
    toma77
        5
    toma77  
       2020-07-10 16:28:47 +08:00   1
    const [loading,setLoading] = useState(false);

    const fetchFunc =async ()=>{
    setLoading(true);
    const data = fetch('http://xxx')
    .then(function(response) {
    setLoading(false);
    return response.json();
    })
    };

    <button OnClick={fetchFunc}} disabled={loading}>A</botton>
    <button OnClick={fetchFunc}} disabled={loading}>B</botton>
    niubee1
        6
    niubee1  
       2020-07-10 16:37:34 +08:00
    讲一个笑话,2005 年的时候,电信还有个业务叫互联星空,其中有个活动是可以在一个页面点一个按钮,用电话话费兑换 Q 币。结果这个页面在做的时候没有做防护,结果某位仁波切兄狂点了几千次(因为那个时候网速慢,页面卡住了)结果被扣了好几千话费,兑换了好几千 Q 币,电话也欠费停机了。于是去营业厅理论,但是营业厅没法做业务回退,仁波切兄就纠集了一大群仁波切,把营业厅给砸了。
    从此以后,任何用 JS submit 的操作,都会第一时间 disable 按钮。页面刷新的时候也会加上 nonce,提交后后端也会验证 nonce 。不然就会回想起仁波切的恐惧......
    easonHHH
        7
    easonHHH  
       2020-07-10 16:44:25 +08:00
    节流?但是魔改页面可破,后端也是要做限制的
    lovecy
        8
    lovecy  
    OP
       2020-07-10 16:44:52 +08:00
    @niubee1 哈哈哈,我这边维护的都是老旧项目了,很多质量都很差。不过话说仁波切是惹不起的意思么- -
    @wafm 啥是 个位数算法确认 [懵逼.jpg]
    @toma77 感谢,这个封装思路 GET 了
    9tao
        9
    9tao  
       2020-07-10 17:02:07 +08:00
    debounce
    lovecy
        10
    lovecy  
    OP
       2020-07-10 18:06:08 +08:00
    @easonHHH 是的,后端有做限制的,就是前段也限制一下,想找个简单快捷的方式
    @9tao 谢谢,我去了解一下
    towave
        11
    towave  
       2020-07-10 18:30:11 +08:00 via Android
    什么都不用的话,加个标志变量就行了
    wafm
        12
    wafm  
       2020-07-10 18:57:32 +08:00
    @lovecy 曾经做过一个项目,跟你的需求类似,客户要求每做一个操作前必须确认,最大限度防止误操作

    我这边给下边的人出了个主意,每次操作前弹出一个全局 modal,随机生成一道和不超过 2 位数的个位数加法的算法,这样的话就不会有问题,操作人每次进行操作需要做一道非常简单的算术题,就不会误点或者错操作
    Jooooooooo
        13
    Jooooooooo  
       2020-07-10 19:37:51 +08:00
    前端做限制拦住大部分

    恶意发请求的后端再用锁
    billccn
        14
    billccn  
       2020-07-11 03:30:53 +08:00
    我曾经干过 AJAX 发出以后用 document.write 把整个页面换成只剩下"loading...",这时候你的 JS 代码还在跑,但是用户已经不可能再触发任何元素了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1356 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 16:44 PVG 00:44 LAX 09:44 JFK 12:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86