【问题标题】:Show one popover and hide other popovers显示一个弹出框并隐藏其他弹出框
【发布时间】:2013-04-22 14:53:42
【问题描述】:

我有几个按钮,每个按钮都需要一个弹出框。
我想要这样:
当我的用户单击其中一个时,我希望隐藏其他人。所以只显示一个弹出窗口
请检查并帮助我纠正这个例子:

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

$('html').click(function(e) {
     $('.btn').popover('hide');
});

我的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>

jsfiddle example

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

$('.btn').click(function(e) {
     $('.btn').popover('hide');
});

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

【问题讨论】:

标签: twitter-bootstrap


【解决方案1】:

不知何故,我为我的需要创建了一个示例。我使用了这个代码:

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

$('.btn').on('click', function (e) {
    $('.btn').not(this).popover('hide');
});

查看demo here

并更正了之前的demo 我希望它会帮助别人

【讨论】:

  • 请注意,其他弹出框标签不会被删除,它们只会被隐藏
  • popover('hide') 确实删除了。名称具有误导性。
  • 正如丹尼斯所说的不完整,你应该在 $('.btn').not(this).popover('hide').next('.popover').remove 之后删除它()
  • 问题是,当我想打开一个新的时,我必须点击两次。
  • @funky-nd 我也有同样的问题,你找到解决办法了吗?
【解决方案2】:

我之前看到的答案都没有动态弹出框,所以这就是我想出的。正如一些人所指出的,如果没有使用.remove() 从 DOM 中删除弹出框,则会出现问题。我从引导网站分叉了an example 并创建了this new fiddle。使用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();                    
            });

【讨论】:

  • 这太棒了。感谢您考虑此解决方案中的动态弹出框!优雅。
  • 我不得不使用$("[rel=popover]").not(e.target).popover("hide"); 而不是$("[rel=popover]").not(e.target).popover("destroy");
  • 这仅在您将$("[rel=popover]").not(e.target).popover("destroy"); 更改为$("[rel=popover]").not(e.target).removeData('bs.popover').popover("destroy"); 时才有效,否则您必须在之前打开的那些上单击两次
  • @StefanGabos 仍然要求我点击两次 :'(
  • 忘了说我用的是3.3.7
【解决方案3】:

最简单的方法是在弹出窗口中设置trigger="focus"

下次点击关闭

使用焦点触发器在下次单击时关闭弹出框 用户制作。

<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>

注意 - 这意味着一旦您点击弹出框就会隐藏它

【讨论】:

【解决方案4】:

这是我使用的快速通用解决方案,您无需提前知道弹出框的类是什么。我还没有对它进行过广泛的测试。我也在下面使用切换,因为隐藏的行为与切换完全不同。

  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;
    }
  });

【讨论】:

  • 这是最好的答案,并且在大多数情况下都可以使用。 +1 使用 *.bs.popover 事件。
  • 这应该是公认的答案。效果很好,+1。
【解决方案5】:

使用 Bootstrap 3.3.7 我找到了这个解决方案:

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

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

问候。

【讨论】:

  • 对我不起作用。它说“未捕获的类型错误:无法读取 nul 的属性‘触发器’”
【解决方案6】:

您太认真了,只需在触发要打开的新弹出框之前关闭每个打开的弹出框:

// Hide any active popover first
            $(".popover").each(function () {
                var $this = $(this);
                $this.popover('hide');
            });

//Now Execute your new popover
$('.btn').popover({
                html: true,
                content: mycontent,
                trigger: 'manual'
            }).click(function (e) {
                $(this).popover('toggle');
                e.stopPropagation();
            });

【讨论】:

  • 这个问题:一旦工具提示被隐藏,要再次显示它需要点击 2 次​​span>
【解决方案7】:

这是一个对我有用的解决方案。在我的脚本中,我不通过 HTML 中的 data 属性传递 var,我更喜欢我的 js 文件中的逻辑。

            $(".vote").popover({
                trigger: " click",
                title: "Attention",
                content: "You must be a member of the site to vote on answers.",
                placement: 'right'
            });

            $('.vote').on('click', function (e) {
                $('.vote').not(this).popover('hide');
            });

【讨论】:

【解决方案8】:

这是最简单优雅的方法:

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

【讨论】:

    【解决方案9】:

    在“losmescaleros”答案的帮助下,这对我来说非常有效:

    $('body').popover({
      selector: '[data-toggle="popover"]',
      trigger: "click"
    }).on("show.bs.popover", function(e){
      // hide all other popovers
      $("[data-toggle='popover']").not(e.target).popover("destroy");                  
    });
    

    没有任何双击问题。

    【讨论】:

    • Destroy: 隐藏和销毁元素的弹出框。
    • 这行得通。花了几个小时搜索和尝试不同的解决方案。这个对我有用,因为它使用的是[data-toggle="popover"]
    • 最佳解决方案,但我使用 .popover('hide') 而不是销毁
    【解决方案10】:

    我在使用 bootstrap v3 发布的任何答案来解决此问题时遇到了一些困难。经过一番搜索,我发现我的主要问题是没有设置正确的弹出框触发器。它应该设置为操作问题中列出的“手动”。

    下一步非常简单,并且提供了比我在其他答案中看到的解决方案更好的行为,所以我想我会分享。

    $('html').on('click', function(e) {
      if($(e.target).hasClass('btn')) {
        $(e.target).popover('toggle');
      }
    
      if(!$(e.target).parent().hasClass('popover')) {
        $('.popover').prev('.btn').not(e.target).popover('toggle');
      }
    });
    

    此解决方案使您能够在单击页面上的任何其他位置(包括另一个弹出框链接)时关闭弹出框,但允许您单击弹出框本身而不关闭它,以便用户可以访问弹出框以进行复制等操作粘贴文本。

    希望这对某人有所帮助,这是一个有效的小提琴。 https://jsfiddle.net/hL0pvaty/

    附言- 在我的示例中,我只使用 .btn 类作为选择器,因为它用于操作的问题。我建议使用不那么通用的东西。

    【讨论】:

      【解决方案11】:

      我结合了我在这个线程和其他线程中看到的方法。我的要求指定:

      • 一次只能看到一个弹出框
      • 单击弹出框外的任意位置应关闭弹出框
      • 弹出框应该包含一个控件
      • 应该不需要重新绑定 popover 事件

            function bindEvents() {
        
                 setupPopupBinding();
        
                 setupPopupDismissal();
            };
        
            function setupPopupBinding() {
                   $('.addSectionItem').popover({
                          html: true,
                          content: function () {
                                return createDropdowns($(this).data('sectionid'))[0].outerHTML;
                          },
                          placement: "right",
                          trigger: "click focus"
                   }).on("inserted.bs.popover", function (e) {
                        //initialize dropdown
                        setupSelect2();
                   }).on("hide.bs.popover", function (e) {
                         $('.select2-container--open').remove();
                   });
            }
        
            function setupPopupDismissal() {
                   $('body:not(.addSectionItem)').on('click', function (e) {
                   $('.addSectionItem').each(function () {
                   //the 'is' for buttons that trigger popups
                   //the 'has' for icons within a button that triggers a popup
                   if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
                   $(this).popover('hide');
                   $('.popover').has(e.target).remove();
                }
            });
            });
            }
        
            function createDropdowns(sectionId: number) {
                   var dropdown = $('<div/>')
                   .attr('Id', 'sectionPopupWrapper' + sectionId)
                   .addClass('popupWrapper')
                   .append($('<select/>').addClass('sectionPopup'))
                   .append($('<button/>').addClass('btn btn-primary btn-xs')
                   .attr('data-sectionid', sectionId)
                   .text('Add'));
        
            return dropdown;
            }
        

      【讨论】:

        【解决方案12】:
        <ul>
        <li><i class="fa fa-trash-o DeleteRow" id=""></i>1</li>
        <li><i class="fa fa-trash-o DeleteRow" id=""></i>2</li>
        <li><i class="fa fa-trash-o DeleteRow" id=""></i>3</li>
        </ul>
        
        // Close other popover when click on Delete/Open new popover - START //
             $('.DeleteRow').on('click', function (e) {
                $('.popover').not(this).popover('hide');
             });
         // Close other popover when click on Delete/Open new popover - END//
        

        【讨论】:

          【解决方案13】:

          当一个图标被点击并打开相应的弹出框时,它会有一个以“弹出框*”开头的值,称为 aria- describeby。

          所以你找到了这个图标并触发点击它们,但不是现在点击的图标。

          $('.icon-info').click(function(){
              $(".icon-info[aria-describedby*='popover']").not(this).trigger('click');
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-03
            • 1970-01-01
            • 2014-02-21
            • 1970-01-01
            • 2015-12-19
            • 1970-01-01
            • 2013-07-24
            • 1970-01-01
            相关资源
            最近更新 更多