Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何限制一分钟内单击元素的次数?_Javascript_Jquery_Spam Prevention_Flooding - Fatal编程技术网

Javascript 如何限制一分钟内单击元素的次数?

Javascript 如何限制一分钟内单击元素的次数?,javascript,jquery,spam-prevention,flooding,Javascript,Jquery,Spam Prevention,Flooding,我正在制作一个PM系统,目前我正在添加消息明星系统(以便用户可以明星消息) 问题是,如果用户持续快速地标记和取消标记消息(反复单击消息),则会使服务器陷入混乱(主机将在进程停止之前输入503错误)。要启动邮件,只需单击启动/再次单击取消启动即可 有没有办法防止它被多次点击,或者在一分钟内点击次数x后弹出一个错误?这将防止它过载服务器,因为当您单击星型时,它会发送一个AJAX请求并更新数据库;当您取消启动它时,它也会执行相同的操作 如果在一分钟左右的时间内点击星号,是否有jQuery方式显示错误

我正在制作一个PM系统,目前我正在添加消息明星系统(以便用户可以明星消息)

问题是,如果用户持续快速地标记和取消标记消息(反复单击消息),则会使服务器陷入混乱(主机将在进程停止之前输入503错误)。要启动邮件,只需单击启动/再次单击取消启动即可

有没有办法防止它被多次点击,或者在一分钟内点击次数x后弹出一个错误?这将防止它过载服务器,因为当您单击星型时,它会发送一个AJAX请求并更新数据库;当您取消启动它时,它也会执行相同的操作

如果在一分钟左右的时间内点击星号,是否有jQuery方式显示错误

以下是我的主演职责:

function addStar(id) {
    $('#starimg_' + id).removeClass("not_starred").addClass("starred");
    $('#star_' + id).attr({
        'title': 'Starred',
        'onclick': 'removeStar(' + id + ')'
    });
    $.get('tools.php?type=addstar', {id: id}, function(data) {
    if(data=='true') { // tools.php will echo 'true' if it is successful
    alertBox('The message has been starred successfully', 2500);
    }
    else { alertBox('An error has occurred. Please try again later.'); }
});
}

function removeStar(id) {
    $('#starimg_' + id).removeClass("starred").addClass("not_starred");
    $('#star_' + id).attr({
        'title': 'Not starred',
        'onclick': 'addStar(' + id + ')'
    });
    $.get('tools.php?type=removestar', {id: id}, function(data) {
    if(data=='true') { // tools.php will echo 'true' if it is successful
    alertBox('The message has been unstarred successfully', 2500);
    }
    else { alertBox('An error has occurred. Please try again later.'); }
});
}

提前谢谢

在任何情况下,最好不要显示错误消息

考虑在每次单击星号时启动/重置倒计时计时器。一旦倒计时,发送恒星的当前状态。保留用户反馈并遵守速率限制

他们不需要知道有速率限制,也不需要知道它不是每次都发送请求


(描述一个简单问题的话太多了,我想我们知道“在没有图片的情况下给消息加上星号”是什么意思:)

下面是addStar函数的示例解决方案。这将在用户上次单击后2秒发送请求,因此,如果用户高兴单击,这些中间单击将不会发送请求,因为计时器将重置

 function addStar(id, delayRequests)
{
    ...
    if(delayRequests == true){
        clearTimeout(timer);
        timer= setTimeout(function() { sendRequestToAddStar(id); },2000);
    }
    else{
        sendRequestToAddStar(id);
    }
}

function sendRequestToAddStar(id)
{
   $.get('tools.php?type=removestar', {id: id}, function(data) {...
}

您还可以使用以下命令:@zero7:分批处理AJAX请求是什么意思?这是一个非常好的主意。谢谢是的,那是很多词,而且图片是不必要的,这就是我删除它的原因:)哇,谢谢。:)那么,我会对
removeStar()
函数也执行同样的操作,还是只对
addStar()
函数使用它?当然可以。。或者你也可以有一个sendRequest和pass参数来决定添加或删除星号,这取决于你自己。好的,太好了。我现在就试试这个。这太完美了。我只是注意到说“邮件已加星号”是愚蠢的,因为当你点击星号时,它显示你加了星号。另外,当我调用函数时,我会怎么做?我是否需要
addStar(1234,true)
?那么我将如何使用它?比如,我应该为延迟请求设置什么?