Как вставить кнопку закрытия в popover для начальной загрузки
JS:
$(function(){
$("#example").popover({
placement: 'bottom',
html: 'true',
title : '<span class="text-info"><strong>title</strong></span> <button type="button" id="close" class="close">×</button>',
content : 'test'
})
$('html').click(function() {
$('#close').popover('hide');
});
});
HTML:
<button type="button" id="example" class="btn btn-primary" ></button>
Я пишу, ваш код не показывает ваше всплывающее окно.
Кто-нибудь может столкнуться с этой проблемой?
Ответы
Ответ 1
Вам нужно сделать правильную разметку
<button type="button" id="example" class="btn btn-primary">example</button>
Тогда один из способов заключается в том, чтобы прикрепить обработчик внутри самого элемента, работает следующее:
$(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="$("#example").popover("hide");">×</button>',
content : 'test'
});
});
Ответ 2
Мне нужно было найти что-то, что будет работать для нескольких popovers и в Bootstrap 3.
Вот что я сделал:
У меня было несколько элементов, для которых я хотел использовать popover, поэтому я не хотел использовать идентификаторы.
Разметка может быть:
<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>
Содержимое кнопок сохранения и закрытия внутри popover:
var contentHtml = [
'<div>',
'<button class="btn btn-link cancel">Cancel</button>',
'<button class="btn btn-primary save">Save</button>',
'</div>'].join('\n');
и 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');
});
});
Когда контейнер прикреплен к телу
Затем используйте описанную арию, чтобы найти всплывающее окно и скрыть его.
$('.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');
});
});
Ответ 3
Я нашел, что другие ответы были либо не достаточно обобщенными, либо слишком сложными. Вот простой, который должен всегда работать (для бутстрапа 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')
.
Ответ 4
![enter image description here]()
Следующее - это то, что я только что использовал в своем проекте. И надеюсь, что он может вам помочь.
<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">×</button>');
$(this).popover();
});
$(document).click(function(e) {
if(e.target.id=="popovercloseid" )
{
$('#manualinputlabel').popover('hide');
}
});
Ответ 5
Я проверил многие из упомянутых примеров кода, и для меня подход Криса работает отлично. Я добавил свой код здесь, чтобы иметь рабочую демонстрацию.
Я тестировал его с помощью 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 || ' ' ) + ' <a class="close" href="#">×</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>
Ответ 6
Фокус в том, чтобы получить текущий Popover с .data('bs.popover'). tip():
$('#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');
});
});
Ответ 7
Это работает с несколькими popovers, и я также добавил немного больших дополнительных JS для обработки проблем z-index, которые происходят с перекрывающимися popovers:
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">×</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;
}
Ответ 8
Предыдущие примеры имеют два основных недостатка:
- Кнопка "закрыть" нуждается в некотором роде, чтобы знать идентификатор ссылочного элемента.
- Необходимость добавления события event.bs.popover, прослушивателя 'click' к кнопке закрытия; что также не является хорошим решением из-за этого, вы будете добавлять такого слушателя каждый раз, когда отображается "popover".
Ниже приведено решение, которое не имеет таких недостатков.
По умолчанию элемент "popover" вставляется сразу после ссылочного элемента в DOM (затем обратите внимание на ссылочный элемент, а popover - это непосредственные элементы sibling). Таким образом, когда нажата кнопка "закрыть" , вы можете просто найти ближайший родительский элемент 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">×</button>';
$loginForm.popover({
placement: 'auto left',
trigger: 'manual',
html: true,
title: 'Alert' + genericCloseBtnHtml,
content: 'invalid email and/or password'
});
Ответ 9
Просто хотел обновить ответ. Согласно 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">×</button>';
},
content: 'Popup content',
trigger: 'hover',
html: true
});
$('.popover button.close').click(function() {
$(this).popover('toggle');
});
Ответ 10
Попробуйте следующее:
$(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">×</span></button>')
.click(function(){
popover.hide();
});
$('.popover-title', $tip).append(close);
});
});
Вместо добавления кнопки в виде строки разметки это намного проще, если у вас есть обернутая jQuery кнопка, потому что тогда вы можете привязать гораздо более аккуратно. Это действительно печально отсутствует в коде Bootstrap, но это обходное решение работает для меня и фактически может быть расширено для применения ко всем popovers, если это необходимо.
Ответ 11
У меня есть борьба с этим, и это самый простой способ сделать это, 3 строки js:
- Добавить крест в заголовке popover
- используйте фрагмент js, чтобы показать popover и закрыть, щелкнув заголовок
- Используйте немного 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>
Ответ 12
$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')'
Ответ 13
$(function(){
$("#example").popover({
placement: 'bottom',
html: 'true',
title : '<span class="text-info"><strong>title!!</strong></span> <button type="button" id="close" class="close">×</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>
Ответ 14
$('.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" ">×</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, где в нем вы получите элемент , в котором триггер щелкнет, чтобы закрыть ваш popover.
Ответ 15
FWIW, вот общее решение, которое я использую. Я использую Bootstrap 3, но я думаю, что общий подход должен работать с Bootstrap 2.
Решение позволяет popovers и добавляет кнопку "закрыть" для всех popovers, идентифицированных тегом rel= "popover", используя общий блок JS-кода. Помимо (стандартного) требования, что существует тег rel= "popover", вы можете наложить произвольное количество popovers на странице, и вам не нужно знать их идентификаторы - на самом деле им не нужны идентификаторы вообще. Вам нужно использовать формат HTML-тега 'data-title' для установки атрибута title ваших popovers и установить html-значение в значение "true".
Трюк, который я нашел необходимым, - это построить индексированную карту ссылок на объекты popover ( "po_map" ). Затем я могу добавить обработчик onclick через HTML, который ссылается на объект popover через индекс, который JQuery дает мне для него ( "p_list ['+ index +']. Popover (\ 'toggle \')" ). Таким образом, мне не нужно беспокоиться об идентификаторах объектов popover, так как у меня есть карта ссылок на сами объекты с уникальным индексом 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\')">×</button>');
po.popover({});
});
}
$(document).ready(function() { enablePopovers() });
это решение позволило мне легко установить кнопку закрытия всех пополнений на всем моем сайте.
Ответ 16
Я нашел код ниже очень полезным (взято из 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">×</span>';
}
}).on('shown.bs.popover', function(e){
var popover = $(this);
$(this).parent().find('div.popover .close').on('click', function(e){
popover.popover('hide');
});
});
Ответ 17
Прикрепленный на hover, 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');
}
);
}
});
Ответ 18
Поместите это в свой конструктор 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})
Ответ 19
Для тех, кто еще немного запутался:
Вот как это работает, чтобы переключить popover после того, как вы его отобразите, выберите ту же кнопку, которую вы использовали для ее запуска, и вызовите .popover('toggle') на нем.
В этом случае для закрытия popover код будет выглядеть следующим образом:
$( '# пример') поповер ( 'переключение');.
Ответ 20
<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">×</button></span>',
content : 'test'
})
$("#close").click(function(event) {
$("#example").popover('hide');
});
});
</script>
<button type="button" id="example" class="btn btn-primary" >click</button>