jQuery:使用AJAX调用更改按钮类

时间:2012-11-20 09:17:49

标签: jquery ajax

我正在构建一个Like / Different系统,我有一个类似于类的按钮,如果我点击它,数据被插入到数据库中,并且类被更改为不同。

并不像假设拉另一个ajax调用什么删除了实际的但是它不起作用,当类改变它时会预先形成像类假设要做的事情,并且它只有在刷新页面时才有效。

php code

<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调用。

所以云有人给我一个暗示吗?

3 个答案:

答案 0 :(得分: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调用,你将拥有更少的代码

答案 1 :(得分:1)

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

jQuery的:

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

这是jsbin

答案 2 :(得分:0)

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

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

<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();