0

私は jQuery の 5 つ星評価システムを構築しました。評価はヒット数とともにデータベースに挿入/保存されます。星を繰り返しクリックすると、評価をデータベースに挿入する際に問題が発生します。

つまり、星が連続してクリックされた場合、評価は挿入されませんが、ヒットが挿入され、新しい結果の評価に影響します。

遅延を追加するか、クリック機能を停止して再度起動する必要があります。クリック機能に遅延を追加できるとよいでしょう。

この方法でもう一度クリック機能を停止しようとしていますが、機能しません。

jQuery:

        $('.u-rating').click(function (e){
    var id = $(this).parent().attr('id');
    var rating = ($(this).index()+1)/2;
        $.ajax({
        type: "POST",
        url:"rating.php",
        data: {rating:rating, id:id},
        cache: false,
        success: function(data1)          
           {
            get_rating();
            $('#u-rating p').html('Rating Submitted');
           }            
         });
            e.preventDefault();
            e.stopImmediatePropagation();
            return false;
     });

ユーザーが複数回評価しないようにするにはどうすればよいですか?

4

2 に答える 2

1

バックエンドがヒットのみを登録し、評価は登録しないという実際の問題をお勧めします。おそらく、バンドエイドでカバーするのではなく、問題の修正に集中する必要があります。

それでも、質問に対処するには、one()を使用してクリックハンドラーを1つだけバインドし、成功(およびエラー)ごとに再バインドできます。例については、このjsfiddleを参照してください。コードは次のとおりです。

HTML:

<button id="button">Vote!</button>​

JS:

var postClick = function () {
    console.log('click fired!!');
    el = $(this);
    el.prop('disabled', true);
    //var id = $(this).parent().attr('id');
    //var rating = ($(this).index()+1)/2;
    $.ajax({
        type: "POST",
        url:"/echo/json/",
        //data: {rating:rating, id:id},
        cache: false,
        success: function(data1){
            //get_rating();
            //$('#u-rating p').html('Rating Submitted');
            console.log('ajax success, starting timeout peridod. Clicks will not register now, for the next 5 seconds!');
            setTimeout(function() {
                $('#button').one('click', postClick);
                el.prop('disabled', false);  
                console.log('Clicks are re-enabled!');
            }, 5000);
        } 
    });
}

$('#button').one('click', postClick);

</ p>

于 2012-10-11T14:14:31.240 に答える
1

投票者がログインしているユーザーである場合、これらのユーザーが作成したすべての評価を user_id とともにテーブルに保存すると、投票を追跡するのにまったく問題はありません。そうでない場合は、日付と IP アドレスを含むテーブルに保存します。

IP はおおよその間隔の後に更新して別のユーザーを指すことができるため、約 1 日または 1 週間程度のタイムアウト日を設定できます。これには、ユーザーが 1 日 / 1 週間に 1 回投票し続けることができるという欠点があります (IP を変更していない場合)。それがプロジェクトで受け入れられるかどうかはわかりません。

次に、(疑似コード)

if (not exists sql("select rating from voteditems 
                      where ipaddress = @ip_adress // Switch to "user_id" if that's what you're using
                      and item_id = @item_id
                      and datevoted > getdate()-1")) // Or -7 or whatever interval you choose
{
  insert_rating();
}

ヒットは次のようにカウントできます。

select count(rating) from voteditems where item_id = @item_id
于 2012-10-11T16:04:19.310 に答える