Jquery 引导弹出窗口:悬停/单击并在外部单击时关闭,但恢复到悬停模式

Jquery 引导弹出窗口:悬停/单击并在外部单击时关闭,但恢复到悬停模式,jquery,twitter-bootstrap,twitter-bootstrap-3,Jquery,Twitter Bootstrap,Twitter Bootstrap 3,在下面的代码片段中,我有一个支持悬停和单击模式的引导弹出窗口。单击时,窗口保持打开状态,并应在(1)自单击(再次链接)或(2)任何外部单击时关闭 问题:在外部单击后,弹出框将进入“当前打开”模式。这意味着,如果您再次将鼠标悬停在该窗口上,该窗口将被卡住并且不会消失。应该发生的是,在外部单击后,再次将鼠标悬停在其上时,将恢复到原始的悬停和消失模式。这里的行为与在内部关闭单击(即原始状态)后悬停时的行为相同。我忘了什么吗 $('#linkpover').popover({ 触发器:“悬停单击”,

在下面的代码片段中,我有一个支持悬停和单击模式的引导弹出窗口。单击时,窗口保持打开状态,并应在(1)自单击(再次链接)或(2)任何外部单击时关闭

问题:在外部单击后,弹出框将进入“当前打开”模式。这意味着,如果您再次将鼠标悬停在该窗口上,该窗口将被卡住并且不会消失。应该发生的是,在外部单击后,再次将鼠标悬停在其上时,将恢复到原始的悬停和消失模式。这里的行为与在内部关闭单击(即原始状态)后悬停时的行为相同。我忘了什么吗

$('#linkpover').popover({
触发器:“悬停单击”,
内容:“这是我的内容”,
标题:“标题”
});
// -----------------
//只需使用上面的代码(没有其他代码),鼠标悬停并单击切换
//在同一个弹出窗口中工作,
//但现在我还需要删除任何点击外部的可见弹出框。
//然而,尽管下面的方法有效,但在弹出窗口外单击*后*仍处于单击状态
//模式,即不再悬停
$('body')。在('click',函数(e)上{
$('[data toggle=“popover”]')。每个(函数(){
如果(!$(this).is(e.target)&&&$(this).has(e.target).length==0&&$('.popover')。has(e.target).length==0){
//在弹出框打开的情况下从外部单击,需要隐藏
$(this.popover('hide');
}	    	
});  
});

爆米花




























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

我考虑这样做,因为
单击事件是您单击触发器本身时发生的事件

$(文档).ready(函数(){
$('#linkpover')。popover({
触发器:“悬停单击”,
内容:“这是我的内容”,
标题:“标题”
});
$('body')。在('click',函数(e)上{
$('[data toggle=“popover”]')。每个(函数(){
if(!$(this).is(e.target)&($(“#linkpover”).next('div.popover:visible').length)){
$(“#linkpover”).trigger('click');
}
});
});
});

爆米花



























身体末端
我的第一个答案在超过1个popover时,由于无限循环,产生了超出最大调用堆栈大小的
错误(请参阅我的第一个答案和注释)。

为了解决这个问题:每当系统即将执行
触发器('click')
时,我在body click处理程序上使用
.off
。之后,我重新初始化body click处理程序。见下面的示例

$(文档).ready(函数(){
函数初始化单击(){
$('body')。在('click',函数(e)上{
$('[data toggle=“popover”]')。每个(函数(){
if(!$(this.is(e.target)&($(this.next('div.popover:visible').length)){
$('body')。关闭('click');
$(this.trigger('click');
初始化单击();
}
});
});
}
$('#linkpover')。popover({
触发器:“悬停单击”,
内容:“这是我的内容”,
标题:“标题”
});
$('#linkpopover 2')。popover({
触发器:“悬停单击”,
内容:“这是我的内容”,
标题:“标题”
});
$('body')。在('click',函数(e)上{
$('[data toggle=“popover”]')。每个(函数(){
if(!$(this.is(e.target)&($(this.next('div.popover:visible').length)){
$('body')。关闭('click');
$(this.trigger('click');
初始化单击();
}
});
});
});

爆米花
流行音乐2



























身体末端
我在
正文中引入了一个自定义标志参数,实际上解决了eminememinem原始答案中的无限循环(由于
触发器('click')
)。你也可以这样做

     $('body').on('click', function (e, manualClickTriggered) {
我们在自己重新触发的特殊情况下设置标志。如果是这样,我们就忽略了常规逻辑

完整片段:

$('[id*=“linkPopover”]')。popover({
触发器:“悬停单击”,
内容:“这是我的内容”,
标题:“标题”
});
//如果在外部单击,请关闭任何可见的弹出窗口
//“ManualClickTrigger”标志表示我们自己启动了特殊的Click事件,以关闭popover,在这种情况下,跳过常规逻辑。
$('body')。在('click')上,函数(e,manualClickTriggered){
var linkId=null;
如果(例如,target.id.indexOf(“linkPopover”)!=-1){
linkId=e.target.id;
}
如果(手动点击触发!=真){
如果(e.target.id.indexOf(“linkPopover”)==-1){//不是来自任何Popover链接(外部单击)
$('a[id^=“linkpover”][data toggle=“popover”]')。每个(函数(){
if(!$(this.is(e.target)&($(this.next('div.popover:visible').length)){
$(this).trigger('click',true);
}
});
}
else//来自某个Popover链接
{
$('a[id^=“linkpover”][data toggle=“popover”]')。每个(函数(){
if($(this.attr('id')!=linkId&&$(this.next('div.popover:visible').length){
$(this).trigger('click',true);
}
});
}
}
});

POPOVER 1
POPOVER 2
POPOVER 3
POPOVER 4




























正文结尾
不过,此解决方案存在一个问题。因为你做了
trigger('click')
,如果有多个popover,我们会捕获所有