我有一个基于 PHP 的 Web 应用程序,它监视进程的状态并显示具有该状态的页面。用户可以单击页面上的按钮来更新状态。但是,我的服务器上的处理负载非常重,以至于不希望过于频繁地更新状态。所以我想要一种方法来限制某人每分钟点击提交按钮(刷新页面上显示的状态)。例如,如果有人在 12:00:00 点单击按钮,他们应该直到 12:01:00 才能再次单击它。
单击按钮后,我可能希望禁用该按钮并在一分钟后重新启用它 - 这是我的首选解决方案。
非常感谢你。
我有一个基于 PHP 的 Web 应用程序,它监视进程的状态并显示具有该状态的页面。用户可以单击页面上的按钮来更新状态。但是,我的服务器上的处理负载非常重,以至于不希望过于频繁地更新状态。所以我想要一种方法来限制某人每分钟点击提交按钮(刷新页面上显示的状态)。例如,如果有人在 12:00:00 点单击按钮,他们应该直到 12:01:00 才能再次单击它。
单击按钮后,我可能希望禁用该按钮并在一分钟后重新启用它 - 这是我的首选解决方案。
非常感谢你。
wtf...人们对 jQuery 上瘾了。
<input id="btn" type="button" value="click me" onclick="doSomething();"/>
<script>
function doSomething() {
document.getElementById("btn").disabled=true;
setTimeout('document.getElementById("btn").disabled=false;',60000);
// do your heavy stuff here
}
</script>
只是一个建议,但如果您要编写代码以使用客户端计时器(setTimeout)限制提交按钮的速率,为什么不一起删除更新按钮,并制作页面以您预定义的时间间隔自动更新?
这是 jQuery 中的一些示例代码(因为 jQuery 提供了一些很棒的跨浏览器 AJAX 支持)
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<scrypt type="text/javascript">
$(function(){
// On page load...
updateStatus();
})
function updateStatus(){
$('#status').load('/url/to/status/display.php');
setTimeout(updateStatus, 60000) // 60,000 miliseconds = 1 minute
}
</script>
</head>
<body>
<div id="status">
<!-- whatever is in /url/to/status/display.php will be loaded here -->
</div>
</body>
</html>
要执行此纯 javascript,您可以简单地捕获单击事件,禁用按钮并在超时后再次启用它,下面的代码使用 jQuery 并假设您的按钮有一个 id 'button' (<button id="button">点击!</button> 或者如果是输入:<input type='button' id="button">点击!</input>)
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'></script>
<script type='text/javascript'>
$('#button').click( function(){
$(this).attr('disabled', 'disabled');
setTimeout(enableButton, 1000);
return true; //make sure default click event happens
});
var enableButton = function(){
$('#button').removeAttr('disabled');
}
</script>
您说进度非常繁重,请注意,即使人们不能每分钟按下一次按钮(如果他们启用了 javascript),他们仍然可以禁用 javascript 并尽可能多地按下按钮,或者调用url 直接任意多次。
编辑向脚本添加了完整的 HTML
使用设置超时。
使用 underscore.js 这很简单:
var func = _.debounce(function(x) {return x * x}, 60000);