我已经与这段代码斗争了几个小时,没有任何进展。有人可以帮我解决这个问题吗? 我正在我的网站上开发一个论坛页面,具有评论和回复评论功能。 单击每个评论下方的“回复”按钮时,会动态显示一个文本区域以供回复。回复将被插入到数据库中,其中包含回复 id 和原始评论 id(发布已回复的原始评论时生成的 id)。 我现在的挑战是,对论坛上任何评论的回复似乎只引用最新评论的 ID(可能是因为回复表单是动态生成的)。因此,在我的数据库中,他们有最新评论的 ID。这实际上意味着在获取时,回复将全部在最新评论下排队。我需要的是一种引用已回复评论 ID 的方法。 这是我的 php 代码:
<?php
require("includes/conn.php");
$stmt=$conn->prepare("SELECT post_id, user, topic, post, time FROM post_tb ORDER BY time DESC");
$stmt->execute();
$result = $stmt->get_result();
$num_of_rows = $result->num_rows;
if ($num_of_rows > 0){
while ($row = $result->fetch_assoc()){
$post_id = $row['post_id'];
$user = $row['user'];
$topic = $row['topic'];
$post = $row['post'];
$time = $row['time'];
$time = date('M dS, Y g:i A', strtotime($time));
echo '<div>
<div>
<h5><strong>'.$user.'</strong></h5><h6>'.$time.'</h6>
<h5><strong>'.ucfirst($topic).'</strong></h5>
<p data-id="'.$post_id.'">'.$post.'</p>
</div>
<div>
<button type="button" class="btn btn-primary rep" id="but_rep" data-id="'.$post_id.'">Reply</button>
</div>
<form id="comment_reply" data-id="'.$post_id.'" method="post" action="">
<input type="text" class="hidden" value="'.$post_id.'" id="post_id">
<input type="text" class="hidden" value="'.$user.'" id="user">
<textarea class="form-control" rows="3" name="post_rep" id="post_rep"></textarea>
<button type="submit" class="btn btn-primary" id="post_rep_sub">Submit</button>
</form>
<div/>';
}
}
?>
我的 Ajax/jquery 在这里:
$("form#comment_reply").hide();//Comment reply form hidden at page load
//To hide reply button and show the reply form
$(document).on('click', 'button.rep', function(e){
e.preventDefault();
var closestDiv = $(this).closest('div');
var closestForm = $(closestDiv).next('form#comment_reply');
$(closestDiv).fadeOut();
$(closestForm).fadeIn();
});
//To process comment reply
$(document).on("click", "form button#post_rep_sub", function(e){
e.preventDefault();
var reply = $("form textarea#post_rep").val();
var name = $("input#user").val();
var post_id = $("input#post_id").val();
if (reply != ''){
$.post('insert_post_reply.php', {'reply':reply, 'name':name, 'post_id':post_id}, function(data){
if (data = 'yes'){
$("form textarea#post_rep").val("");
fetchCommentReply();
}
});
}else{
return false;
}
});
我认为问题出在点击处理程序“表单按钮#post_rep_sub”。
您使用以下语句读取 post_id:
var post_id = $("input#post_id").val();
但是无论按下哪个按钮,这总是返回最后一个 post_id。
为了验证我的观点,您可以添加此内容并观察 javascript 控制台:
var test1 = $("input#post_id");
var test2 = $("input#post_id").length;
console.log(test2);
如果您看到数字 >1,那么您就知道要修复点击处理程序 “表单按钮#post_rep_sub”。
主要问题是您的 php 代码使用相同的 id 多次生成 html 元素(例如按钮)!然后 jquery 仅将自身附加到第一个按钮。 这已经通过一个例子进行了解释:
解决方案:将 id 替换为 name-attribute!
根据 HTML 规范,id 属性在页面上必须是唯一的(这不是网页设计师/开发人员刚刚发明的标准)
即使我没有解析页面,在页面上多次使用相同的 id 是不好的做法吗?
让我们仔细看看您的 php 生成的内容。您有多个具有相同 id 的元素,例如 id="but_rep" 的按钮会生成多次。请注意,您只能在 html 文件中使用 id 仅一次! 因此你不能假设 jquery 使用 id 可靠地附加事件处理程序!
<div>
<div>
<h5><strong>user 1</strong></h5><h6>'.$time.'</h6>
<h5><strong>topic 1</strong></h5>
<p data-id="101">post text1</p>
</div>
<div>
<button type="button" class="btxtn btn-primary rep" id="but_rep" data-id="101">Reply</button>
</div>
<form id="comment_reply" data-id="101" method="post" action="">
<input type="text" class="hidden" value="101" id="post_id">
<input type="text" class="hidden" value="user 1" id="user">
<textarea class="form-control" rows="3" name="post_rep" id="post_rep"></textarea>
<button type="submit" class="btn btn-primary" id="post_rep_sub">Submit</button>
</form>
<div/>
<div>
<div>
<h5><strong>user 2</strong></h5><h6>'.$time.'</h6>
<h5><strong>topic 2</strong></h5>
<p data-id="102">post text2</p>
</div>
<div>
<button type="button" class="btxtn btn-primary rep" id="but_rep" data-id="102">Reply</button>
</div>
<form id="comment_reply" data-id="102" method="post" action="">
<input type="text" class="hidden" value="102" id="post_id">
<input type="text" class="hidden" value="user 2" id="user">
<textarea class="form-control" rows="3" name="post_rep" id="post_rep"></textarea>
<button type="submit" class="btn btn-primary" id="post_rep_sub">Submit</button>
</form>
<div/>
已删除。已删除。已删除。已删除。