【问题标题】:Bootstrap 3: prevent modal inside modal to trigger (hidden.bs.modal) every timeBootstrap 3:防止模态内部的模态每次触发(hidden.bs.modal)
【发布时间】:2025-12-22 01:45:06
【问题描述】:

我在另一个模态中有一个模态,并且我设法使内部的一个关闭而不影响另一个。问题在于,当第二个模态关闭时,它会为其自身和第一个模态触发 'hidden.bs.modal' 事件。

<!-- My Html -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Open demo modal</button>
<div class="modal" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
    <div class="modal-dialog modal-sm">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                 <h4 class="modal-title" id="myModalLabel">Demo Modal</h4>
            </div>
            <div class="modal-body">
                <p>
                    <a href="#" data-toggle="modal" data-target="#uploadImage" class="btn btn-primary">Upload image</a>
                </p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
    <div class="modal" id="uploadImage" tabindex="-1" role="dialog" aria-labelledby="uploadImage-title" aria-hidden="true">
        <div class="modal-dialog modal-sm">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                     <h4 class="modal-title" id="uploadImage-title">Upload new image</h4>
                </div>
                <div class="modal-body">
                    Testing Area
                </div>
                <div class="modal-footer">                
                    <button type="button" class="btn btn-default" id="btnUploadCancel">Cancel</button>
                    <button type="button" class="btn btn-success">Accept</button>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- My JS-->
$('#btnUploadCancel').click(function () {
    $('#uploadImage').modal('toggle');
});

$(document).on('hidden.bs.modal', '#myModal', function () {
    alert("hello");
});

$(document).on('hidden.bs.modal', '#uploadImage', function () {
    alert("goodbye");
});

这是我制作的jsFiddle example

这个问题的原因是我只需要在第二个模态隐藏时触发一个动作,然后在第一个模态隐藏时触发其他动作。 关于如何使用每个事件解决此问题的任何想法?

注意: 第二个模态框必须在另一个模态框内,因为它们被称为局部视图。

【问题讨论】:

    标签: javascript jquery twitter-bootstrap twitter-bootstrap-3 bootstrap-modal


    【解决方案1】:

    我猜这些模态元素是异步引入页面的,这就是为什么您使用绑定到文档的委托事件侦听器而不是将 hidden.bs.modal 直接绑定到 #myModal#uploadImage 本身.如果不是这种情况,并且您可以直接使用绑定,我建议使用这种方法来捕获#uploadImage 本身上的hidden 事件,并使用@987654328 之类的方法防止它冒泡DOM 树@。

    不过,您也可以继续将此处理程序委托给文档,并使用传递给处理程序回调的Event 对象的target 属性来确定哪个元素是事件的实际来源:

    $(document).on('hidden.bs.modal', '#myModal', function (event) {
        if (event.target.id == 'uploadImage') {
            // do stuff when the upload dialog is hidden.
        }
        else if (event.target.id == 'myModal') {
            // do stuff when the outer dialog is hidden.
        }
    });
    

    P.S.:您可能已经知道,Bootstrap 框架 does not support overlapping modal dialogs。当您继续在 modals 中嵌套 modals 时请注意这一点,尤其是关于通过标记 API 和 data-dismiss="modal" 初始化的解除元素。

    附:

    【讨论】:

    • 非常感谢它完美运行,这正是我所需要的。我唯一需要做的就是将代码放在主窗口中,因为当放置在部分视图中时,第二个模式会继承所有过去的事件。
    【解决方案2】:

    第二个模态 html 不必包含在第一个模态正文中。仅包括数据目标链接并将第二个模式移到第一个模式之外。这样,事件将按您的预期触发。

    <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Open demo modal</button>
    <div class="modal" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
        <div class="modal-dialog modal-sm">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                     <h4 class="modal-title" id="myModalLabel">Demo Modal</h4>
                </div>
                <div class="modal-body">
                    <p>
                        <a href="#" data-toggle="modal" data-target="#uploadImage" class="btn btn-primary">Upload image</a>
                    </p>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    
    </div>
    <div class="modal" id="uploadImage" tabindex="-1" role="dialog" aria-labelledby="uploadImage-title" aria-hidden="true">
            <div class="modal-dialog modal-sm">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                         <h4 class="modal-title" id="uploadImage-title">Upload new image</h4>
                    </div>
                    <div class="modal-body">
                        Testing Area
                    </div>
                    <div class="modal-footer">                
                        <button type="button" class="btn btn-default" id="btnUploadCancel">Cancel</button>
                        <button type="button" class="btn btn-success">Accept</button>
                    </div>
                </div>
            </div>
        </div>
    

    http://jsfiddle.net/wytf57mL/3/

    【讨论】:

    • 嗨@mihai-alex 感谢您的回复。我想到了这一点,但我需要第二个在第一个内部,因为两者都是从局部视图中调用的。抱歉,我不清楚。