我正在制作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.'); }
});
}
提前致谢!
答案 0 :(得分:1)
无论如何,IMO最好不要显示错误信息。
每次点击星标时,请考虑开始/重置倒数计时器。一旦倒计时,发送星的当前状态。用户反馈得以保留,并且限制了速率限制。
他们不需要知道速率限制,也不需要每次都发送请求。
(用很多词来形容一个简单的问题,我想我们知道“主演一条消息”意味着没有图片:))
答案 1 :(得分:1)
这是您的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) {...
}