【问题标题】:How to check whether a twitter bootstrap popover is visible or not?如何检查 twitter bootstrap popover 是否可见?
【发布时间】:2012-11-06 17:20:28
【问题描述】:

我有一个元素$('#anElement') 附加了一个潜在的弹出框,比如

<div id="anElement" data-original-title="my title" data-trigger="manual" data-content="my content" rel="popover"></div>

我只是想知道如何检查弹出框是否可见:如何使用 jQuery 来完成?

【问题讨论】:

  • 请提供更多标记。
  • @bram - 在正常情况下,我会完全同意你的看法。但是在这种情况下,标记是标准 (twitter) 引导标记。
  • @Lix 对于不熟悉 Bootstrap 的人来说,了解一下标记的样子可能会很有用
  • 你说得对:布拉姆要求有更多的标记,因为最初的问题是 - 至少 - 非常短!另一方面,它适用于对引导程序有点熟悉的人。
  • 您还可以使用条件$('#anElement').next().hasClass('popover') 进行检查,如果弹出框打开,该条件将返回 true。

标签: javascript jquery twitter-bootstrap


【解决方案1】:

如果此功能未内置到您使用的框架中(它不再是 twitter 引导程序,只是 bootstrap),那么您必须检查生成/修改为的 HTML创建 bootstrap 的这个特性。

看看popupver documentation。那里有一个按钮,您可以使用它来查看它的运行情况。这是检查在幕后工作的 HTML 元素的好地方。

打开你的 chrome 开发者工具或 firebug(firefox 的),看看它发生了什么。看起来按钮后面只插入了一个&lt;div&gt; -

<div class="popover fade right in" style="... />

您所要做的就是检查该元素是否存在。根据你的标记是如何编写的,你可以使用这样的东西 -

if ($("#popoverTrigger").next('div.popover:visible').length){
  // popover is visible
}

#popoverTrigger 是触发弹出框首先出现的元素,正如我们在上面注意到的,引导程序只是在元素之后附加弹出框 div。

【讨论】:

  • 是的,也许。似乎无法正确调试它。在 IE8 模式下使用 IE9 调试器,但在 popover 可见时看不到对 DOM 所做的任何修改。
  • +1 我想在显示时更新工具提示,这是检查工具提示是否显示、隐藏、更新和显示的好方法。谢谢
  • 仅供参考,如果您从引导程序复制/粘贴演示,它将无法正常工作,因为他们使用 data-container="body",因此 div 不包含 #popover-trigger 元素。
  • @Marc - 使用当前库的 3 年旧代码肯定会出现问题。我不认为引导程序从 3 年前开始向后兼容。我实际上不记得我在写这个答案时使用的是哪个版本...尽管提及特定版本肯定是个好主意...
  • 您的回答没有问题,它适用于最新版本。您只需删除data-container 或为next() 使用另一个选择器。我只是想提一下
【解决方案2】:

boostrap popover 插件中没有明确实现的方法,因此您需要找到解决方法。这是一个无论插件是否可见都会返回 true 或 false 的 hack。

var isVisible = $('#anElement').data('bs.popover').tip().hasClass('in');
console.log(isVisible); // true or false

它访问实际上是Popover对象的popover插件存储的数据,调用该对象的tip()方法,该方法负责获取tip元素,然后检查返回的元素是否具有@987654324类@,表示附加到该元素的弹出框是可见的。


您还应该检查是否附加了弹出框,以确保您可以调用tip() 方法:

if ($('#anElement').data('bs.popover') instanceof Popover) {
  // do your popover visibility check here
}

【讨论】:

  • BOOTSTRAP 3 注意:在 BS3 中,他们将其更改为 bs.popover 而不是 popover。示例:$('#anElement').data('bs.popover')
  • 感谢您提供此解决方案,但这仍然是一个 hack。我遇到了这种需求,因为 hide 没有正确清理 HTML DOM,而 toggle 确实如此。
【解决方案3】:

在当前版本的 Bootstrap 中,您可以检查您的元素是否设置了aria-describedby。该属性的值是实际弹出框的id

例如,如果你想改变可见弹出框的内容,你可以这样做:

var popoverId = $('#myElement').attr('aria-describedby');
$('#myElement').next(popoverid, '.popover-content').html('my new content');

【讨论】:

    【解决方案4】:

    这会检查给定的 div 是否可见。

    if ($('#div:visible').length > 0)
    

    if ($('#div').is(':visible'))
    

    【讨论】:

      【解决方案5】:

      也许最可靠的选择是监听显示/隐藏事件,如下所示。这将消除深入挖掘可能容易出错的 DOM 的必要性。

      var isMyPopoverVisible = false;//assuming popovers are hidden by default  
      
      $("#myPopoverElement").on('shown.bs.popover',function(){
      isMyPopoverVisible = true;
      });
      
      $("#myPopoverElement").on('hidden.bs.popover',function(){
      isMyPopoverVisible = false;
      });
      

      即使您以编程方式隐藏/显示/切换弹出框,这些事件似乎也会被触发,而无需用户交互。

      P。 S. 经 BS3 测试。

      【讨论】:

        【解决方案6】:

        这是一个简单的 jQuery 插件来管理它。我添加了一些带注释的选项来展示访问对象的不同方法,并且没有注释我喜欢的方法。

        对于当前的 Bootstrap 4.0.0,您可以使用 Popover.js 捆绑:https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.bundle.min.js

        // jQuery plugins
        (function($)
        {
            // Fired immiedately
        
            $.fn.isPopover = function (options)
            {
                // Is popover?
                // jQuery
                //var result = $(this).hasAttr("data-toggle");
                // Popover API
                var result = !!$(this).data('bs.popover');
        
                if (!options) return result;
        
                var $tip = this.popoverTip();
        
                if (result) switch (options)
                {
                    case 'shown' :
                        result = $tip.is(':visible');
                        break;
        
                    default:
                        result = false;
                }
        
                return result;
            };    
        
            $.fn.popoverTip = function ()
            {
                // jQuery
                var tipId = '#' + this.attr('aria-describedby');
                return $(tipId);
        
                // Popover API by id
                //var tipId = this.data('bs.popover').tip.id;
                //return $(tipId);
        
                // Popover API by object
                //var tip = this.data('bs.popover').tip; // DOM element
                //return $(tip);
            };
        
            // Load indicator
            $.fn.loadIndicator = function (action)
            {
                var indicatorClass = 'loading';
                // Take parent if no container has been defined
                var $container = this.closest('.loading-container') || this.parent();
        
                switch (action)
                {
                    case 'show' :
                        $container.append($('<div>').addClass(indicatorClass));
                        break;
        
                    case 'hide' :
                        $container.find('.' + indicatorClass).remove();
                        break;
                }
            };
        })(jQuery);
        
        // Usage
        // Assuming 'this' points to popover object (e.g. an anchor or a button)
        
        // Check if popover tip is visible
        var isVisible = $(this).isPopover('shown');
        
        // Hide all popovers except this
        if (!isVisible) $('[data-toggle="popover"]').not(this).popover('hide');
        
        // Show load indicator inside tip on 'shown' event while loading an iframe content
        $(this).on('shown.bs.popover', function ()
        {
            $(this).popoverTip().find('iframe').loadIndicator('show');
        });
        

        【讨论】:

          【解决方案7】:

          这是一种使用 Vanilla JS 检查状态的方法。

          document.getElementById("popover-dashboard").nextElementSibling.classList.contains('popover');
          

          【讨论】:

            【解决方案8】:

            这适用于 BS4:

            $(document).on('show.bs.tooltip','#anElement', function() {
                $('#anElement').data('isvisible', true);
            });
            
            $(document).on('hidden.bs.tooltip','#anElement', function() {
                $('#anElement').data('isvisible', false);
            });
            
            
            if ($('#anElement').data('isvisible'))
            {
                // popover is visible
                $('#tipUTAbiertas').tooltip('hide');
                $('#tipUTAbiertas').tooltip('show');
            }
            

            【讨论】:

              【解决方案9】:

              使用带有 boostrap 4 的弹出框,tip() 似乎不再是一个函数。这是检查弹出框是否启用的一种方法,基本上是它是否已被单击并处于活动状态:

              if ($('#element').data('bs.popover')._activeTrigger.click == true){
              ...do something
              }
              

              【讨论】:

              • 下划线属性是内部实现细节。它们将被这样对待并且可能随时更改,这意味着您的小代码 sn-p 可以(阅读:将)在未来的某个时间点随机中断,而不会发出警告(如更改日志或 API 弃用警告)。跨度>
              猜你喜欢
              • 2012-06-15
              • 2012-10-12
              • 1970-01-01
              • 1970-01-01
              • 2017-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-08
              相关资源
              最近更新 更多