分前端和后端
一、前端
1、button标签点击后变成disabled
<form action="login" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit"BfwOnclick="this.disabled=true; this.value='登录中...'; this.form.submit();" value="登录" />
</form>
2、函数节流
<script>或
// 时间戳函数节流方案
function throttle(fn,wait){
var pre = Date.now();
return function(){
var context = this;
var args = arguments;
var now = Date.now();
if( now - pre >= wait){
fn.apply(context,args);
pre = Date.now();
}
}
}
function handle(){
console.log(Math.random());
//ajax请求
}
throttle(handle,1000);//一秒内只能触发一次
</script>
<script>
// 定时器函数节流方案
function throttle(fn,wait){
var timer = null;
return function(){
var context = this;
var args = arguments;
if(!timer){
timer = setTimeout(function(){
fn.apply(context,args);
timer = null;
},wait)
}
}
}
function handle(){
console.log(Math.random());
//ajax请求
}
throttle(handle,1000);
</script>
3、form token
js产生一个form token值,执行完后,后端清空,第二次请求的时候就会报错,这样也达到了重复点击的目的
二、后端
后端可以通过锁或队列来进行处理,我们以php为例
<?php那么队列的话
/**
* 使用Memcache实现给进程加锁的类
*/
class MemLock {
private static $memcache = null;
/**
* 获取memcached连接
*
* @return Memcached
*/
public static function getConnection() {
if (! isset ( self::$memcache )) {
self::$memcache = new Memcache ();
self::$memcache->connect ( '127.0.0.1', 11211 );
}
return self::$memcache;
}
/**
* 加锁
*
* @param $key 锁关键字
* @param $expireTime 超时时间, 当进程在锁定后出错,这样永远不会释放锁了,只能等到缓存失效
*
* @return boolean true 成功获取到锁 false 获取锁失败
*/
public static function addLock($key, $expireTime = 120) {
$memcache = self::getConnection ();
if($memcache->add($key, 1, false, $expireTime)) {
return true;
}
return false;
}
/**
* 释放锁
*
* @param $key 锁关键字
*
* @return boolean true 释放成功 false 释放失败
*/
public static function releaseLock($key) {
$memcache = self::getConnection ();
return $memcache->delete ( $key );
}
$key = '锁键值';
if(MemLock::addLoack($key)) {
//处理
MemLock::releaseLock($key);
} else {
//不好意思,请求还没处理完
}
?>
入队列
<?php出队列
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
while(True){
try{
$value = 'value_'.date('Y-m-d H:i:s');
$redis->LPUSH('key1',$value);
sleep(rand()%3);
echo $value."\n";
}catch(Exception $e){
echo $e->getMessage()."\n";
}
}
?>
<?php
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
while(True){
try{
echo $redis->LPOP('key1')."\n";
}catch(Exception $e){
echo $e->getMessage()."\n";
}
sleep(rand()%3);
}
?>
网友回复
CefSharp与Electron开发桌面应用哪个更好?
在哪可以免费白嫖claude 4.5?
如何编写一个chrome插件实现多线程高速下载大文件?
cdn版本的vue在网页中出现typeerror错误无法找到错误代码位置怎么办?
pywebview能否使用webrtc远程控制共享桌面和摄像头?
pywebview6.0如何让窗体接受拖拽文件获取真实的文件路径?
如何在linux系统中同时能安装运行apk的安卓应用?
python有没有离线验证码识别ocr库?
各家的ai图生视频及文生视频的api价格谁最便宜?
openai、gemini、qwen3-vl、Doubao-Seed-1.6在ui截图视觉定位这款哪家更强更准?