如何通过页面上的任何其他位置点击关闭Twitter Bootstrap弹出框?

156

我目前正在使用 Twitter Bootstrap 中的弹出窗口,可以通过以下方式初始化:

$('.popup-marker').popover({
        html: true,
        trigger: 'manual'
    }).click(function(e) {
        $(this).popover('toggle');
        e.preventDefault();
    });

如您所见,它们是手动触发的,单击.popup-marker(这是带有背景图像的div)会切换弹出框。这很好用,但我希望还能够通过单击页面上其他任何地方(但不是弹出框本身!)来关闭弹出框。

我尝试了几种不同的方法,包括以下方法,但没有结果可以展示:

$('body').click(function(e) {
    $('.popup-marker').popover('hide');
});

如何使弹出框在页面的任意其他位置单击时关闭,但不是在弹出框本身上单击?


嗯,我认为那应该可以运行...你有可能有在线链接吗? - thatryan
31个回答

0
btn-popover类添加到打开弹出窗口的按钮/链接上。此代码将在单击弹出窗口外部时关闭弹出窗口。
$('body').on('click', function(event) {
  if (!$(event.target).closest('.btn-popover, .popover').length) {
    $('.popover').popover('hide');
  }
});

0

这应该在Bootstrap 4中起作用:

$("#my-popover-trigger").popover({
  template: '<div class="popover my-popover-content" role="tooltip"><div class="arrow"></div><div class="popover-body"></div></div>',
  trigger: "manual"
})

$(document).click(function(e) {
  if ($(e.target).closest($("#my-popover-trigger")).length > 0) {
    $("#my-popover-trigger").popover("toggle")
  } else if (!$(e.target).closest($(".my-popover-content")).length > 0) {
    $("#my-popover-trigger").popover("hide")
  }
})

说明:

  • 第一节根据文档初始化弹出层:https://getbootstrap.com/docs/4.0/components/popovers/
  • 第二节中的第一个 "if" 检查所点击的元素是否是 #my-popover-trigger 的后代。 如果是,则切换弹出层(它处理触发器上的单击事件)。
  • 第二节中的第二个 "if" 检查所点击的元素是否是在初始化模板中定义的弹出层内容类的后代。 如果不是,这意味着单击不在弹出层内容内,因此可以隐藏弹出层。

你能否详细说明一下你的代码?解释一下你正在做什么吗? - Vendetta
@DeathWaltz,我刚在答案中添加了解释。 - Bart Blast

0
$('.popForm').popover();

$('.conteneurPopForm').on("click",".fermePopover",function(){
    $(".popForm").trigger("click");
});

清楚地说,只需要触发弹出窗口。


0

@RayOnAir,我和之前的解决方案有同样的问题。我也接近了@RayOnAir的解决方案。一个改进的地方是当单击其他弹出标记时,关闭已经打开的弹出窗口。所以我的代码是:

var clicked_popover_marker = null;
var popover_marker = '#pricing i';

$(popover_marker).popover({
  html: true,
  trigger: 'manual'
}).click(function (e) {
  clicked_popover_marker = this;

  $(popover_marker).not(clicked_popover_marker).popover('hide');
  $(clicked_popover_marker).popover('toggle');
});

$(document).click(function (e) {
  if (e.target != clicked_popover_marker) {
    $(popover_marker).popover('hide');
    clicked_popover_marker = null;
  }
});

0

我是这样做的

$("a[rel=popover]").click(function(event){
    if(event.which == 1)
    {   
        $thisPopOver = $(this);
        $thisPopOver.popover('toggle');
        $thisPopOver.parent("li").click(function(event){
            event.stopPropagation();
            $("html").click(function(){
                $thisPopOver.popover('hide');
            });
        });
    }
});

希望这能帮到你!


0

我发现这是对pbaron上面建议的修改版,因为他的解决方案在所有具有类“popup-marker”的元素上激活了popover('hide')。然而,当您将popover()用于html内容而不是data-content时,如下所示,任何在html弹出窗口内部的单击实际上都会激活popover('hide'),从而迅速关闭窗口。以下方法遍历每个.popup-marker元素,并首先发现父级是否与被单击的.popup-marker的id相关联,如果是,则不隐藏它。所有其他div都被隐藏...

        $(function(){
            $('html').click(function(e) {
                // this is my departure from pbaron's code above
                // $('.popup-marker').popover('hide');
                $('.popup-marker').each(function() {
                    if ($(e.target).parents().children('.popup-marker').attr('id')!=($(this).attr('id'))) {
                        $(this).popover('hide');
                    }
                });
            });

            $('.popup-marker').popover({
                html: true,
                // this is where I'm setting the html for content from a nearby hidden div with id="html-"+clicked_div_id
                content: function() { return $('#html-'+$(this).attr('id')).html(); },
                trigger: 'manual'
            }).click(function(e) {
                $(this).popover('toggle');
                e.stopPropagation();
            });
        });

0
如果你想在pjax中使用Twitter Bootstrap的弹出窗口,那么可以尝试以下方法:
App.Utils.Popover = {

  enableAll: function() {
    $('.pk-popover').popover(
      {
        trigger: 'click',
        html : true,
        container: 'body',
        placement: 'right',
      }
    );
  },

  bindDocumentClickEvent: function(documentObj) {
    $(documentObj).click(function(event) {
      if( !$(event.target).hasClass('pk-popover') ) {
        $('.pk-popover').popover('hide');
      }
    });
  }

};

$(document).on('ready pjax:end', function() {
  App.Utils.Popover.enableAll();
  App.Utils.Popover.bindDocumentClickEvent(this);
});

0
我想到了这个:
我的情况包括在同一页上有更多的弹出框,而隐藏它们只会使它们不可见,因此无法单击弹出框后面的项目。 这个想法是将特定的弹出框链接标记为“活动”,然后您可以简单地“切换”活动的弹出框。这样做将完全关闭弹出框。
$('.popover-link').popover({ html : true, container: 'body' })

$('.popover-link').popover().on 'shown.bs.popover', ->
  $(this).addClass('toggled')

$('.popover-link').popover().on 'hidden.bs.popover', ->
  $(this).removeClass('toggled')

$("body").on "click", (e) ->
  $openedPopoverLink = $(".popover-link.toggled")
  if $openedPopoverLink.has(e.target).length == 0
    $openedPopoverLink.popover "toggle"
    $openedPopoverLink.removeClass "toggled"

0
一个更简单的解决方案,只需遍历所有弹出窗口并隐藏,如果不是this
$(document).on('click', '.popup-marker', function() {
    $(this).popover('toggle')
})

$(document).bind('click touchstart', function(e) {
    var target = $(e.target)[0];
    $('.popup-marker').each(function () {
        // hide any open popovers except for the one we've clicked
        if (!$(this).is(target)) {
            $(this).popover('hide');
        }
    });
});

-1
尝试使用data-trigger="focus"而不是"click"
这对我解决了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接