在下面的代码中,我在数组中有一些注释,这些注释使用jQuery显示在div中。每个评论都有一个选项按钮,可以正常工作,直到我发布新评论。我尝试为每个元素使用唯一ID,但它也不起作用。
页面加载时,选项按钮有效;但是当我提交新评论时,没有一个按钮有效。我究竟做错了什么?
这是我的剧本:
var i = 0;
var comments_display= "";
var comments = ['Hello World!', 'Hello! This is a comment.'];
//reads the entire array, creates the content, and sends it to the div
function show_comments(){
for (i=0; i<comments.length; i++){
comments_display += "<div class='single_comment_container'>";
comments_display += "<div class='comment_comment'>" + comments[i] + "</div>";
comments_display += "<div class='options'>Options</div></div>";
}
$("#comment_container").html(comments_display);
comments_display = "";
}
//appends a new comment to the array
function new_comment(){
if ($("#comment_input").val() == null || $("#comment_input").val() == ""){
alert("Your comment must be at least 1 character long.");
}
else{
comments.push($('#comment_input').val());
show_comments();
$("#comment_input").val("");
}
}
$(document).ready(function(){
show_comments();
$("#submit_comment").click(function(){
new_comment();
});
//display a message when an element of the class 'options' is clicked
$(".options").click(function(){
alert("OPTIONS");
});
});
这是一个小提琴,看看它是如何工作的。 http://jsfiddle.net/fahKb/3/
感谢您抽出宝贵时间阅读此问题。
答案 0 :(得分:3)
您需要使用委托:
$(document).on( 'click', '.options', function() {
alert("OPTIONS");
});
注意:您可能希望使用document
以外的静态元素。 (某些父级div
始终在页面上或其他内容。)
答案 1 :(得分:2)
仅仅因为你是动态添加元素所以点击不适用于那些,所以你必须在页面上找到最接近的现有父级,在这种情况下,这是comment_container
并使用{{1}处理程序:http://jsfiddle.net/fahKb/4/
.on()
答案 2 :(得分:0)
$(document).on( 'click', '.options', function() {
alert("OPTIONS");
});
第一个响应是正确的,原因是当元素加载到DOM中时,您分配事件侦听器。基本上是说嘿,如果这是“点击”#39;然后做点什么。问题是,添加新元素时,您还没有添加事件侦听器。通过执行类似上述代码的操作,基本上您正在执行的操作是搜索文档中的所有内容,然后使用&#34; .options&#34;最后,如果点击它然后执行并执行一些代码。
据说使用文件不是最佳方法,但有时是必要的。一个更好的解决方案是,如果你将所有的评论包括在一个&#34; div&#34;或者其他一些元素然后传递它代替文档。这将不是在整个文档中搜索&#39; .options&#39;,而是只搜索您的包装器,从而消除了大量不必要的工作。
$('.commentWrapper').on( 'click', '.options', function() {
alert("OPTIONS");
});