1

我正在建立一个 Like/Unlike 系统,我有一个按钮,它有一个类,如果我单击它,数据将插入数据库中,并且类更改为不同。

与假设拉另一个 ajax 调用不同,它删除了实际的喜欢但它不工作,当类改变它时,它会执行类似的类假设做的事情,并且它只有在我刷新页面时才有效。

php代码

<div class="btn-group pull-right">
<?php
    $like = '<button class="btn btn-primary btn-small like" data-like="'.$user->id.'">
        <i class="icon-thumbs-up icon-white"></i> Like
    </button>';  
    foreach ($user->likes as $likes) {
        if($likes['liked_by'] == Session::get('sentry_user')) {
          $like = '<button class="btn btn-primary btn-small unlike" data-like="'.$user->id.'">
            <i class="icon-thumbs-down icon-white"></i> Unlike
            </button>'; 
            break 1;
         }
    }
    echo $like; 
 ?>
</div>

jQuery

$('button.like').bind('click', function(){
    var likeId = $(this).data('like');
    $.ajax({
        url: siteUrl + 'profile/like',
        type: "post",
        data: {user_id: likeId},
        dataType: "json",
        context: this,
        beforeSend: function()
        {
            $(this).addClass('disabled');
        },
        success: function(data)
        {
            if(data.status == "like") {
                $(this).removeClass('like')
                .addClass('unlike')
                .append()
                .html('<i class="icon-thumbs-down icon-white"></i> Unlike');
            }
        },
        complete: function()
        {
            $(this).removeClass('disabled');
        }
    });

});

$('button.unlike').bind('click', function(){
    var likeId = $(this).data('like');
    alert('you are about to unlike');


})

只是在我用它进行ajax调用之前对一个例子进行了不同的警报来测试它。

所以云有人给我提示吗?

4

3 回答 3

1

你也可以$(selector).toggleClass();像这样使用:

jQuery:

$('button.like,button.unlike').on('click',function(){
    $.ajax(
        ...
        $(this).toggleClass('like unlike');
    );
})

这是一个jsbin

于 2012-11-20T09:45:12.827 回答
1

我在我的应用程序上做了类似的事情,我使用了这个逻辑:

html:

<a class="like" onclick="like($(this))"></a>

js:

    function like(_element){

    if($(_element).hasClass('unlike')){

$.ajax(); //do unlike
    $(_element).removeClass('unlike'); // this goes inside the success:function(){} of the ajax call

}else{

     $.ajax(); //do like    
     $(_element).addClass('unlike'); // this goes inside the success:function(){} of the ajax call

}

    }

您也可以重构此示例以仅使用 1 个 ajax 调用,您将拥有更少的代码

于 2012-11-20T09:27:15.320 回答
0

您可以使用像http://phery-php-ajax.net这样的库,它可以让您的代码保持干燥,并且您可以重用代码而无需重新绑定单击事件:这适用于通过添加的所有按钮ajax 并且可以在任何地方重用

data-remote是远程函数的名称,在本例中为 action。它使用事件委托工作,因此无需手动将点击事件绑定到按钮

<div class="btn-group pull-right">
<?php
$like = '<button data-remote="action" class="btn btn-primary btn-small like" data-args="'.Phery::args(array('id' => $user->id, 'perform' => 'like')).'">
    <i class="icon-thumbs-up icon-white"></i> Like
</button>';  
    foreach ($user->likes as $likes) {
       if($likes['liked_by'] == Session::get('sentry_user')) {
         $like = '<button data-remote="action" class="btn btn-primary btn-small unlike" data-args="'.Phery::args(array('id' => $user->id, 'perform' => 'unlike')).'">
         <i class="icon-thumbs-down icon-white"></i> Unlike
         </button>'; 
         break 1;
      }
    }
    echo $like; 
  ?>
</div>

你喜欢/不喜欢的回调

// in your profile/like

function action($data){
  $r = new PheryResponse;
  // $data['id'] got the ID of the like
  if ($data['perform'] === 'like'){
    $r
    ->this()
    ->removeClass('like')
    ->addClass('unlike')
    ->phery('set_args', array('id' => $data['id'], 'perform' => 'unlike'))
    ->html('<i class="icon-thumbs-down icon-white"></i> Unlike'); // exchange the data
  } elseif ($data['perform'] === 'unlike'){
    $r
    ->this()
    ->removeClass('unlike')
    ->addClass('like')
    ->phery('set_args', array('id' => $data['id'], 'perform' => 'like'))
    ->html('<i class="icon-thumbs-up icon-white"></i> Like'); // exchange the data
  }
  return $r;
}

Phery::instance()->set(array(
  'action' => 'action'
))->process();
于 2012-11-21T03:28:09.780 回答