2012-01-10 181 views
11

我試圖在我的網站中實現一個用戶信譽系統。所以你可以在他每次互動時看到用戶名後面的代表號(例如,每次他發表評論時)。還有一個投票系統也改變了用戶的聲譽,我希望代表號碼能反映這種變化。所以我通過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成功後調用(更新代表和投票)。所以,從這個角度來看,什麼是工作:一旦我點擊任何箭頭向上或向下,我可以看到投票計數器上或下,但我只看到用戶代表只改變了第一個實例(後)。爲什麼它只改變一次而不是整個文檔?有什麼需要做的是從另一個文件(包含)調用評論部分?僅供參考,效果在所有情況下都適用! 希望你能幫上忙。謝謝

編輯:由於我看到我沒有很好地解釋我自己,我添加了幾行。問題是我無法用一次相同的id和class修改多個元素(而不是多次改變一個元素)。所以我在整個頁面中有293次,但發佈的代碼只改變了一個元素! 這是什麼觸發change_reps():

$("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顯示我想:

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

SOLUTION:布賴恩·尼格爾是正確的:我需要的類,而不是IDS。

+0

聽起來像是stackoverflow :)只是重構他們的代碼 – 2012-01-10 02:50:14

+0

你能發表更多的代碼嗎?什麼叫change_reps()? – 2012-01-10 02:52:49

回答

4

可能與事實有關,您選擇的ID將抓取該ID的第一次出現。你需要使用類。

+0

現在開班是很痛苦的事,但你在硬幣上是正確的。謝謝!!! – cbarg 2012-01-10 17:53:49

12

您正在訪問此元素由ID,然後用新的東西替換它。唯一的方法是第二次運行,如果你用它替換它的ID與以前一樣;我猜測它沒有。

你確定你不想設置此元素的內容html功能:

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

編輯

在你的PHP更仔細地觀察,它看起來就像你已經編碼實際取代整個div一樣。儘管如此,我還是建議不要編碼你的PHP來生成正確的元素ID。考慮修剪這個PHP,這樣你只需發送div的內容。那麼你可以更簡單地使用上面的html

+0

.html();是唯一爲我工作的解決方案。 .replaceWith()和.text()都不起作用。 – 2016-10-30 09:53:56

5

據jQuery的文檔:

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

這意味着,當你做:

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

它改變:

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

所以第二次就發射ajax它找不到ID rep_user_id。解決這個問題的最簡單方法是用text()(注意:你也可以使用hml(),但在這種情況下,text()效果更好,因爲沒有html標籤)改變innerHTML。

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

我認爲聲譽變量的價值是div的整個HTML。 – 2012-01-10 03:48:48

+0

這不是問題,locrizak。問題不在於我無法多次更改元素,而是我無法僅使用一次相同的ID更改多個元素。 – cbarg 2012-01-10 04:16:07