<分区>
我正在尝试绑定(bind) div 元素的点击事件以显示它们各自的模态。
我传递了每个元素的 ID,函数报告它绑定(bind)了正确的 ID。
当我实际点击一个 div 时,点击事件总是针对最终 ID 触发。
我检查了 DIV 的 HTML,它们都有正确的 ID。
<div id="e800" data-target="#event800" class="event" data-eid="800">
<p>Click Me</p>
<div id="event800" style="display: none;" role="dialog" tabindex="1" class="modal">
<p>I am another DIV</p>
</div>
</div>
<div id="e801" data-target="#event801" class="event" data-eid="801">
<p>Click Me</p>
<div id="event801" style="display: none;" role="dialog" tabindex="1" class="modal">
<p>I am another DIV</p>
</div>
</div>
<div id="e802" data-target="#event802" class="event" data-eid="802">
<p>Click Me</p>
<div id="event802" style="display: none;" role="dialog" tabindex="1" class="modal">
<p>I am another DIV</p>
</div>
</div>
function BindEvents(ids) {
for(var i = 0, l = ids.length; i < l; i++) {
/* ID of element - ex: #e800 */
var e = "#e" + ids[i];
/* ID of element I want to show - ex: #event800 */
var id = $(e).data('target');
/*
This console.log outputs the correct e and id. Ex:
"Binding click of #e800 to show #event800"
*/
console.log("Binding click of " + e + " to show " + id);
$(e).on('click', function(ev) {
/*
This console.log outputs the e and id of the very last div.
I click #e800 and the output for this is :
"Click event of #e802 now showing #event802"
*/
console.log("Click event of " + e + " now showing " + id);
$(id).show();
$('#backdrop').show();
});
/*
$(id) element is a child of the $(e) element.
If we do not call ev.stopPropagation() then
the click will also be triggered in $(e).
This would cause the modal to reshow directly
after being hidden.
Which means once clicked, it would never hide.
*/
$(id).on('click', function(ev) {
ev.stopPropagation();
$(id).hide();
$('#backdrop').hide();
});
}
}
我的问题的解决方案在重复问题中。
虽然我已将我的代码更改为已接受的答案并删除了循环。
function BindEvents(ids) {
$(document).on('click', '.event-bind', function() {
var id = $(this).data('target');
$(id).show();
$('#backdrop').show();
$(id).one('click', function(ev) {
ev.stopPropagation();
$(id).hide();
$('#backdrop').hide();
});
});
}