显示一个弹出窗口并隐藏其他弹出窗口

Per*_*Man 58 twitter-bootstrap

我有几个按钮,我需要一个弹出窗口.
我想要这样:
当我的用户点击其中一个时,我希望其他人被隐藏.所以只显示一个popover
检查并帮我纠正这个例子plz:

var mycontent='<div class="btn-group"> <button class="btn">Left</button> <button class="btn">Middle</button> <button class="btn">Right</button> </div>'
Run Code Online (Sandbox Code Playgroud)
$('.btn').popover({
    html: true,
    content:mycontent,
    trigger: 'manual'
}).click(function(e) {
    $(this).popover('toggle');
    e.stopPropagation();
});

$('html').click(function(e) {
     $('.btn').popover('hide');
});
Run Code Online (Sandbox Code Playgroud)

我的HTML:

<ul>
    <li>
        <a href="#" class="btn" data-toggle="popover" data-placement="bottom" title="" >Popover</a>
    </li>
    <li>
       <a href="#" class="btn" data-toggle="popover" data-placement="bottom" title="" >Popover</a> 
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

jsfiddle的例子

添加类似代码的东西以某种方式解决了我的问题:

$('.btn').click(function(e) {
     $('.btn').popover('hide');
});
Run Code Online (Sandbox Code Playgroud)

但是通过在每个按钮上单击两次就会出错

Per*_*Man 147

不知怎的,我为我的需要创造了一个例子.我用这个代码:

$('.btn').popover();

$('.btn').on('click', function (e) {
    $('.btn').not(this).popover('hide');
});
Run Code Online (Sandbox Code Playgroud)

这里查看演示

并纠正了以前的演示, 我希望它能帮助别人

  • 问题是,当我要打开一个新文件夹时,我必须单击两次。 (5认同)
  • 请注意,其他popover标签不会被删除,它们将被隐藏 (3认同)
  • 由于Denis说它不完整,你应该用$('.btn')删除它.不是(this).popover('hide').next('.popover').remove() (2认同)

los*_*ros 24

我之前看到的答案都没有动态的弹出窗口,所以这就是我提出来的.正如一些人所指出的那样,如果弹出窗口没有从DOM中删除,则会出现问题.remove().我从bootstrap网站上分了一个例子,创造了这个新的小提琴.使用该selector: '[rel=popover]'选项添加动态弹出框.当即将显示一个弹出窗口时,我在所有其他弹出窗口上调用destroy,然后.popover从页面中删除内容.

$('body').popover({
                selector: '[rel=popover]',
                trigger: "click"
            }).on("show.bs.popover", function(e){
                // hide all other popovers
                $("[rel=popover]").not(e.target).popover("destroy");
                $(".popover").remove();                    
            });
Run Code Online (Sandbox Code Playgroud)

  • 我必须使用`$(“ [rel = popover]”)。not(e.target).popover(“ hide”);`而不是`$(“ [rel = popover]”)。not(e.target ).popover(“ destroy”);` (2认同)
  • 仅当您将 `$("[rel=popover]").not(e.target).popover("destroy");` 更改为 `$("[rel=popover]").not(e. target).removeData('bs.popover').popover("destroy");` 否则你必须在之前打开的那些上单击两次 (2认同)

Ada*_*Hey 22

最简单的方法是trigger="focus"在你的popover中设置

点击下一次点击

使用焦点触发器可以在用户下次单击时关闭弹出窗口.

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover" data-trigger="focus" title="Dismissible popover" data-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</a>
Run Code Online (Sandbox Code Playgroud)

注意 - 这意味着弹出窗口会在您单击它时立即隐藏

  • 这应该是正确的答案。此功能存在于2.X(搜索集中在http://getbootstrap.com/2.3.2/javascript.html#popovers),3.X(https://getbootstrap.com/docs/3.3/javascript/#dismiss)中-on-next-click)和4.X beta(https://getbootstrap.com/docs/4.0/components/popovers/#dismiss-on-next-click) (2认同)
  • 这应该是公认的答案。请注意:tabindex是必需的。没有它就无法工作。 (2认同)

And*_*ett 10

这是一个快速的通用解决方案,我正在使用,您不需要事先知道类的弹出窗口.我没有广泛地测试它.此外,我正在使用以下切换,因为我有一些问题,隐藏行为与切换完全不同.

  var $currentPopover = null;
  $(document).on('shown.bs.popover', function (ev) {
    var $target = $(ev.target);
    if ($currentPopover && ($currentPopover.get(0) != $target.get(0))) {
      $currentPopover.popover('toggle');
    }
    $currentPopover = $target;
  });

  $(document).on('hidden.bs.popover', function (ev) {
    var $target = $(ev.target);
    if ($currentPopover && ($currentPopover.get(0) == $target.get(0))) {
      $currentPopover = null;
    }
  });
Run Code Online (Sandbox Code Playgroud)


小智 5

使用Bootstrap 3.3.7,我找到了以下解决方案:

var _popoverLink = $('[data-toggle="popover"]');

_popoverLink.on('click', function(){
  _popoverLink.popover('destroy').popover({container: 'body'});
  $(this).popover('show');
});
Run Code Online (Sandbox Code Playgroud)

问候。


Mun*_*han 5

这是执行此操作的最简单且优雅的方法:

    $('[data-toggle="popover"]').on('click', function(){
        $('[data-toggle="popover"]').not(this).popover('hide');
    });
Run Code Online (Sandbox Code Playgroud)