如何在弹出窗口中插入关闭按钮以进行引导


76

JS:

$(function(){
  $("#example").popover({
    placement: 'bottom',
    html: 'true',
    title : '<span class="text-info"><strong>title</strong></span> <button type="button" id="close" class="close">&times;</button>',
    content : 'test'
  })
  $('html').click(function() {
    $('#close').popover('hide');
  });
});

HTML:

<button type="button" id="example" class="btn btn-primary" ></button>

我写你的代码不显示您的弹出窗口。

有人遇到这个问题吗?

Answers:


88

您需要正确标记

<button type="button" id="example" class="btn btn-primary">example</button>

然后,一种方法是将close-handler附加到元素本身内部,如下工作:

$(document).ready(function() {
    $("#example").popover({
        placement: 'bottom',
        html: 'true',
        title : '<span class="text-info"><strong>title</strong></span>'+
                '<button type="button" id="close" class="close" onclick="$(&quot;#example&quot;).popover(&quot;hide&quot;);">&times;</button>',
        content : 'test'
    });
});  

1
@Sebf,引导程序旨在尽可能地简化,许多问题应在实现层上解决。是的,有些“缺失”的部分令人困惑;-)
davidkonrad

11
@jonschlinkertdata-dismiss="popover"的就地onclick不起作用。这是一个有据可查的问题。
横街

1
在popover标题中使用内联HTML和JavaScript事件是非常糟糕的做法。它可能会起作用,但以后会令您头疼。
马里奥·芬克

1
@Mario Fink(和Robert Kotcher)-完全同意。但这就是您可以在twitter bootstrap 2.x中实现所需功能的方法,现在预期的方法失败了。我只是回答这个问题。
davidkonrad

2
用单引号;对于我上述例子仅通过更换双引号(QUOT)工作(&#39;)
Ruut

32

我需要找到适用于多个弹出窗口和Bootstrap 3的东西。

这是我所做的:

我有多个元素想要做一个弹窗工作,所以我不想使用id。

标记可能是:

<button class="btn btn-link foo" type="button">Show Popover 1</button>
<button class="btn btn-link foo" type="button">Show Popover 2</button>
<button class="btn btn-link foo" type="button">Show Popover 3</button>

弹出框内保存和关闭按钮的内容:

var contentHtml = [
    '<div>',
        '<button class="btn btn-link cancel">Cancel</button>',
        '<button class="btn btn-primary save">Save</button>',
    '</div>'].join('\n');

以及所有3个按钮的javascript:

当容器是默认未附加到主体的容器时,此方法有效。

$('.foo').popover({
    title: 'Bar',
    html: true,
    content: contentHtml,
    trigger: 'manual'
}).on('shown.bs.popover', function () {
    var $popup = $(this);
    $(this).next('.popover').find('button.cancel').click(function (e) {
        $popup.popover('hide');
    });
    $(this).next('.popover').find('button.save').click(function (e) {
        $popup.popover('hide');
    });
});

当容器连接到“身体”时

然后,使用aria- describeby查找弹出窗口并将其隐藏。

$('.foo').popover({
    title: 'Bar',
    html: true,
    content: contentHtml,
    container: 'body',
    trigger: 'manual'
}).on('shown.bs.popover', function (eventShown) {
    var $popup = $('#' + $(eventShown.target).attr('aria-describedby'));
    $popup.find('button.cancel').click(function (e) {
        $popup.popover('hide');
    });
    $popup.find('button.save').click(function (e) {
        $popup.popover('hide');
    });
});

小改进:popup.find('button.cancel').on('click',function(e) {...}
巴特2015年

7
当我单击“取消”链接时,它会关闭弹出窗口。但是我必须在popover-trigger链接上单击两次,因为它在第一次单击时不会打开popover。
尼扎姆·卡兹

有预定义的类.close具有悬停效果,因此将关闭按钮插入标题或内容就像一样容易<span class=close>&times;</span>
lubosdz

@NizamKazi使用下面的我的解决方案来解决这个问题:stackoverflow.com/a/58923567/5376813
TetraDev

27

我发现其他答案不够通用,或者过于复杂。这是一个应该始终有效的简单方法(对于引导程序3):

$('[data-toggle="popover"]').each(function () {
    var button = $(this);
    button.popover().on('shown.bs.popover', function() {
        button.data('bs.popover').tip().find('[data-dismiss="popover"]').on('click', function () {
            button.popover('toggle');
        });
    });
});

然后只需data-dismiss="popover"在您的关闭按钮中添加属性即可。另外,请确保不要popover('hide')在代码中使用其他地方,因为它会隐藏弹出窗口,但不会在引导代码中正确设置其内部状态,这将在下次使用时引起问题popover('toggle')


2
出于某种原因,使用Bootstrap 3.popover('toggle');永远不会为我做任何事情,在.popover('hide');可行的地方。除此之外,此解决方案是我的最爱。谢谢!
hvaughan3

难道不会在每个popover-show-event上绑定click事件,从而导致多个绑定吗?
pdu

@pduersteler这是旧代码,但已在生产环境中使用,因此我敢肯定它可以工作。我猜bootstrap会在每次单击按钮时创建一个新的弹出窗口,并因此创建一个新的关闭按钮。如果关闭按钮上有多个事件,它将多次切换,并且我已经注意到了这个错误(希望如此)。让我知道您是否可以确认问题。再次考虑,也许这就是为什么我有一个问题,popover('hide')那就是它不会破坏弹出窗口,而只是隐藏它?
youen

这应该是$(button.data('bs.popover').tip).find('[data-dismiss="popover"]')在现代引导程序中(> = 4?)
Mike Campbell,

18

先前的示例有两个主要缺点:

  1. 需要以某种方式使用“关闭”按钮来了解所引用元素的ID。
  2. 需要在“ shown.bs.popover”事件上添加一个“单击”侦听器到关闭按钮;这也不是一个好的解决方案,因为您将在每次显示“ popover”时添加此类侦听器。

以下是没有这种缺点的解决方案。

默认情况下,将“ popover”元素插入DOM中的referenced-element之后(然后注意,referenced-element和popover是直接的兄弟元素)。因此,当单击“关闭”按钮时,您可以简单地查找其最接近的“ div.popover”父对象,然后查找该父对象的紧前同级元素。

只需在“关闭”按钮的“ onclick”处理程序中添加以下代码:

$(this).closest('div.popover').popover('hide');

例:

var genericCloseBtnHtml = '<button onclick="$(this).closest(\'div.popover\').popover(\'hide\');" type="button" class="close" aria-hidden="true">&times;</button>';

$loginForm.popover({
    placement: 'auto left',
    trigger: 'manual',
    html: true,
    title: 'Alert' + genericCloseBtnHtml,
    content: 'invalid email and/or password'
});

哇,好又简单的解决方案。为我工作。
阿德里安·恩里克斯

1
使用Bootstrap 4.3时,我不得不添加sanitize: false弹出菜单选项
理查德(Richard)

15

在此处输入图片说明

以下是我刚刚在我的项目中使用的。希望它能对您有所帮助

<a id="manualinputlabel" href="#" data-toggle="popover" title="weclome to use the sql quer" data-html=true  data-original-title="weclome to use the sql query" data-content="content">example</a>


$('#manualinputlabel').click(function(e) {
              $('.popover-title').append('<button id="popovercloseid" type="button" class="close">&times;</button>');
              $(this).popover();

          });

      $(document).click(function(e) {
         if(e.target.id=="popovercloseid" )
         {
              $('#manualinputlabel').popover('hide');                
         }

      });

嘿,谢谢你的回答!您知道如何&times;h3.popover-title对象内垂直放置符号吗?
Renato Gama 2014年

效果很好,但是我在垂直对齐方面遇到了同样的问题。我将自己的课程添加到了“关闭”按钮,line-height: 0.7 !important;看起来不错
dading84 '16

当我单击“取消”链接时,它会关闭弹出窗口。但是我必须在popover-trigger链接上单击两次,因为它不会在第一次单击中打开弹出窗口
Shurvir Mori

9

我已经检查了许多提到的代码示例,并且对我而言,克里斯的方法运行得很好。我在这里添加了代码,以进行演示。

我已经使用Bootstrap 3.3.1对其进行了测试,并且尚未使用旧版本进行测试。但这绝对不适用于2.x,因为该shown.bs.popover事件是3.x引入的。

$(function() {
  
  var createPopover = function (item, title) {
                       
        var $pop = $(item);
        
        $pop.popover({
            placement: 'right',
            title: ( title || '&nbsp;' ) + ' <a class="close" href="#">&times;</a>',
            trigger: 'click',
            html: true,
            content: function () {
                return $('#popup-content').html();
            }
        }).on('shown.bs.popover', function(e) {
            //console.log('shown triggered');
            // 'aria-describedby' is the id of the current popover
            var current_popover = '#' + $(e.target).attr('aria-describedby');
            var $cur_pop = $(current_popover);
          
            $cur_pop.find('.close').click(function(){
                //console.log('close triggered');
                $pop.popover('hide');
            });
          
            $cur_pop.find('.OK').click(function(){
                //console.log('OK triggered');
                $pop.popover('hide');
            });
        });

        return $pop;
    };

  // create popover
  createPopover('#showPopover', 'Demo popover!');

  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"/>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>

<button class="btn btn-primary edit" data-html="true" data-toggle="popover" id="showPopover">Show</button>

<div id="popup-content" class="hide">
    <p>Simple popover with a close button.</p>
    <button class="btn btn-primary OK">OK</button>
</div>


1
我想一定是$cur_pop.popover('hide');
BernhardDöbler,2015年

5

诀窍是使用.data('bs.popover')。tip()获得当前的Popover :

$('#my_trigger').popover().on('shown.bs.popover', function() {
    // Define elements
    var current_trigger=$(this);
    var current_popover=current_trigger.data('bs.popover').tip();

    // Activate close button
    current_popover.find('button.close').click(function() {
        current_trigger.popover('hide');
    });
});

4

只是想更新答案。根据Swashata Ghosh,以下是适用于moi的更简单方法:

HTML:

<button type="button" class="btn btn-primary example">Example</button>

JS:

$('.example').popover({
   title: function() {
      return 'Popup title' +
             '<button class="close">&times</button>';
   },
   content: 'Popup content',
   trigger: 'hover',
   html: true
});

$('.popover button.close').click(function() {
   $(this).popover('toggle');
});

4

这适用于多个弹出窗口,并且我还添加了一些额外的JS来处理重叠的弹出窗口时发生的z-index问题:

http://jsfiddle.net/erik1337/fvE22/

JavaScript:

var $elements = $('.my-popover');
$elements.each(function () {
    var $element = $(this);

    $element.popover({
        html: true,
        placement: 'top',
        container: $('body'), // This is just so the btn-group doesn't get messed up... also makes sorting the z-index issue easier
        content: $('#content').html()
    });

    $element.on('shown.bs.popover', function (e) {
        var popover = $element.data('bs.popover');
        if (typeof popover !== "undefined") {
            var $tip = popover.tip();
            zindex = $tip.css('z-index');

            $tip.find('.close').bind('click', function () {
                popover.hide();
            });

            $tip.mouseover(function (e) {
                $tip.css('z-index', function () {
                    return zindex + 1;
                });
            })
                .mouseout(function () {
                $tip.css('z-index', function () {
                    return zindex;
                });
            });
        }
    });
});

HTML:

<div class="container-fluid">
    <div class="well popover-demo col-md-12">
        <div class="page-header">
             <h3 class="page-title">Bootstrap 3.1.1 Popovers with a close button</h3>

        </div>
        <div class="btn-group">
            <button type="button" data-title="Popover One" class="btn btn-primary my-popover">Click me!</button>
            <button type="button" data-title="Popover Two" class="btn btn-primary my-popover">Click me!</button>
            <button type="button" data-title="Popover Three (and the last one gets a really long title!)" class="btn btn-primary my-popover">Click me!</button>
        </div>
    </div>
</div>
<div id="content" class="hidden">
    <button type="button" class="close">&times;</button>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>

CSS:

/* Make the well behave for the demo */
 .popover-demo {
    margin-top: 5em
}
/* Popover styles */
 .popover .close {
    position:absolute;
    top: 8px;
    right: 10px;
}
.popover-title {
    padding-right: 30px;
}

4

我对此很费力,这是最简单的方法,三行js:

  1. 在弹出框的标题中添加一个叉号
  2. 使用js代码段显示弹出窗口并通过单击标题关闭
  3. 用一点CSS使其美观

在此处输入图片说明

$(document).ready(function() {
  // This is to overwrite the boostrap default and show it allways
  $('#myPopUp').popover('show');
  // This is to destroy the popover when you click the title
  $('.popover-title').click(function(){
    $('#myPopUp').popover('destroy');
  });
});
@import "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css";

/* Just to align my example */
.btn {
  margin: 90px auto;
  margin-left: 90px;
}

/* Styles for header */
.popover-title {
  border: 0;
  background: transparent;
  cursor: pointer;
  display: inline-block;
  float: right;
  text-align: right; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
<button id="myPopUp" class="btn btn-success" data-toggle="popover" data-placement="top" data-title="×" data-content="lorem ipsum content">My div or button or something with popover</button>  
 


为什么十字按钮无法通过tab导航?
Chandresh Mishra

3

试试这个:

$(function(){
  $("#example")
      .popover({
      title : 'tile',
      content : 'test'
    })
    .on('shown', function(e){
      var popover =  $(this).data('popover'),
        $tip = popover.tip();

      var close = $('<button type="button" class="close" aria-label="Close"><span aria-hidden="true">&times;</span></button>')
        .click(function(){
          popover.hide();
        });
      $('.popover-title', $tip).append(close);
    });
});

如果没有jQuery包装的按钮,则比将按钮添加为标记字符串要容易得多,因为这样可以更整洁地绑定。可悲的是,Bootstrap代码确实缺少了此方法,但是该解决方法对我有用,并且实际上可以根据需要扩展为适用于所有弹出窗口。


为我最好的工作,只需要更新BS名称:'shown'->'shown.bs.popover'data('popover')
Ashot

2

这是一个“作弊”解决方案:

请按照通常的指示进行操作,以免弹出窗口。

然后在框中用CSS拍一个“ X”。

CSS:

.popover-header::after {
    content: "X";
    position: absolute;
    top: 1ex;
    right: 1ex;
}

JQUERY:

$('.popover-dismiss').popover({
    trigger: 'focus'
});

HTML:

<a data-toggle="popover" data-trigger="focus" tabindex="0"  title="Native Hawaiian or Other Pacific Islander" data-content="A person having origins in any of the original peoples of Hawaii, Guam, Samoa, or other Pacific Islands.">?</a>

从技术上讲,如果有人单击“ X”以外的内容,则可以将其取消,但是至少在我的情况下这不是问题。


1
$popover = $el.popover({
  html: true
  placement: 'left'
  content: 'Do you want to a <b>review</b>? <a href="#" onclick="">Yes</a> <a href="#">No</a>'
  trigger: 'manual'
  container: $container // to contain the popup code
});

$popover.on('shown', function() {
  $container.find('.popover-content a').click( function() {
    $popover.popover('destroy')
  });
});

$popover.popover('show')'

1
$(function(){ 
  $("#example").popover({
    placement: 'bottom',
    html: 'true',
    title : '<span class="text-info"><strong>title!!</strong></span> <button type="button" id="close" class="close">&times;</button></span>',
    content : 'test'
  })

  $(document).on('click', '#close', function (evente) {
    $("#example").popover('hide');
  });
  $("#close").click(function(event) {
    $("#example").popover('hide');
  });
});

<button type="button" id="example" class="btn btn-primary" >click</button>

1
    $('.tree span').each(function () {
        var $popOverThis = $(this);
        $popOverThis.popover({
            trigger: 'click',
            container: 'body',
            placement: 'right',
            title: $popOverThis.html() + '<button type="button" id="close" class="close" ">&times;</button>',
            html: true,
            content: $popOverThis.parent().children("div.chmurka").eq(0).html()
        }).on('shown.bs.popover', function (e) {
            var $element = $(this);
            $("#close").click(function () {
                $element.trigger("click");
            });
        });
    });

当单击元素并显示弹出窗口时,接下来可以引发事件show.bs.popover,在该事件中,您会在其中获得触发单击以关闭弹出窗口的元素


1

FWIW,这是我正在使用的通用解决方案。我正在使用Bootstrap 3,但我认为一般方法也应适用于Bootstrap 2。

该解决方案启用了弹出窗口,并使用通用JS代码块为由“ rel =“ popover””标记标识的所有弹出窗口添加了“关闭”按钮。除了(标准)要求具有rel =“ popover”标签之外,您还可以在页面上放置任意数量的弹出窗口,并且不需要知道其ID,实际上,它们不需要ID。完全没有 您确实需要使用“数据标题” HTML标记格式来设置弹出窗口的标题属性,并将data-html设置为“ true”。

我发现必要的技巧是建立对弹出对象的引用的索引映射(“ po_map”)。然后,我可以通过HTML添加一个“ onclick”处理程序,该处理程序通过JQuery为其提供的索引(“ p_list ['+ index +']。popover(\'toggle \')“)引用该弹出对象。这样,我就不必担心popover对象的ID,因为我有一个带有JQuery提供的唯一索引的对象引用映射。

这是JavaScript:

var po_map = new Object();
function enablePopovers() {
  $("[rel='popover']").each(function(index) {
    var po=$(this);
    po_map[index]=po;
    po.attr("data-title",po.attr("data-title")+
    '<button id="popovercloseid" title="close" type="button" class="close" onclick="po_map['+index+'].popover(\'toggle\')">&times;</button>');
    po.popover({});
  });
}
$(document).ready(function() { enablePopovers() });

这个解决方案使我可以轻松地在我网站上的所有弹出窗口上放置一个关闭按钮。


1

我发现以下代码非常有用(摘自https://www.emanueletessore.com/twitter-bootstrap-popover-add-close-button/):

$('[data-toggle="popover"]').popover({
  title: function(){
    return $(this).data('title')+'<span class="close" style="margin-top: -5px">&times;</span>';
  }
}).on('shown.bs.popover', function(e){
  var popover = $(this);
  $(this).parent().find('div.popover .close').on('click', function(e){
    popover.popover('hide');
  });
});

0

停留在悬停时,HTML:

<a href="javascript:;" data-toggle="popover" data-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus." title="Lorem Ipsum">...</a>

Javascript:

$('[data-toggle=popover]').hover(function(e) {
  if( !$(".popover").is(':visible') ) {
      var el = this;
      $(el).popover('show');
      $(".popover > h3").append('<span class="close icon icon-remove"></span>')
                        .find('.close').on('click', function(e) {
                            e.preventDefault();
                            $(el).popover('hide');
                        }
      );
  }
});

0

将此放入标题popover构造函数中...

'<button class="btn btn-danger btn-xs pull-right"
onclick="$(this).parent().parent().parent().hide()"><span class="glyphicon
glyphicon-remove"></span></button>some text'

...在右上角有一个红色的小“ x”按钮

//$('[data-toggle=popover]').popover({title:that string here})

0

对于仍然有些困惑的人:

这是在弹出窗口显示后切换它,选择用于触发它的按钮并在其上调用.popover('toggle')的方法。

在这种情况下,用于关闭弹出窗口的代码为:

$('#example')。popover('toggle');


0

作为一个非常简单的解决方案,我做了以下工作:

1)添加以下CSS:

.sub_step_info .popover::after {
    content:url('/images/cross.png');
    position:absolute;
    display:inline-block;
    top:15px;
    right:5px;
    width:15px;
    text-align:center;
    cursor:pointer;
}

2)设置data-trigger="manual"弹出触发元素

3)然后基于https://github.com/twbs/bootstrap/issues/16802

$('[data-trigger="manual"]').click(function() {
    $(this).popover('toggle');
}).blur(function() {
    $(this).popover('hide');
}); 

这是基于在弹出窗口上的任何位置都可单击的基础,但是通过专注于十字架,您会鼓励您遵循的行为。


0

对我来说,这是在弹出窗口中添加关闭按钮的最简单解决方案。

HTML:

    <button type="button" id="popover" class="btn btn-primary" data-toggle="popover" title="POpover" data-html="true">
                    Show popover
    </button>

    <div id="popover-content" style="display:none"> 
       <!--Your content-->
       <button type="submit" class="btn btn-outline-primary" id="create_btn">Create</button>
       <button type="button" class="btn btn-outline-primary" id="close_popover">Cancel</button>  
    </div>

Javascript:

    document.addEventListener("click",function(e){
        // Close the popover 
        if (e.target.id == "close_popover"){
                $("[data-toggle=popover]").popover('hide');
            }
    });

0

单击关闭按钮时,我遇到了工具提示做一些时髦的问题的问题。要解决此问题,我使用了aspan而不是使用了按钮。另外,当单击关闭按钮时,我必须在工具提示关闭后单击两次以使其再次打开。要解决此问题,我仅使用了该.click()方法,如下所示。

<span tabindex='0' class='tooltip-close close'>×</span>

$('#myTooltip').tooltip({
    html: true,
    title: "Hello From Tooltip",
    trigger: 'click'
});    

$("body").on("click", ".tooltip-close", function (e) {
    else {
        $('.tooltip').remove();
        $('#postal-premium-tooltip').click();
    }
});

0

这是一个基于上面@Chris答案的有效解决方案,但已进行了修复,因此在触发元素的子序列单击中,您无需两次单击该元素。

.popover('hide)如注释中所述,手动使用会弄乱引导程序的内部状态。

var closePopover = function(eventShown) {
   // Set the reference to the calling element
   var $caller = $('#' + this.id);

   // Set the reference to the popover
   var $popover = $('#' + $(eventShown.target).attr('aria-describedby'));

       // Unbind any pre-existing event handlers to prevent duplicate clicks
       $popover.find('.popover-close').off('click');

       // Bind event handler to close button
       $popover.find('.popover-close').on('click', function(e) {

          // Trigger a click on the calling element, to maintain bootstrap's internal state
          $caller.trigger('click');
        });
 }

$('.popoverTriggerElement').popover({
   trigger: 'click'
})
.on('shown.bs.popover', closePopover)

现在,您可以使用关闭按钮,而无需复制单击事件,并且可以检查引导程序的内部状态,以便按预期工作。


-2
<script type="text/javascript"  src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script type="text/javascript" src="jquery.popover-1.1.2.js"></script>

<script type="text/javascript">
$(function(){ 
$("#example").popover({
        placement: 'bottom',
        html: 'true',
        title : '<span class="text-info"><strong>title</strong></span> <button     type="button" id="close" class="close">&times;</button></span>',
        content : 'test'
    })


$("#close").click(function(event) {

$("#example").popover('hide');
});
});
</script>

<button type="button" id="example" class="btn btn-primary" >click</button>

2
对不起,但是那将永远行不通。#close仅在弹出框处于活动状态时存在,click并且永不绑定。试试alert($("#close").length);(它警报0)
davidkonrad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.