jQuery评级系统修改

时间:2012-10-11 14:02:06

标签: php jquery html ajax

我已经构建了一个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;
     });

如何阻止人们多次评分?

2 个答案:

答案 0 :(得分:2)

我建议你真正的问题是你的后端只注册了点击而不是点击率 - 你应该专注于解决问题,而不是用创可贴覆盖它。

然而,要解决您的问题:您可以使用one()将Click处理程序绑定一个,然后在每次成功(和错误)时重新绑定。有关示例,请参阅this 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);

答案 1 :(得分:2)

如果您的选民是登录用户,请将这些用户所做的所有评分存储在一个带有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