.replaceWith()只工作一次

时间:2012-01-10 02:42:08

标签: javascript jquery

我正在尝试在我的网站中实施用户声誉系统。因此,您可以在每次交互时查看用户名后面的代表编号(例如,每次他发表评论时)。还有一个投票系统也改变了用户的声誉,我希望代表号反映这一变化。所以我通过ajax调用一个文件,该文件返回该用户的新代表号。 html / php文件是第一个实例(如果他发帖):

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和votes)。因此,从中可以看出:当我向上或向下点击任何箭头时,我可以看到投票计数器向上或向下,但我只看到用户代表只改变了第一个实例(post)。为什么它只改变一次而不是整个文件?有什么可以做的,从另一个文件(带有包含)调用评论部分?仅供参考,效果适用于所有情况! 希望你能帮忙。感谢

编辑:由于我已经看到我没有很好地解释自己,我正在添加更多行。问题是我不能一次修改具有相同id和类的多个元素(而不是多次更改一个元素)。所以我在整个页面中有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/

解决方案: Bryan Naegele是对的:我需要课程而不是ids。

3 个答案:

答案 0 :(得分:12)

您通过 id 访问此元素,然后用新内容替换。这个第二次工作的唯一方法是,如果你用它取代它的ID与以前一样;我猜它没有。

您确定不想使用html功能设置此元素的内容

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

修改

仔细观察您的PHP,看起来您已将其编码为实际替换整个div。不过,我建议不要编写PHP代码来生成正确的元素ID。考虑修剪这个PHP,以便你只发送div的内容。然后你可以更简单地使用上面的html

答案 1 :(得分: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()更改innerHTML(注意:您也可以使用hml()但在这种情况下text()效果更好,因为没有html标记。)< / p>

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

答案 2 :(得分:4)

可能与你正在选择一个能够获取该ID第一次出现的ID这一事实有关。你需要使用类。