2012-01-10 16 views
11

私のサイトにユーザーの評判のシステムを実装しようとしています。だから、あなたが彼がやりとりするたびに(例えば、彼がコメントをするたびに)、ユーザーの名前の後にrep番号を見ることができます。また、ユーザーの評判を変える投票システムもあり、私はその変更を反映するために担当者番号を欲しい。だから私はそのユーザーの新しい担当者番号を返すajaxを介してファイルを呼び出しています。 HTML/PHPファイル(彼はポストをした場合)、最初のインスタンスのようなものです:.replaceWith()は一度だけ動作します

echo '<div class="rep_user_id" id="rep_user_id_'.$posts_row['userid'].'"> '.$posts_row['user_rep'].'</div>'; 

、その後、(彼がコメントをした場合):

echo '<div class="rep_user_id" id="rep_user_id_'.$com_row['userid'].'">'.$com_row['user_rep'].'</div>'; 

私にこれを与えるの両方その後

<div class="rep_user_id" id="rep_user_id_110">293</div> 

JS:

function change_reps() { 
var userid = $('.rep_user_id').attr('id').replace('rep_user_id_',''); 
$.ajax({ 
url: "vote/get_reputation.php", 
data: "userid="+userid, 
success: function(server_response){ 
$("body").ajaxComplete(function(event, request){ 
    var reputation = server_response; 
    $('#rep_user_id_'+userid).replaceWith(''+reputation); 
    $('#rep_user_id_'+userid).effect("highlight", {color:'red'}, 1000); 
}); } }); } 

この関数は、別のajaxが成功した後(repとvoteを更新するために)呼び出されます。それで、これから何が効いているのです:任意の矢印をクリックすると、投票カウンタが上下に表示されますが、ユーザー担当者が最初のインスタンスのみを変更する(投稿)ことがわかります。なぜそれは一度だけ変化し、文書全体では変化しないのですか?コメントセクションが別のファイル(インクルード付き)から呼び出されることは何もしていますか?この効果はすべての場合に有効です。 お手伝い願います。ありがとう

編集:私は自分自身を非常にうまく説明していないことを知ったので、もう少しの行を追加しています。問題は、同じIDとクラスを持つ複数の要素を1回だけ変更することができないことです(1つの要素を複数回変更するのではなく)。だから、私は293回、ページ全体に何度も出てきましたが、コードは1つの要素だけを変更しています!

$("body").on("click", ".vote_com_up", function(){ 
    var com_id = $(this).attr('id').replace('vote_com_up_',''); 
    $.ajax({ 
    url: "vote/comment_vote.php", 
    data: "com_action=2&com_id="+com_id, 
    success: function(server_response){ 
    $(".vote_com_number").ajaxComplete(function(event, request){ 
    if(server_response == 'voted') 
     { alert("Ya has votado en este post!");} 
    else{ 
     var new_com_votes = server_response; 
     $("#vote_com_number_"+com_id).html(+new_com_votes); 
    } }); } 
    }).done(function() { 
    change_reps(); 
    }); 
    return false; 
}); 

は私が欲しいものを表示するために、小さなjsfiddleをした: これはchange_reps()をトリガーするものです

http://jsfiddle.net/CMgYb/1/

SOLUTION:ブライアンNaegeleは正しかった:私はクラスが必要なの代わりに、 ids。

+0

のように聞こえるstackoverflow :)コードをリファクタリングするだけです –

+0

もっとコードを投稿できますか? change_reps()を呼び出すのは何ですか? –

答えて

4

おそらく、あなたがそのIDの最初の出現を取得するIDを選択しているという事実と関係しているでしょう。クラスを使用する必要があります。 jQueryのドキュメントによると

+0

今はクラスを設定するのは苦しいですが、あなたはコインの上にいました。ありがとう!!! – cbarg

12

idでアクセスしています。を新しいもので置き換えています。これがもう一度働く唯一の方法は、あなたがそれを置き換えるものが前と同じidを持っているかどうかです。私はそれがないと推測しています。あなたのPHPをより詳しく見ると

$('#rep_user_id_' + userid).html('' + reputation); 

EDIT

、それは見てない:

あなたはhtml機能で、この要素の内容を設定したくないあなたはよろしいです実際にdiv全体を置き換えるためにこれをコーディングしたようなものです。それでも正しい要素IDを生成するためにPHPをコーディングすることをお勧めします。 divのコンテンツをに送信するだけで、このPHPをトリミングすることを検討してください。次に、上記のようにhtmlを使用するだけです。

+0

.html();私のために働いた唯一の解決策でした。 .replaceWith()も.text()も機能しませんでした。 –

5

$('#rep_user_id_'+userid).replaceWith(''+reputation); 

それが変更されます:

The .replaceWith() method removes content from the DOM and inserts new content in its place with a single call.

これが意味することは、あなたがやるときということですので、

<div class="rep_user_id" id="rep_user_id_110">293</div> 
//to 
293 

二時間、それajaxを起動するとid:rep_user_idが見つかりません。これを解決する最も簡単な方法は、text()でinnerHTMLを変更することです(注:hml()を使用することもできますが、この場合はtext()が有効です)。

$('#rep_user_id_'+userid).text(reputation);
+0

評判変数の価値はdivの全体のHTMLだと思います。 –

+0

それは問題ではありません、locrizak。問題は、要素を何度も変更することはできませんが、同じIDを持つ複数の要素を1回だけ変更することはできません。 – cbarg

関連する問題