Bootstrap 3 - 如果手风琴位于通过 ajax 填充的模式内,则不会触发事件 hidden.bs.collapse

Posted

技术标签:

【中文标题】Bootstrap 3 - 如果手风琴位于通过 ajax 填充的模式内,则不会触发事件 hidden.bs.collapse【英文标题】:Bootstrap 3 - Event hidden.bs.collapse not fired if the accordion is inside a modal populated via ajax 【发布时间】:2016-01-12 21:54:20 【问题描述】:

我有一个通过 ajax 填充的简单引导模式。内容是由引导插件 Collapse 制作的手风琴。如果我尝试检测 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">&times;</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);
)

【问题讨论】:

***.com/questions/13767919/… 【参考方案1】:

您正试图在 DOM 中存在任何具有 .panel 类的元素之前将事件侦听器附加到具有 .panel 类的元素。

为了使您的代码正常工作,您可以在 .panels 实际插入到 DOM 之后,将 $('.panel').on(...) 移动到 AJAX 成功回调中。或者,也许最好,您可以使用事件委托:

$('#modalbody').on('hidden.bs.collapse', '.panel', function (e) 
    alert('Event fired on #' + e.currentTarget.id);
);

请参阅jQuery documentation 中有关事件委托的讨论。

相关摘录:

事件处理程序仅绑定到当前选定的元素;它们必须在您的代码调用 .on() 时存在。为了确保元素存在并且可以被选择,请将脚本放置在 HTML 标记中的元素之后,或者在文档就绪处理程序中执行事件绑定。或者,使用委托事件来附加事件处理程序。

【讨论】:

谢谢,您的回答解决了我发布的代码的问题,所以我会接受它作为解决方案。但实际上我忘记将$('.panel').on('hidden.bs.collapse', function (e) alert('Event fired on #' + e.currentTarget.id); ) 放在成功回调中。以这种方式它必须工作,但在我的代码中它没有。我的代码中的问题是关于 html ajaxed 中包含的 。它导致了这个错误,我删除了它并且它可以工作。

以上是关于Bootstrap 3 - 如果手风琴位于通过 ajax 填充的模式内,则不会触发事件 hidden.bs.collapse的主要内容,如果未能解决你的问题,请参考以下文章

bootstrap实现手风琴功能(树形列表)

Bootstrap 3折叠手风琴:折叠所有作品,但在保持数据父级的同时不能全部展开

Bootstrap手风琴Javascript在另一张卡关闭时打开一张卡

Bootstrap 4:手风琴不会折叠卡片

ui.bootstrap 手风琴容器宽度问题

Bootstrap - 使用 php 的手风琴风格错误