如何在Javascript中将按钮的点击次数限制为每分钟一次

时间:2009-10-11 08:05:33

标签: javascript rate-limiting

我有一个基于PHP的Web应用程序,它监视进程的状态并显示具有该状态的页面。用户可以单击页面上的按钮来更新状态。但是,我的服务器上的处理负载非常重,以至于不太频繁地更新状态是不合需要的。因此,我希望在“提交”按钮上限制某人每分钟点击一次(这会刷新页面上显示的状态)。例如,如果有人在12:00:00点击按钮,则他们应该无法再次点击它,直到12:01:00。

点击按钮后,我想在一分钟过后禁用按钮并重新启用它 - 这是我的首选解决方案。

非常感谢。

5 个答案:

答案 0 :(得分:5)

只是一个建议,但如果您要通过使用客户端计时器(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>

答案 1 :(得分:5)

要做这个纯javascript,你可以简单地捕获click事件,禁用按钮并在超时后再次启用它,下面的代码使用jQuery并假设你的按钮有一个id'按钮'(&lt; button id = “按钮”&gt;点击!&lt; / button&gt;或如果是输入:&lt; input type ='button'id =“button”&gt;点击!&lt; / input&gt;)

<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并按下按钮尽可能多,或者直接打电话给网址多次。

编辑为脚本添加了完整的HTML

答案 2 :(得分:4)

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>

答案 3 :(得分:2)

使用setTimeout。

答案 4 :(得分:0)

使用underscore.js这很简单:

var func = _.debounce(function(x) {return x * x}, 60000);