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()仅绑定一个单击处理程序,然后在每次成功(和错误)时重新绑定。有关示例,请参见此 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 可以在大约间隔后更新并指向不同的用户,因此您可以将超时日期设置为大约天/周左右。这样做的缺点是用户可以每天/每周继续投票一次(如果他们没有更改 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 回答