2016-03-31 19 views
0

.toggleClassを動作させるのに少し問題があります。私はjavascriptに非常に新しいので、ここで本当にシンプルな何かを逃した場合、私を許してください。私はユーザーが画像や投稿のようなものを好きになるようにしたい。クリックすると、追加/削除しているかどうかによって、赤/黒に変わるはずの小さな心臓アイコンがあります。 .toggleClassとは別にすべてが機能します。誰かが間違っているところを指摘できますか?AjaxリクエストのtoggleClassが機能しない

のindex.php


<div class="heart-box"> 
    <?php 
//Check if user has fav'd the image.. 
    $hasFav = db::getInstance()->query("SELECT * FROM favourites WHERE userID = ? AND img_id = ?", array($the_user, $img_id)); 
    $action = $hasFav->results() ? 'unfav-heart' : 'fav-heart'; 
    ?> 

    <div class="<?php echo $action; ?> fa fa-heart" id="<?php echo $img_id; ?>" ></div> 
</div> 

スクリプト


$(document).ready(function(){ 


    //add to favourites... 
    $('.fav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $(img_id).toggleClass("unfav-heart"); 
     } 
    }); 
    }); 
    // remove from favourites... 
    $('.unfav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $(img_id).toggleClass("fav-heart"); 
     } 
    }); 
    }); 
}); 

+0

ページがレンダリングされる前にバックエンドでPHPを使用してクエリを実行するのは、フロントエンド –

+0

Uh @ Matt.kでクエリを実行しているBADプラクティスです。 –

+0

@Jayそれを見てもそれはまだ悪い考えではありませんか? –

答えて

2

jQueryのidをセレクタで#が必要になります。他の回答で指摘したように

$(document).ready(function(){ 


    //add to favourites... 
    $('.fav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $("#"+img_id).toggleClass("unfav-heart"); 
     } 
    }); 
    }); 
    // remove from favourites... 
    $('.unfav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $("#"+img_id).toggleClass("fav-heart"); 
     } 
    }); 
    }); 
}); 
+0

ありがとうございました!ホーリークラップ私は#のためにすべての時間のためにこれに立ち往生してきた!ハハ。大変感謝しています:) – ShiggyDooDah

+0

あなたはすごいです! –

+1

IDを使用する理由は何ですか?あなたは、要素を直接指す変数を使用しています。クリック関数の 'var img = $(this)'、成功関数の 'img.toggleClass()'です。 – Barmar

3

、あなたはセレクタでIDを示すために#接頭辞を残しました。しかし、要素に直接指す変数があるため、セレクタを使用する必要はありません。

$('.fav-heart').click(function(){ 
    var img = $(this); 
    var img_id = this.id; 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     img.toggleClass("unfav-heart"); 
     } 
    }); 
    }); 
+0

私はイメージ要素を使用していません。私は基本的にid属性に画像のidを入れて、それをPHPファイルに投稿しています。そのphpファイルは、ユーザidとともにdbに問い合わせて、存在するかどうかをチェックします。しかし、私は文字通りJavascriptの使用経験がないので、あなたの答えは私にとってはまだ役に立ちます。ありがとう – ShiggyDooDah

+0

申し訳ありませんが、私はあなたのHTMLを見ていませんでした。あなたが変数 'img_id'を呼び出したので、イメージであると仮定しました。しかし、要素の型は無関係です。要点は、要素を含む変数があることです。コールバックでIDを使用する必要はありません。 – Barmar

1

両方のセレクタのクリックハンドラは、ドキュメントの準備ができた状態で登録されています。そのため、セレクタクラスに一致する要素のみがクリックハンドラに割り当てられます。後でクラスを切り替えると、クリックハンドラを再割り当てする必要があります。

より良いアプローチは、すべての心臓要素に対してクリックハンドラを登録することです。クリックハンドラの内部では、クラスをそれに応じて切り替えるスイッチケースステートメントを実行します。

関連する問題