2012-01-10 134 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