我正在尝试在我的网站中实施用户声誉系统。因此,您可以在每次交互时查看用户名后面的代表编号(例如,每次他发表评论时)。还有一个投票系统也改变了用户的声誉,我希望代表号反映这一变化。所以我通过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来展示我想要的东西:
解决方案: Bryan Naegele是对的:我需要课程而不是ids。
答案 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这一事实有关。你需要使用类。