1

私はPMシステムを作成しており、現在メッセージスターシステムを追加しています(ユーザーがメッセージにスターを付けることができるようにするため)。

問題は、ユーザーがメッセージのスターを付けたりスターを外したりするのが非常に速い場合(メッセージを何度もクリックする)、サーバーを台無しにすることです(プロセスが停止するまでホストは503エラーを出します)。メッセージにスターを付けるには、スターをクリックしてスターを付けるか、もう一度クリックしてスターを外すだけです。

何度もクリックされないようにする方法はありますか、それとも1分間にx回クリックした後にエラーがポップアップするようにする方法はありますか?スターをクリックするとAJAXリクエストが送信され、データベースが更新されるため、サーバーが過負荷になるのを防ぐことができます。スターを外すと、同じことをします。

星が1分ほど以内にクリックされた場合にエラーを表示する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.'); }
});
}

前もって感謝します!

4

2 に答える 2

1

いずれにせよ、IMOはエラーメッセージを表示しない方が良いです。

星がクリックされるたびにカウントダウンタイマーを開始/リセットすることを検討してください。カウントダウンしたら、星の現在の状態を送信します。ユーザーのフィードバックは保持され、レート制限が尊重されます。

レート制限があることや、毎回リクエストを送信しているわけではないことを知る必要はありません。

(それは単純な問題を説明するためのたくさんの言葉でした、そして私たちは「メッセージを主演する」が写真付きで何を意味するかを知っていると思います:)

于 2011-11-22T04:08:15.847 に答える
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) {...
}
于 2011-11-23T01:37:35.790 に答える