首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Bootstrap Popover:悬停/单击并关闭外部单击,但恢复为悬停模式

Bootstrap Popover:悬停/单击并关闭外部单击,但恢复为悬停模式
EN

Stack Overflow用户
提问于 2018-08-21 01:09:18
回答 3查看 883关注 0票数 2

在下面的代码片段中,我有一个Bootstrap Popover,它同时支持Hover和Click模式。单击时,窗口将保持打开状态,并应在(1)自单击(再次链接)或(2)任何外部单击时关闭。

问题:在外部单击后,弹出框转到"currently “模式。这意味着如果您再次将鼠标悬停在该窗口上,该窗口将被卡住并且不会消失。应该发生的是,在外部单击之后,当您再次将鼠标悬停在它上面时,您将恢复到原始的悬停并消失模式。这里预期的行为与在单击内部关闭后悬停时的行为相同,这是原始状态。我是不是忘了什么?

代码语言:javascript
复制
$('#linkPopover').popover({
  trigger: 'hover click', 
  content: 'This is my content', 
  title: 'TITLE'
});

// -----------------
// Just with the above (and no other code), the Hover and Click-Toggle 
// works within the SAME Popover window,
// but now I need to also remove the visible Popover on ANY CLICK OUTSIDE.

// However, although the below works, *after* clicking outside the Popover is in the CLICKED 
// mode i.e. it doesn't hover anymore

$('body').on('click', function(e) {
	    $('[data-toggle="popover"]').each(function () {
	        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
              // From outside click with the popover open, need to hide
	            $(this).popover('hide');
	        }	    	
	    });  
});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<a id="linkPopover" data-toggle="popover">POPOVER</a>

<br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/>
End of body

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-21 01:48:55

这段代码可能会对你有所帮助。我更改了条件语句,以检查用户是否在popover触发器之外单击&如果popover可见,则触发popover触发器的click事件。

我之所以考虑这样做,是因为click事件是当您单击触发器本身时发生的事件。

代码语言:javascript
复制
$(document).ready(function(){

$('#linkPopover').popover({
  trigger: 'hover click',
  content: 'This is my content', 
  title: 'TITLE'
});

$('body').on('click', function(e) {
    $('[data-toggle="popover"]').each(function () {
        if(!$(this).is(e.target) && ($("#linkPopover").next('div.popover:visible').length)){
        $("#linkPopover").trigger('click');
    }
    });
});

});
代码语言:javascript
复制
<script
  src="https://code.jquery.com/jquery-3.3.1.min.js"
  integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
  crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>

<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<a id="linkPopover" data-toggle="popover">POPOVER</a>

<br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/>
End of body
</body>

票数 2
EN

Stack Overflow用户

发布于 2018-08-23 00:20:43

实际上,我在body.click中引入了一个自定义标志参数,从而解决了eminememinem原始答案(由于trigger('click'))中的无限循环问题。您可以这样做:

代码语言:javascript
复制
     $('body').on('click', function (e, manualClickTriggered) {

我们在我们自己重新触发的特殊情况下设置标志。如果是这样,我们就忽略常规逻辑。

完整代码段:

代码语言:javascript
复制
$('[id*="linkPopover"]').popover({
  trigger: 'hover click', 
  content: 'This is my content', 
  title: 'TITLE'
});

// Close any visible popover if clicked outside 
// The "manualClickTriggered" flag indicates that we initiated the special Click event ourselves in order to turn off the popover, in which case skip the regular logic.
$('body').on('click', function (e, manualClickTriggered) {
  var linkId = null;
  if (e.target.id.indexOf("linkPopover") != -1) {
    linkId = e.target.id;
  }
		
  if (manualClickTriggered != true) {
    if (e.target.id.indexOf("linkPopover") == -1) {  // Not coming from any Popover Link (outside click) 
      $('a[id^="linkPopover"][data-toggle="popover"]').each(function () {	    	
        if( !$(this).is(e.target) && ($(this).next('div.popover:visible').length )) {
          $(this).trigger('click', true);
        }
      });
    }
    else // Coming from some Popover link
    {
        $('a[id^="linkPopover"][data-toggle="popover"]').each(function () {
          if ($(this).attr('id') != linkId && $(this).next('div.popover:visible').length) {
            $(this).trigger('click', true);
          }
        });
      }
    }
});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<a id="linkPopover1" data-toggle="popover">POPOVER 1</a><br/>
<a id="linkPopover2" data-toggle="popover">POPOVER 2</a><br/>
<a id="linkPopover3" data-toggle="popover">POPOVER 3</a><br/>
<a id="linkPopover4" data-toggle="popover">POPOVER 4</a><br/>

<br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/>
End of body

票数 2
EN

Stack Overflow用户

发布于 2018-08-22 23:34:09

我的第一个答案产生了Maximum call stack size exceeded错误,这是由于存在超过1个弹出窗口时的无限循环造成的(参见我的第一个答案和注释)。

要解决这个问题:每当系统要执行trigger('click')时,我都会在主体单击处理程序上使用.off。之后,我重新初始化了body click处理程序。请参见下面的示例。

代码语言:javascript
复制
$(document).ready(function(){

function initializeClick(){
$('body').on('click', function(e) {
    $('[data-toggle="popover"]').each(function () {
        if(!$(this).is(e.target) && ($(this).next('div.popover:visible').length)){
        $('body').off('click');
        $(this).trigger('click');
        initializeClick();
        }
    });
});
}

$('#linkPopover').popover({
  trigger: 'hover click',
  content: 'This is my content', 
  title: 'TITLE'
});

$('#linkPopover2').popover({
  trigger: 'hover click',
  content: 'This is my content', 
  title: 'TITLE'
});

$('body').on('click', function(e) {
    $('[data-toggle="popover"]').each(function () {
        if(!$(this).is(e.target) && ($(this).next('div.popover:visible').length)){
        $('body').off('click');
        $(this).trigger('click');
        initializeClick();
        }
    });
});

});
代码语言:javascript
复制
 <script
      src="https://code.jquery.com/jquery-3.3.1.min.js"
      integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
      crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>

    <body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

    <a id="linkPopover" class="btn btn-light" data-toggle="popover">POPOVER</a>
<a id="linkPopover2" class="btn btn-light" data-toggle="popover">POPOVER2</a>

    <br/><br/><br/><br/><br/><br/><br/>
    <br/><br/><br/><br/><br/><br/><br/>
    <br/><br/><br/><br/><br/><br/><br/>
    End of body
    </body>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51935548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档