Bootstrap 3 Popover:在悬停和点击时显示,也就是说.固定一个弹出窗口

stk*_*067 16 javascript jquery popover twitter-bootstrap

使用悬停触发器显示弹出窗口工作正常.

使用单击触发器显示弹出窗口工作正常.

现在,如何在触发图像悬停时显示弹出窗口,但如果用户单击图像,取消悬停并启动单击切换?换句话说,悬停显示弹出窗口并单击弹出窗口的"引脚".

HTML非常标准:

<li>User<span class="glyphicon glyphicon-user" rel="popover" data-trigger="click" data-container="body" data-placement="auto left" data-content="Body Text" data-original-title="Title Text"></span></li>
Run Code Online (Sandbox Code Playgroud)

和popover初始化,更无聊:

$(function () { 
    $("[rel=popover]").popover();   
});
Run Code Online (Sandbox Code Playgroud)

从我迄今所看到的,它很可能是该解决方案是一个很好的复杂的popover('show'),popover('hide')和popover('toggle')电话,但我的JavaScript/jQuery的foo是达不到的任务.

编辑:

使用@hajpoj提供的代码作为基础,我添加了一个函数来监听hidden.bs.popover事件以尝试在触发click事件后重新启用mouseenter和mouseleave事件,但是它确实使'hover'再次工作,它杀死点击...

var $btn2 = $('#btn2');

    var enterShow = function() {
        $btn2.popover('show');
    };

    var exitHide = function() {
        $btn2.popover('hide');
    }

    $btn2.popover({trigger: 'manual'})
            .on('mouseenter', enterShow)
            .on('mouseleave', exitHide)
            .one('click', function() {
                   $btn2.off('mouseenter', enterShow)
                        .off('mouseleave', exitHide)
                        .on('click', function() {
                            $btn2.popover('toggle');
                        });
            });

$('#btn2').on('hidden.bs.popover', function () {
  $btn2.on('mouseenter', enterShow)
       .on('mouseleave', exitHide)
});
Run Code Online (Sandbox Code Playgroud)

haj*_*poj 18

编辑:

根据您的评论,提供更新的解决方案.它不会处于"单击"状态,而是返回到悬停状态.

jsfiddle:http://jsfiddle.net/hajpoj/JJQS9/15/

HTML:

<a href="#" id="btn2" class="btn btn-lg btn-danger" data-toggle="popover" title="" data-content="And here's some amazing content. It's very engaging. right?" data-original-title="A Title">Click to toggle popover</a>
Run Code Online (Sandbox Code Playgroud)

JS:

var $btn2 = $('#btn2');
$btn2.data('state', 'hover');

var enterShow = function () {
    if ($btn2.data('state') === 'hover') {
        $btn2.popover('show');
    }
};
var exitHide = function () {
    if ($btn2.data('state') === 'hover') {
        $btn2.popover('hide');
    }
};

var clickToggle = function () {
    if ($btn2.data('state') === 'hover') {
        $btn2.data('state', 'pinned');
    } else {
        $btn2.data('state', 'hover')
        $btn.popover('hover');
    }
};

$btn2.popover({trigger: 'manual'})
    .on('mouseenter', enterShow)
    .on('mouseleave', exitHide)
    .on('click', clickToggle);
Run Code Online (Sandbox Code Playgroud)

旧:

我相信这就是你要找的东西:

http://jsfiddle.net/JJQS9/1/

HTML:

<a href="#" id="btn2" class="btn btn-lg btn-danger" data-toggle="popover" title="" data-content="And here's some amazing content. It's very engaging. right?" data-original-title="A Title">Click to toggle popover</a>
Run Code Online (Sandbox Code Playgroud)

JS:

var $btn2 = $('#btn2');

var enterShow = function() {
    $btn2.popover('show');
};

var exitHide = function() {
    $btn2.popover('hide');
}

$btn2.popover({trigger: 'manual'})
        .on('mouseenter', enterShow)
        .on('mouseleave', exitHide)
        .one('click', function() {
            $btn2.off('mouseenter', enterShow)
                    .off('mouseleave', exitHide)
                    .on('click', function() {
                        $btn2.popover('toggle');
                    });
        });
Run Code Online (Sandbox Code Playgroud)

基本上你手动弹出和关闭mouseenter和mouseleave事件上的弹出窗口,但是一旦有人第一次点击弹出窗口,你就删除那些事件处理程序,并在click切换弹出窗口的事件上添加一个新的处理程序.

编辑: 替代js代码.更简单的代码,但是当你使用它时会有一个小的视觉效果:http: //jsfiddle.net/hajpoj/r3Ckt/1/

var $btn2 = $('#btn2');

$btn2.popover({trigger: 'hover'})
    .one('click', function() {
        $btn2.popover('destroy')
            .popover({ trigger: 'click'})
            .popover('show');
    });
Run Code Online (Sandbox Code Playgroud)


bar*_*art 5

很简单,添加hover到data-trigger如下:

<span rel="popover" data-trigger="hover click" data-container="body" data-placement="auto" data-content="Body Text"></span>
Run Code Online (Sandbox Code Playgroud)