Javascript 检查是否有任何引导模式打开

Javascript 检查是否有任何引导模式打开,javascript,twitter-bootstrap,twitter-bootstrap-3,Javascript,Twitter Bootstrap,Twitter Bootstrap 3,如果任何引导模式当前处于打开状态,如何检查 背后的原因是:如果某个模式打开,我想停用某些keyhandler。引导模式在打开时触发事件。在您的情况下,我建议将一个事件绑定到show.bs.modal事件,并解除键处理程序事件的绑定。简单的例子: $('#myModal').on('show.bs.modal', function (e) { // yadda yadda .unbind() }) 文档:,向下滚动至事件。您可以尝试以下操作: alert($('#myModal').ha

如果任何引导模式当前处于打开状态,如何检查


背后的原因是:如果某个模式打开,我想停用某些keyhandler。

引导模式在打开时触发事件。在您的情况下,我建议将一个事件绑定到
show.bs.modal
事件,并解除键处理程序事件的绑定。简单的例子:

$('#myModal').on('show.bs.modal', function (e) {
    // yadda yadda .unbind()
})
文档:,向下滚动至事件。

您可以尝试以下操作:

alert($('#myModal').hasClass('in'));

拿着这个:

$(document).find('.modal').each(function(e) {

    var element = $(this);

    if ( (element.data('bs.modal') || {isShown: false}).isShown ) {
      console.log('a modal is open');
    }

});

如果您使用的是jquery,则可以使用:

function isABootstrapModalOpen() {
    return $('.modal.in').length > 0;
}
香草JS解决方案:

function isABootstrapModalOpen() {    
    return document.querySelectorAll('.modal.in').length > 0;
}
此解决方案适用于任何模式,而不仅仅是特定模式

编辑:如果在任何给定时刻,某个模态打开,则测试上面的代码。如其他答案所示,如果要在打开模式时禁用事件处理程序,则必须使用引导事件,如下所示:

// when any modal is opening
$('.modal').on('show.bs.modal', function (e) {
  // disable your handler
})

// when any modal is closing
$('.modal').on('hide.bs.modal', function (e) {
  // enable your handler
})
您还可以在事件处理程序中使用IsAbootStrapModeLopen来测试是否必须执行处理程序的代码(因此您不需要在每次打开/关闭模式时启用/禁用处理程序)


我的解决方案是使用jQuery的hasClass方法

return $('div.modal).hasClass('in'); // True if open, false if closed

对于引导程序4,如果打开,则模态具有类“show”

因此,要检查是否存在任何模式打开:

if ($('body').find('.modal.show').length) {
    // Do something
}
我目前使用的是堆叠模态(multipleopen),问题是如果你使用.modal('hide')的单个模态。引导从body元素中删除class.modal主体。然后模态不再滚动,所以我必须这样做:

$(document)
    .on('hidden.bs.modal', '.modal', function() {
        /**
         * Check if there are still modals open
         * Body still needs class modal-open
         */
        if($('body').find('.modal.show').length) {
            $('body').addClass('modal-open');
        }
    })
;

你做了什么努力?我已经从下面的答案中看到了解决方案。但这不是我想要的。我想要一个通用的解决方案,它适用于页面上的任何引导模式。虽然我不喜欢这个问题,但这仍然是一个很好的答案,所以+1是的,但这适用于特定模式。我需要一个通用的解决方案。@Razer根据文档:“不支持重叠模态-确保在另一个模态仍然可见时不要打开一个模态。一次显示多个模态需要自定义代码。”因此,要么您内置了自定义代码,要么您试图修复的场景不存在。如果您已经修复了它,您可以绑定到
$(document)。在('show.bs.modal','*',function(){…})上,
应该是
$('.modal')
$(document)
而不是
$('.\myModal')
。如果($('.modal.in').length.),检查可以更简单

$(document)
    .on('hidden.bs.modal', '.modal', function() {
        /**
         * Check if there are still modals open
         * Body still needs class modal-open
         */
        if($('body').find('.modal.show').length) {
            $('body').addClass('modal-open');
        }
    })
;