我面临着非常简单的问题。我正在尝试在动态生成的元素上添加click事件,例如
$(document).ready(function(){
$('ul').on('click', 'li.clickable', function() {
console.log( $(this).text() );
});
});
<ul id="codingView">
<li id="" style="display:none;" class="clickable"><span></span></li>
</ul>
这里我动态创建了两个li
元素。
问题是控制台在li
的每次点击上写了3次。为什么?任何解决方法。
修改
var $box=$('#codingView li:eq(0)');
$('#codingView').empty();
$.each(data,function(key,value){
console.log(this.topic);
$box.find("span").html(this.topic);
$box.css("display","block");
$box.clone().appendTo("#codingView");
});
答案 0 :(得分:1)
听起来你可能正在将<li>
嵌套在彼此内部。我确保生成的HTML符合您的想法。
答案 1 :(得分:0)
我不确定为什么你的代码无效,但这似乎工作正常fiddle
<ul id="codingView"></ul>
$(function() {
var cv = $('#codingView');
cv.on('click', 'li.clickable', function() {
console.log($(this).text());
});
for(var i = 0; i < 5; ++i) cv.append($('<li/>', {'class' : 'clickable'}).html('<b>I AM #' + i + '</b>'));
});
//编辑: 使用您的新代码更新了fiddle,对其进行了一些修改:
$(function() {
var cv = $('#codingView');
$('#codingView').empty();
var data = [{topic: 1}, {topic: 2}, {topic: 3}];
$.each(data,function(){
console.log(this.topic);
var li = $('<li/>', { 'class': 'clickable'}).append($('<span/>').html(this.topic));
li.appendTo(cv);
});
cv.on('click', 'li.clickable', function() {
console.log($(this).text());
});
});