Как я могу ограничить количество нажатий на элемент в течение минуты? - PullRequest
1 голос
/ 22 ноября 2011

Я делаю систему 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.'); }
});
}

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

вот пример решения для вашей функции 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) {...
}
1 голос
/ 22 ноября 2011

В любом случае, IMO, лучше не показывать сообщение об ошибке.

Рассмотрите возможность запуска / сброса таймера обратного отсчета при каждом нажатии звезды. Как только начнется обратный отсчет, отправьте текущее состояние звезды. Обратная связь с пользователем сохраняется, и ограничение скорости приветствуется.

Им не нужно знать, что существует ограничение скорости или что он не отправляет запрос каждый раз.

(Это было много слов, чтобы описать простую проблему, и я думаю, что мы знаем, что означает «помечать сообщение» без изображения:)

...