Bootstrap 3 - 如果手风琴位于通过 ajax 填充的模式内,则不会触发事件 hidden.bs.collapse
Bootstrap 3 - Event hidden.bs.collapse not fired if the accordion is inside a modal populated via ajax
我有一个简单的 bootstrap 模式,通过 ajax 填充。内容是 bootstrap 插件 Collapse 制作的 Accordion。如果我尝试检测 hidden.bs.collapse(或任何其他 Event detectable),它不会被触发。
http://jsfiddle.net/Diac/n2jm5cy8/
HTML
<!-- Button trigger modal -->
<a href="/echo/html/" data-remote="false" data-toggle="modal" data-target="#myModal">Launch demo modal</a>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body" id="modalbody">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
accordion.html(通过 ajax 加载)
<div class='panel-group' id='accordion'>
<div class='panel panel-default' id='panel1'>
<div class='panel-heading'>
<h4 class='panel-title'>
<a data-toggle='collapse' data-parent='#accordion' href='#collapseOne'>Collapsible Group Item #1</a>
</h4>
</div>
<div id='collapseOne' class='panel-collapse collapse in'>
<div class='panel-body'> Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. </div>
</div>
</div>
</div>
JavaScript
$('a[data-toggle]').click(function(e) {
e.preventDefault();
});
$('#myModal').on('show.bs.modal', function(event) {
$.ajax({
url: "accordion.html",
success: function(responseText) {
$("#modalbody").html(responseText);
}
});
});
$('.panel').on('hidden.bs.collapse', function (e) {
alert('Event fired on #' + e.currentTarget.id);
})
您正试图在任何带有 .panel class 的元素存在于 DOM 之前将您的事件侦听器附加到带有 .panel class 的元素。
为了使您的代码正常工作,您可以在 .panels 实际插入到 DOM 之后,将 $('.panel').on(...)
移动到 AJAX 成功回调中。或者,可能最好,您可以改用事件委托:
$('#modalbody').on('hidden.bs.collapse', '.panel', function (e) {
alert('Event fired on #' + e.currentTarget.id);
});
请参阅 jQuery documentation 中关于事件委托的讨论。
相关摘录:
Event handlers are bound only to the currently selected elements; they must exist at the time your code makes the call to .on(). To ensure the elements are present and can be selected, place scripts after the elements in the HTML markup or perform event binding inside a document ready handler. Alternatively, use delegated events to attach event handlers.
我有一个简单的 bootstrap 模式,通过 ajax 填充。内容是 bootstrap 插件 Collapse 制作的 Accordion。如果我尝试检测 hidden.bs.collapse(或任何其他 Event detectable),它不会被触发。
http://jsfiddle.net/Diac/n2jm5cy8/
HTML
<!-- Button trigger modal -->
<a href="/echo/html/" data-remote="false" data-toggle="modal" data-target="#myModal">Launch demo modal</a>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body" id="modalbody">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
accordion.html(通过 ajax 加载)
<div class='panel-group' id='accordion'>
<div class='panel panel-default' id='panel1'>
<div class='panel-heading'>
<h4 class='panel-title'>
<a data-toggle='collapse' data-parent='#accordion' href='#collapseOne'>Collapsible Group Item #1</a>
</h4>
</div>
<div id='collapseOne' class='panel-collapse collapse in'>
<div class='panel-body'> Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. </div>
</div>
</div>
</div>
JavaScript
$('a[data-toggle]').click(function(e) {
e.preventDefault();
});
$('#myModal').on('show.bs.modal', function(event) {
$.ajax({
url: "accordion.html",
success: function(responseText) {
$("#modalbody").html(responseText);
}
});
});
$('.panel').on('hidden.bs.collapse', function (e) {
alert('Event fired on #' + e.currentTarget.id);
})
您正试图在任何带有 .panel class 的元素存在于 DOM 之前将您的事件侦听器附加到带有 .panel class 的元素。
为了使您的代码正常工作,您可以在 .panels 实际插入到 DOM 之后,将 $('.panel').on(...)
移动到 AJAX 成功回调中。或者,可能最好,您可以改用事件委托:
$('#modalbody').on('hidden.bs.collapse', '.panel', function (e) {
alert('Event fired on #' + e.currentTarget.id);
});
请参阅 jQuery documentation 中关于事件委托的讨论。
相关摘录:
Event handlers are bound only to the currently selected elements; they must exist at the time your code makes the call to .on(). To ensure the elements are present and can be selected, place scripts after the elements in the HTML markup or perform event binding inside a document ready handler. Alternatively, use delegated events to attach event handlers.