我们能否使弹出框与模态框一样可以通过在外部单击来关闭呢?
不幸的是,我不能只使用真正的模态框来替换弹出框,因为模态框意味着position:fixed,这将不再是弹出框了。 :(
我们能否使弹出框与模态框一样可以通过在外部单击来关闭呢?
不幸的是,我不能只使用真正的模态框来替换弹出框,因为模态框意味着position:fixed,这将不再是弹出框了。 :(
更新:稍微更健壮的解决方案:http://jsfiddle.net/mattdlockyer/C5GBU/72/
对于仅包含文本的按钮:
$('body').on('click', function (e) {
//did not click a popover toggle or popover
if ($(e.target).data('toggle') !== 'popover'
&& $(e.target).parents('.popover.in').length === 0) {
$('[data-toggle="popover"]').popover('hide');
}
});
对于包含图标的按钮,请使用(此代码在Bootstrap 3.3.6中存在错误,请参见本答案下面的修复方法)
$('body').on('click', function (e) {
//did not click a popover toggle, or icon in popover toggle, or popover
if ($(e.target).data('toggle') !== 'popover'
&& $(e.target).parents('[data-toggle="popover"]').length === 0
&& $(e.target).parents('.popover.in').length === 0) {
$('[data-toggle="popover"]').popover('hide');
}
});
对于JS生成的弹出框,请使用'[data-original-title]'
代替'[data-toggle="popover"]'
注意:上述解决方案允许同时打开多个弹出框。
请一次只打开一个弹出框:
更新:Bootstrap 3.0.x,请参见代码或示例http://jsfiddle.net/mattdlockyer/C5GBU/2/
$('body').on('click', function (e) {
$('[data-toggle="popover"]').each(function () {
//the 'is' for buttons that trigger popups
//the 'has' for icons within a button that triggers a popup
if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
$(this).popover('hide');
}
});
});
这处理已经打开但未被点击或其链接未被点击的弹出框的关闭。
更新: Bootstrap 3.3.6,查看 fiddle
修复了关闭后需要2次点击才能重新打开的问题。
$(document).on('click', function (e) {
$('[data-toggle="popover"],[data-original-title]').each(function () {
//the 'is' for buttons that trigger popups
//the 'has' for icons within a button that triggers a popup
if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
(($(this).popover('hide').data('bs.popover')||{}).inState||{}).click = false // fix for BS 3.3.6
}
});
});
更新:利用之前的改进条件,实现了这个解决方案。修复了双击和幽灵气泡的问题:
$(document).on("shown.bs.popover",'[data-toggle="popover"]', function(){
$(this).attr('someattr','1');
});
$(document).on("hidden.bs.popover",'[data-toggle="popover"]', function(){
$(this).attr('someattr','0');
});
$(document).on('click', function (e) {
$('[data-toggle="popover"],[data-original-title]').each(function () {
//the 'is' for buttons that trigger popups
//the 'has' for icons within a button that triggers a popup
if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
if($(this).attr('someattr')=="1"){
$(this).popover("toggle");
}
}
});
});
'[data-original-title]'
作为选择器,而不是'[data-toggle="popover"]'
,因为它无法与JavaScript生成的弹出窗口一起使用。 - Nathan$('html').on('mouseup', function(e) {
if(!$(e.target).closest('.popover').length) {
$('.popover').each(function(){
$(this.previousSibling).popover('hide');
});
}
});
如果您在弹出窗口以外的任何地方单击,这将关闭所有弹出窗口。
Bootstrap 4.1 更新
$("html").on("mouseup", function (e) {
var l = $(e.target);
if (l[0].className.indexOf("popover") == -1) {
$(".popover").each(function () {
$(this).popover("hide");
});
}
});
最简单、最安全的版本,适用于任何 Bootstrap 版本。
Demo: http://jsfiddle.net/guya/24mmM/
Demo 2: 在单击弹出框内容区域内时不关闭它:http://jsfiddle.net/guya/fjZja/
Demo 3: 多个弹出框:http://jsfiddle.net/guya/6YCjW/
只需调用这一行代码即可关闭所有弹出框:
$('[data-original-title]').popover('hide');
使用此代码在点击外部时关闭所有弹出式窗口:
$('html').on('click', function(e) {
if (typeof $(e.target).data('original-title') == 'undefined') {
$('[data-original-title]').popover('hide');
}
});
上述代码段在 body 元素上绑定了一个点击事件。当用户单击弹出框时,它将像正常情况下一样运行。当用户单击非弹出框元素时,它将关闭所有弹出框。
它还适用于通过 JavaScript 启动的弹出框,而不是其他一些无法运行的示例(请参见演示)。
如果您不希望在单击弹出框内容时关闭,请使用此代码(请参见第二个演示链接):
$('html').on('click', function(e) {
if (typeof $(e.target).data('original-title') == 'undefined' && !$(e.target).parents().is('.popover.in')) {
$('[data-original-title]').popover('hide');
}
});
!$(e.target).closest('.popover.in').length
比 !$(e.target).parents().is('.popover.in')
更有效率。 - joeytwiddle所谓的高票解决方案都不能正确地为我工作。每个解决方案在第一次打开和关闭(通过单击其他元素)弹出框后,都会导致一个错误,之后它就再也无法打开,直到你点击触发链接两次才能再次打开。
因此,我稍微修改了它:
$(document).on('click', function (e) {
var
$popover,
$target = $(e.target);
//do nothing if there was a click on popover content
if ($target.hasClass('popover') || $target.closest('.popover').length) {
return;
}
$('[data-toggle="popover"]').each(function () {
$popover = $(this);
if (!$popover.is(e.target) &&
$popover.has(e.target).length === 0 &&
$('.popover').has(e.target).length === 0)
{
$popover.popover('hide');
} else {
//fixes issue described above
$popover.popover('toggle');
}
});
})
使用Bootstrap 2.3.2,您可以将触发器设置为“focus”,它就可以正常工作:
$('#el').popover({trigger:'focus'});
这基本上并不太复杂,但需要进行一些检查以避免故障。
var $poped = $('someselector');
// Trigger for the popover
$poped.each(function() {
var $this = $(this);
$this.on('hover',function() {
var popover = $this.data('popover');
var shown = popover && popover.tip().is(':visible');
if(shown) return; // Avoids flashing
$this.popover('show');
});
});
// Trigger for the hiding
$('html').on('click.popover.data-api',function() {
$poped.popover('hide');
});
popover()
实现这个功能? - Zaki Aziz我做了一个jsfiddle示例来演示如何实现:
这个想法是在点击按钮时显示弹出框,在点击按钮外部时隐藏弹出框。
<a id="button" href="#" class="btn btn-danger">Click for popover</a>
$('#button').popover({
trigger: 'manual',
position: 'bottom',
title: 'Example',
content: 'Popover example for SO'
}).click(function(evt) {
evt.stopPropagation();
$(this).popover('show');
});
$('html').click(function() {
$('#button').popover('hide');
});
data-trigger="focus"
data-trigger="focus"
参考自https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click
该功能允许您在下一次单击文档中的任何位置时关闭模态对话框。通过添加data-dismiss="modal"
属性来实现此功能。例如:
<button type="button" data-dismiss="modal">Close</button>
Bootstrap 5更新:
$(document).on('click', function (e) {
var
$popover,
$target = $(e.target);
//do nothing if there was a click on popover content
if ($target.hasClass('popover') || $target.closest('.popover').length) {
return;
}
$('[data-bs-toggle="popover"]').each(function () {
$popover = $(this);
if (!$popover.is(e.target) &&
$popover.has(e.target).length === 0 &&
$('.popover').has(e.target).length === 0)
{
$popover.popover('hide');
}
});
})
data-trigger="hover"
和data-trigger="focus"
是关闭弹出框的内置替代方法,如果您不想使用切换。在我看来,data-trigger="hover"
提供了最好的用户体验...没有必要编写额外的 .js 代码... - Hooman Bahreini