简体   繁体   English

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

[英]Bootstrap 3 Popover: display on hover AND on click, aka. Pin a Popover

Making a popover appear with the hover trigger works fine. 使用悬停触发器显示弹出窗口工作正常。

Making a popover appear with the click trigger works fine. 使用单击触发器显示弹出窗口工作正常。

Now, how do I go about making the popover appear when the triggering image is hovered over, but then if the user clicks on the image, cancel the hover and initiate a click toggle? 现在,如何在触发图像悬停时显示弹出窗口,但如果用户单击图像,取消悬停并启动单击切换? In other words, hovering shows the popover and clicking 'pins' the popover. 换句话说,悬停显示弹出窗口并单击弹出窗口的“引脚”。

The HTML is pretty standard: 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>

And the popover initialization, even more boring: 和popover初始化,更无聊:

$(function () { 
    $("[rel=popover]").popover();   
});

From what I have seen so far, it seems likely that the solution is a nice complex set of popover('show') , popover('hide') , and popover('toggle') calls, but my javascript / jQuery-foo is not up to the task. 从我到目前为止所看到的,似乎解决方案是一个很好的复杂的popover('show')popover('hide')popover('toggle')调用,但我的javascript / jQuery-foo不能胜任这项任务。

EDIT: 编辑:

Using the code provided by @hajpoj as a base, I added a function to listen to the hidden.bs.popover event to try to re-enable the mouseenter and mouseleave events after triggering the click event, but although it does make the 'hover' work again, it kills the click... 使用@hajpoj提供的代码作为基础,我添加了一个函数来监听hidden.bs.popover事件,以尝试在触发click事件后重新启用hidden.bs.popover和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)
});

Edit: 编辑:

Heres an updated solutions based off your comment. 根据您的评论,提供更新的解决方案。 It doesn't stay in a 'click' state but returns to the hover state. 它不会处于“单击”状态,而是返回到悬停状态。

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

html: 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>

js: 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);

Old: 旧:

I believe this is what you are looking for: 我相信这就是你要找的东西:

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

html: 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>

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

Basically you manually pop open/close the popover on the mouseenter and mouseleave events, but once someone clicks on the popover for the first time, you remove those event handlers, and add a new handler on the click event that toggles the popover. 基本上你手动弹出/关闭mouseentermouseleave事件上的mouseenter ,但是一旦有人第一次点击popover,你就删除那些事件处理程序,并在click事件上添加一个新的处理程序来切换popover。

Edit: an alternative js code. 编辑:替代js代码。 simpler code, but there is a small visual blip when you use it: http://jsfiddle.net/hajpoj/r3Ckt/1/ 更简单的代码,但是当你使用它时会有一个小的视觉效果: http//jsfiddle.net/hajpoj/r3Ckt/1/

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

$btn2.popover({trigger: 'hover'})
    .one('click', function() {
        $btn2.popover('destroy')
            .popover({ trigger: 'click'})
            .popover('show');
    });

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

<span rel="popover" data-trigger="hover click" data-container="body" data-placement="auto" data-content="Body Text"></span>

Here's a hybrid popover/tooltip that could give you the functionality that you are looking for both options, toggles on click and hover): 这是一个混合弹出/工具提示,它可以为您提供正在寻找两种选项的功能,在点击和悬停时切换):

Hybrid popover/tooltip fiddle 混合弹出/工具提示小提琴

HTML: HTML:

<button id="tip1" type="button" class="btn btn-default" data-toggle="tooltip" data-placement="bottom" title='this text!'>What's hidden?</button>

JS: JS:

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

$tip1.tooltip({trigger: 'hover'})
  .on('click', function() {
    $tip1.tooltip('toggle');
});

Here's the way I accomplished the hover/pin functionality using Bootstrap and JQuery: 这是我使用Bootstrap和JQuery完成悬停/引脚功能的方式:

$(function () {
    var clicked = false;

    var onLeave = function() {
        if (!clicked) { $(this).popover('hide'); }
    };

    var onEnter = function () {
        if (!clicked) { $(this).popover('show'); }
    };

    var clickToggle = function() {
        if (clicked) { $(this).popover('hide'); }
        clicked = !clicked;
    }
    $('.popover-div-class').popover({ trigger: "manual"})
        .on('mouseenter', onEnter)
        .on('mouseleave', onLeave)
        .on('click', clickToggle);
});

I'm not sure it'll work in all scenarios, but it worked in mine. 我不确定它是否适用于所有情况,但它在我的工作中有效。 Big shoutout to @hajpoj and @Trevor for the inspiration. 对@hajpoj和@Trevor的灵感大声呐喊。

JSFiddle: https://jsfiddle.net/5m2ob3yf/ (Doesn't work yet, but you can get the gist). JSFiddle: https ://jsfiddle.net/5m2ob3yf/(不起作用,但你可以得到主旨)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM