我已阅读.on文档,但其中有一个错误
这是HTML:
<a href="#" class="add-new">make new row</a>
<ul>
<li class="opts" >
<select class="change" href="#" data-row="1">
<option>a</option>
<option>b</option>
<option>c</option>
</select>
</li>
</ul>
这是javascript:
var index = 2;
$('.add-new').on('click',function(e) {
e.preventDefault();
$('.opts:first').clone(true).insertAfter('.opts:last');
$('.opts:last select').attr("data-row", index);
index++;
});
$(document).on('click', '.change', function(e) {
e.preventDefault();
console.log($(this).data('row'));
});
如果我动态生成行,则新元素与.on事件一起使用 但是,如果第一个元素被更改并且添加了更多新元素,则新的元素将触发该事件 现在他们表现得好像是第一个元素。
以下是一个示例:http://jsfiddle.net/BgAsY/2/
添加一行或两行,然后更改除第一个选择之外的任何行
当控制台更改时,控制台会显示正确的相应编号
现在添加几行并更改这些新选择
一切都还不错,但现在改变第一个选择,添加更多行,然后更改那些最新的选择
控制台现在总是显示1,就像它认为那些最新的行是第一行。
我在这里缺少什么?
答案 0 :(得分:2)
答案 1 :(得分:0)
将console.log($(this).data('row'));
替换为console.log($(this).attr('data-row'));
问题原因:
$('.opts:first').clone(true)
时,新克隆对象通过data()
方法将数据集载入原始对象data()
更改其数据,因此数据('row')保持不变。$(elm).data('row')与$(elm).attr('data-row')不一样
这是工作小提琴:http://jsfiddle.net/BgAsY/12/