如何解散一个推特引导弹窗点击外面?

我们能得到弹窗被解雇的方式一样的情态动词,即。使他们关闭时,用户点击以外的地方?

不幸的是,我不能用真实的模态来代替弹窗,因为模态意味着位置:固定,那样就没有弹窗了。:(

264500 次浏览

我做了一个jsfiddle来告诉你如何做到这一点:

http://jsfiddle.net/3yHTH/

其思想是在单击按钮时显示弹出窗口,在单击按钮外时隐藏弹出窗口。

超文本标记语言

<a id="button" href="#" class="btn btn-danger">Click for popover</a>

JS

$('#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');
});

这基本上不是很复杂,但有一些检查要做,以避免故障。

Demo (jsfiddle)

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');
});

在这里之前已经问过这个问题。我当时给出的答案仍然适用:

我有一个类似的需要,并找到这个伟大的小扩展的Twitter引导弹窗由李卡迈克尔,称为BootstrapX -点击。他也有一些用法示例在这里。基本上,它会将弹出窗口更改为一个交互式组件,当您单击页面的其他地方或弹出窗口中的关闭按钮时,该组件将关闭。这也将允许多个弹窗一次打开和一堆其他不错的功能。

jQuery("#menu").click(function(){ return false; });
jQuery(document).one("click", function() { jQuery("#menu").fadeOut(); });

您还可以使用事件冒泡从DOM中删除弹出框。它有点脏,但工作正常。

$('body').on('click touchstart', '.popover-close', function(e) {
return $(this).parents('.popover').remove();
});

在html中,将.popover-close类添加到应该关闭弹出窗口的内容中。

一个稍微健壮一点的解决方案: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"]'

警告:上面的解决方案允许多个弹窗一次打开。

请一次一个弹窗:

更新:引导3.0。x,参见code或小提琴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');
}
});
});

这处理关闭弹窗已经打开,没有点击或他们的链接没有点击。


更新:引导3.3.6,看到小提琴

修复关闭后需要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");
}
}
});
});

演示:http://jsfiddle.net/nessajtr/yxpM5/1/

var clickOver = clickOver || {};
clickOver.uniqueId = $.now();


clickOver.ClickOver = function (selector, options) {
var self = this;


//default values
var isVisible, clickedAway = false;


var callbackMethod = options.content;
var uniqueDiv = document.createElement("div");
var divId = uniqueDiv.id = ++clickOver.uniqueId;
uniqueDiv.innerHTML = options.loadingContent();


options.trigger = 'manual';
options.animation = false;
options.content = uniqueDiv;


self.onClose = function () {
$("#" + divId).html(options.loadingContent());
$(selector).popover('hide')
isVisible = clickedAway = false;
};
self.onCallback = function (result) {
$("#" + divId).html(result);
};


$(selector).popover(options);


//events
$(selector).bind("click", function (e) {
$(selector).filter(function (f) {
return $(selector)[f] != e.target;
}).popover('hide');


$(selector).popover("show");
callbackMethod(self.onCallback);


isVisible = !(clickedAway = false);
});


$(document).bind("click", function (e) {
if (isVisible && clickedAway && $(e.target).parents(".popover").length == 0) {
self.onClose();
isVisible = clickedAway = false;
} else clickedAway = true;
});

这是我的解。

$('html').on('mouseup', function(e) {
if(!$(e.target).closest('.popover').length) {
$('.popover').each(function(){
$(this.previousSibling).popover('hide');
});
}
});

这将关闭所有弹出窗口,如果你点击任何地方,除了一个弹出窗口

更新引导4.1

$("html").on("mouseup", function (e) {
var l = $(e.target);
if (l[0].className.indexOf("popover") == -1) {
$(".popover").each(function () {
$(this).popover("hide");
});
}
});

这种方法确保您可以通过单击页面上的任何位置来关闭弹出窗口。如果你点击另一个可点击的实体,它会隐藏所有其他弹窗。animation:false是必需的,否则你将在你的控制台得到jquery .remove错误。

$('.clickable').popover({
trigger: 'manual',
animation: false
}).click (evt) ->
$('.clickable').popover('hide')
evt.stopPropagation()
$(this).popover('show')


$('html').on 'click', (evt) ->
$('.clickable').popover('hide')

好吧,这是我第一次尝试在stackoverflow上回答一些东西,所以这里什么都没有:P

似乎不太清楚这个功能是否在最新的引导中开箱即用(好吧,如果你愿意妥协在哪里,用户可以点击。我不确定你是否必须设置“点击悬停”,但在iPad上,点击是一种切换。

最终的结果是,在桌面上,你可以悬停或点击(大多数用户都会悬停)。在触控设备上,触摸元素将使其上升,再次触摸将使其下降。当然,这与你最初的需求有一点妥协,但至少你的代码现在更干净了:)

< p > $(“.my-popover”).popover ({ 触发:'点击悬停' }); < / p >

使用bootstrap 2.3.2,你可以将触发器设置为“focus”,它就可以工作了:

$('#el').popover({trigger:'focus'});

这派对来晚了…但我想分享一下 我喜欢弹窗,但是它的内置功能太少了。我写了一个引导扩展.bubble(),这就是我想要的弹窗的一切。四种解题方法。点击外部,在链接上切换,点击X,然后点击escape

它会自动定位,所以永远不会离开页面。

https://github.com/Itumac/bootstrap-bubble

这不是毫无理由的自我推销……在我的生活中,我已经多次获得别人的代码,我想贡献我自己的努力。试一试,看看是否对你有用。

最简单,最安全的版本,适用于任何引导版本。

< p >演示: http://jsfiddle.net/guya/24mmM/ < / p >

演示2:当点击弹出窗口内容时不解散 http://jsfiddle.net/guya/fjZja/ < / p >

演示3:多个弹窗: http://jsfiddle.net/guya/6YCjW/ < / p >


简单地调用这一行将会解散所有弹窗:

$('[data-original-title]').popover('hide');

当点击外部时,用下面的代码解散所有弹出窗口:

$('html').on('click', function(e) {
if (typeof $(e.target).data('original-title') == 'undefined') {
$('[data-original-title]').popover('hide');
}
});
上面的代码片段在主体上附加了一个单击事件。 当用户点击弹出窗口时,它会正常运行。 当用户点击非弹出窗口的内容时,它会关闭所有弹出窗口

它还可以与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');
}
});
我想到了这个: 我的场景是在同一个页面上包含更多弹窗,隐藏它们只是让它们不可见,因此,点击弹窗后面的项目是不可能的。 这个想法是将特定的弹出窗口链接标记为“活动”,然后你可以简单地“切换”活动弹出窗口。这样做将完全关闭弹窗 $ (' .popover-link ')。弹出窗口({HTML: true,容器:'body'})

$('.popover-link').popover().on 'shown.bs.popover', ->
$(this).addClass('toggled')


$('.popover-link').popover().on 'hidden.bs.popover', ->
$(this).removeClass('toggled')


$("body").on "click", (e) ->
$openedPopoverLink = $(".popover-link.toggled")
if $openedPopoverLink.has(e.target).length == 0
$openedPopoverLink.popover "toggle"
$openedPopoverLink.removeClass "toggled"

我只是在新弹出窗口显示之前删除其他活动弹出窗口(bootstrap 3):

$(".my-popover").popover();


$(".my-popover").on('show.bs.popover',function () {
$('.popover.in').remove();
});

使用Matt Lockyer的代码,我做了一个简单的重置,所以dom不会被隐藏的元素覆盖。

Matt的代码:http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/

小提琴:http://jsfiddle.net/mrsmith/Wd2qS/

    $('body').on('click', function (e) {
//hide popover from dom to prevent covering elements
$('.popover').css('display', 'none');
//bring popover back if trigger element is clicked
$('[data-toggle="popover"]').each(function () {
if ($(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
$('.popover').css('display', 'block');
}
});
//hide popover with .popover method
$('[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');
}
});
});

试试这个,点击外面会隐藏。

$('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');
}
});
});

根据http://getbootstrap.com/javascript/#popovers

<button type="button" class="popover-dismiss" data-toggle="popover" title="Dismissible popover" data-content="Popover Content">Dismissible popover</button>

使用焦点触发器可以在用户下一次单击时取消弹出窗口。

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

我有问题与mattdlockyer的解决方案,因为我设置弹窗链接动态使用如下代码:

$('body').popover({
selector : '[rel="popover"]'
});

所以我必须这样修改它。它为我解决了很多问题:

$('html').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('destroy');
}
});
});

记住destroy删除元素,所以选择器部分在初始化弹窗时很重要。

如果你使用选择器委托创建弹出窗口,那么'hide'方法似乎不起作用,而必须使用'destroy'。

我是这样做的:

$('body').popover({
selector: '[data-toggle="popover"]'
});


$('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('destroy');
}
});
});

JSfiddle here

我们发现我们从@mattdlockyer的解决方案中有一个问题(感谢解决方案!)当像这样使用弹出窗口构造函数的selector属性时…

$(document.body').popover({selector: '[data-toggle=popover]'});

...BS3的解决方案行不通。相反,它会在$(this)本地创建第二个弹出窗口实例。以下是我们预防这种情况的解决方案:

$(document.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) {
var bsPopover = $(this).data('bs.popover'); // Here's where the magic happens
if (bsPopover) bsPopover.hide();
}
});
});

如上所述,由于委托侦听器,$(this).popover('hide');将创建第二个实例。提供的解决方案只隐藏已经实例化的弹窗。

希望我能帮你们节省点时间。

来自@guya的答案是有效的,除非你在弹出窗口中有像日期选择器或时间选择器这样的东西。为了解决这个问题,这就是我所做的。

if (typeof $(e.target).data('original-title') === 'undefined' &&
!$(e.target).parents().is('.popover.in')) {
var x = $(this).parents().context;
if(!$(x).hasClass("datepicker") && !$(x).hasClass("ui-timepicker-wrapper")){
$('[data-original-title]').popover('hide');
}
}
$('html').on('click.popover', function (e) {
var allpopins = $('.popover.in');
if (allpopins.has(e.target).length > 0 &&
!$('.btn', allpopins).is(e.target))
return;
// recognise pop-up
var id = $(e.target).attr('aria-describedby');
var popin = $("#" + id);
//on any button click in entire pop-up hide this pop-ups
$(popin).on(".btn", function () { popin.remove(); });
// on any place out of entire popup hide all pop-ups
$('.popover.in').not(popin).remove();
});

这是我最好的性能解决方案。欢呼。

所谓的高投票的解决方案对我来说都不正确。 当第一次打开和关闭(通过单击其他元素)弹出窗口后,它不会再次打开,直到你使两个单击触发链接而不是单击一次时,每一个都会导致一个错误

所以我稍微修改了一下:

$(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');
}
});
})

修改后的接受方案。我的经验是,在一些弹窗被隐藏后,它们必须被点击两次才能再次显示。下面是我所做的,以确保弹窗('hide')不会被已经隐藏的弹窗调用。

$('body').on('click', function (e) {
$('[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) {
var popoverElement = $(this).data('bs.popover').tip();
var popoverWasVisible = popoverElement.is(':visible');


if (popoverWasVisible) {
$(this).popover('hide');
$(this).click(); // double clicking required to reshow the popover if it was open, so perform one click now
}
}
});
});

答案很好,只要添加一个angular指令,以防你像我一样使用angular:

app.directive('popover', ['$document', function($document) {
return {
restrict: 'EA',
link: function(scope, elem, attrs) {
$(document).ready(function() {
$('[data-toggle="popover"]').popover();
});


elem.bind('click', function(e) {
$('#notification').popover('toggle');
})


$('body').on('click', function (e) {
//the 'is' for buttons that trigger popups
//the 'has' for icons within a button that triggers a popup
if (!elem.is(e.target)
&& elem.has(e.target).length === 0
&& $('.popover').has(e.target).length === 0) {
elem.popover('hide');
}
});
}
};
}]);

html代码:

<a popover tabindex="0" role="button"
id="notification"
data-toggle="popover" data-trigger="manual"
data-container="body" data-placement="bottom"
data-content="This is a popover">
Popover button
</a>

它应该像使用data-trigger='click focus'一样简单,因为根据bootstrap:

弹出窗口如何触发-点击|悬停|焦点|手动。你可以传递多个触发器;用一个空格把它们分开。手动不能与任何其他触发器结合使用。

然而,由于未知的原因,同时使用点击和聚焦并不适合我,相反,我必须手动切换它。

用3.3.6测试,第二次点击是ok的

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


$(document).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');
}
});
});
$("body").find('.popover').removeClass('in');

引导本机支持这个:

JS Bin Demo

在下次单击时取消所需的特定标记

为了实现适当的跨浏览器和跨平台行为,你必须使用<a>标记,标记,<button>标记,你还必须包括role="button"tabindex属性。

这个解决方案摆脱了烦人的第二次点击时,显示弹出窗口的第二次

使用Bootstrap v3.3.7进行测试

$('body').on('click', function (e) {
$('.popover').each(function () {
var popover = $(this).data('bs.popover');
if (!popover.$element.is(e.target)) {
popover.inState.click = false;
popover.hide();
}
});
});
$(document).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) {
$(this).popover('hide').data('bs.popover').inState.click = false
}


});
});

接受答案的最新更新有一个问题: 如果你启用了一些工具提示,然后打开一个弹出窗口,然后单击具有工具提示的元素,工具提示的文本将以弹出窗口的形式显示到。

为了防止这种情况,只需添加

 if ($(this).data('bs.popover')) {

在if语句中(或将其与&&到if-statement)

// only show one popover at the time and hide on clicking outside
$(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).data('bs.popover')) {
(($(this).popover('hide').data('bs.popover') || {}).inState || {}).click = false  // fix for BS 3.3.6
}
}
});
});

只需将此属性添加到元素中

data-trigger="focus"

只需将此属性添加到html元素,以关闭弹出窗口在下次点击。

data-trigger="focus"

引用https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click

我试过很多以前的答案,真的没有一个对我有效,但这个解决方案管用:

https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click

他们建议使用锚标记而不是按钮,并注意role="button" + data-trigger="focus" + tabindex="0"属性。

例:

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover"
data-trigger="focus" title="Dismissible popover" data-content="amazing content">
Dismissible popover</a>
我找到了一个解决这个问题的好方法。 通过这种方式,我们只在需要时激活事件侦听器。 此外,我们没有弹窗不出现的问题,因为 事件解除弹出窗口正在同时开火。< / p >

将弹出窗口添加到HTML中

   <input id="popoverId" type="text" data-toggle="popover" data-trigger="manual" data-content="Popover content">

当你需要时显示弹出窗口。

$('#popoverId').popover('show');
将这个监听器添加到Javascript中。这个侦听器将在弹出窗口显示时立即启动 并将一个侦听器附加到将隐藏 当用户单击页面主体的任何位置时弹出窗口,然后删除事件监听器,直到弹出窗口再次显示
$('#popoverId').on('shown.bs.popover', function () {
$('body').click(function () {
$('#popoverId').popover('hide');
$('body').off();
});
});

这个解决方案很有效:

$("body")   .on('click'     ,'[data-toggle="popover"]', function(e) {
e.stopPropagation();
});


$("body")   .on('click'     ,'.popover' , function(e) {
e.stopPropagation();
});


$("body")   .on('click'  , function(e) {
$('[data-toggle="popover"]').popover('hide');
});

根据最高的两个答案,我有一个小方法:

<span class="btn btn-info btn-minier popover-info" data-rel="popover"
data-placement="bottom" data-html="true" title=""
data-content="popover-content"
data-original-title="popover-title">
<i class="ace-icon fa fa-info smaller-100"></i>
</span>
            $('[data-rel=popover]').popover({html: true});
$(document).on("shown.bs.popover", '[data-rel=popover]', function () {
$('[data-rel="popover"][popover-show="1"]').popover('hide');
$(this).attr('popover-show', '1');
});
$(document).on("hidden.bs.popover", '[data-rel=popover]', function () {
if ($(this).attr('popover-show') === '0') {
// My important fix: using bootstrap 3.4.1, if hide popover by .popover('hide') and click to show, popover internal treat it is already shown and dispatch hidden event immediately without popover anything.
$(this).popover('toggle');
} else {
$(this).attr('popover-show', '0');
}
});
$('html').on('click', function (e) {
if (typeof $(e.target).data('original-title') == 'undefined'
&& typeof $(e.target).parent().data('original-title') == 'undefined'
&& !$(e.target).parents().is('.popover.in')) {
$('[data-rel="popover"][popover-show="1"]').popover('hide');
}
});

对于任何人寻找一个解决方案,工作与Bootstrap 5和没有jQuery,即使弹出窗口是动态生成(即手动触发):

document.querySelector('body').addEventListener('click', function(e) {
var in_popover = e.target.closest(".popover");


if (!in_popover) {
var popovers = document.querySelectorAll('.popover.show');


if (popovers[0]) {
var triggler_selector = `[aria-describedby=${popovers[0].id}]`;


if (!e.target.closest(triggler_selector)) {
let the_trigger = document.querySelector(triggler_selector);
if (the_trigger) {
bootstrap.Popover.getInstance(the_trigger).hide();
}
}
}
}
});

引导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');
}
});
})

这对我很管用。

分解:

首先,将click事件监听器添加到body

在单击,检查是否有带有popover类的元素(Bootstrap在排除时从DOM中删除弹出窗口元素)。

如果存在.popover元素,检查event.target,它会告诉你User在页面上点击了哪里。如果它是.popover元素的一部分,什么都不做。如果不是,hide弹出窗口(这里的文档)。

注意:aria-describedby条件防止弹窗在最初被触发/显示时被隐藏。

document.body.addEventListener('click', event => {
let isPopoverShown = Boolean(document.querySelector('.popover'));
let isClickNotPopover = !event.target.closest('.popover');


if (
isPopoverShown
&& isClickNotPopover
&& !event.target?.getAttribute('aria-describedby')?.startsWith('popover')
) {
$('.popover').popover('hide')
}


})