【问题标题】:need click twice after hide a shown bootstrap popover隐藏显示的引导弹出框后需要单击两次
【发布时间】:2015-09-15 09:05:28
【问题描述】:

$('#popoverlink').popover();

$("#popoverhide").click(function() {
   $("#popoverlink").popover("hide"); 
});
#popoverlink {
    position: absolute;
    top: 100px;
    left: 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<a href="#" id="popoverlink" class="btn" rel="popover" title="Some title">Popover</a>
<a href="#" id="popoverhide" class="btn" rel="popover" title="Some title">hide</a>

与fiddle 相同。对不起,之前的链接是错误的。这个是对的。

隐藏显示的弹出框后,我需要单击弹出框触发器两次才能再次显示。

这是一个错误吗?有什么办法可以避免吗?

更新 我的意思是我用另一个按钮来隐藏一个弹出框

$("#popoverTrigger").popover("hide");

比我需要单击“#popoverTrigger”两次才能显示它。

愚蠢的解决方案

$("popoverhide").click(function() {
    var f = false;
    if($("popoverlink").next('div.popover:visible')) {
        f = true;
        $("popoverlink").popover("hide");
    }
    if(f) {
        $("popoverlink").click();
    }
})

还有什么好主意吗?

【问题讨论】:

  • 我的电脑上好像不是这样..
  • 是的,它也适合我
  • Popever 自己工作正常。试试这个,点击弹出框并激活工具提示的东西,然后使用隐藏按钮隐藏它,然后尝试点击弹出框。它不会在第一次单击时显示,而是在第二次单击时显示。看起来像一个错误。
  • 只有在使用 v3.3.5 的引导程序时才会注意到该错误。有关详细信息,请参阅我的答案。
  • 我在 3.3.6 中遇到了这个错误

标签: jquery twitter-bootstrap


【解决方案1】:

在 3.3.6 中仍未修复,但我在这里找到了建议的解决方案:

https://github.com/twbs/bootstrap/issues/16732

https://github.com/twbs/bootstrap/pull/17702/files#diff-f3e99e0bb007ace7a370f0492b9cb5abR340

我已经在隐藏事件中应用了:

$('body').on('hidden.bs.popover', function (e) {
    $(e.target).data("bs.popover").inState.click = false;
});

这对我有用。与建议的修复完全相同:

$('body').on('hidden.bs.popover', function (e) {
    $(e.target).data("bs.popover").inState = { click: false, hover: false, focus: false }
});

注意:我使用委托弹出框,这就是我使用 $('body') 引用的原因。

对于 Bootstrap 4 使用 _activeTrigger 而不是 inState:

$(e.target).data("bs.popover")._activeTrigger.click = false

【讨论】:

  • 哇。这真的是工作!但我有一段时间没有使用这个了。伤心
  • Bug 在 3.3.7 中仍然存在,看起来他们要等到 v4。这个解决方案仍然有效?
  • 直到 4.0.0-alpha.5,该错误仍然存​​在。这个解决方案变成$(e.target).data("bs.popover")._activeTrigger.click = false
  • 难以置信。并且认为我浪费了五个小时查看我的代码认为这是我的错
  • @TingYiShih 非常感谢!!我刚刚搜索了如何为 Bootstrap 4 修复它。您的解决方案效果很好!
【解决方案2】:

我最近遇到了这个错误,这就是我修复它的方法:

$('.myPopoverClass')
    .popover({
        trigger: 'manual', /* <- important, instantiates popover */
        container: 'body', /* optional */
        animation: false
    })
    .click(function(e) {
        $('.popover').not(this).hide(); /* optional, hide other popovers */
        $(this).popover('show'); /* show popover now it's setup */
        e.preventDefault();
    });

【讨论】:

  • 谢谢。遇到了一个问题,当我不想要它时,popover 会触发它。在您发表评论后意识到它被设置为触发:'focus',因此每当按钮获​​得焦点时,它就会触发,而我希望它手动触发。
【解决方案3】:

这是 v3.3.5 中的一个错误:

https://github.com/twbs/bootstrap/issues/16732

暂时使用 3.3.4 直到它被修复。

【讨论】:

    【解决方案4】:

    只需使用这个:

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

    代替:

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

    【讨论】:

      【解决方案5】:

      我有一个弹出窗口在 3 秒后淡出,需要双击才能重新打开。按照达伦的解决方案,它奏效了。

      $(function () {
      
          $('#popLinks').popover({
              html: true,
              trigger: 'manual',
              animation: true
          });
      
          $('#popLinks').click(function () {
              $(this).popover('show');
              setTimeout(function () {
                  $('.popover').fadeOut('slow');
              }, 3000);
              e.preventDefault();
          });    
      });
      

      【讨论】:

        【解决方案6】:

        我在上面使用了达伦的答案。抱歉,达伦,我仍然无法评论其他人的帖子。 不过有一点点变化。我将“显示”更改为“切换”以便能够切换弹出框。

        发件人:

        $(this).popover('show');
        

        到

        $(this).popover('toggle');
        

        【讨论】:

          【解决方案7】:

          确保 popover 只会被初始化一次。如果它会被初始化超过 一次跨越不同的文件,您可能会遇到此问题。

          $('[data-toggle=popover]').popover({
              placement : 'bottom'
          });
          

          【讨论】:

            【解决方案8】:

            我使用下面的代码行解决了这个问题:

            说明:使用 show.bs.popover 事件在显示新的弹出框之前隐藏显示的弹出框

            重要!不要使用 $('.popover').hide();它会阻止弹出窗口显示,直到您单击两次,但使用 $('element').popover('hide') 代替

            $('[data-toggle="popover"]').on('show.bs.popover', function () {
                                                try {
                                                    $('element').popover('hide');
                                                } catch (ex) {
                                                    console.log(ex);
                                                }
                                            });
            // then use $('[data-toggle="popover"]').popover(); to show your popover
            

            它也适用于多个弹出窗口。

            【讨论】:

              猜你喜欢
              • 2013-07-24
              • 2021-11-22
              • 2021-11-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-29
              • 1970-01-01
              • 2015-12-19
              相关资源
              最近更新 更多