16

使用悬停触发器使弹出框出现效果很好。

使用单击触发器使弹出框出现效果很好。

现在,当触发图像悬停在上方时,如何使弹出框出现,但是如果用户单击图像,取消悬停并启动单击切换?换句话说,悬停显示弹出框并单击“固定”弹出框。

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>

而popover初始化,就更无聊了:

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

从我目前看到的情况来看,解决方案似乎很可能是一组很好的复杂的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)
});
4

4 回答 4

19

编辑:

这是根据您的评论更新的解决方案。它不会停留在“点击”状态,而是返回悬停状态。

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>

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

老的:

我相信这就是您正在寻找的:

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>

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

基本上,您手动弹出打开/关闭mouseentermouseleave事件的弹出框,但是一旦有人第一次单击弹出框,您将删除这些事件处理程序,并在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');
    });
于 2013-09-12T03:35:42.150 回答
6

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

<span rel="popover" data-trigger="hover click" data-container="body" data-placement="auto" data-content="Body Text"></span>
于 2015-07-22T07:32:14.260 回答
4

这是一个混合弹出框/工具提示,可以为您提供您正在寻找的两个选项的功能,点击和悬停切换):

混合弹出框/工具提示小提琴

HTML:

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

JS:

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

$tip1.tooltip({trigger: 'hover'})
  .on('click', function() {
    $tip1.tooltip('toggle');
});
于 2013-11-21T22:06:16.397 回答
1

这是我使用 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);
});

我不确定它是否适用于所有情况,但它适用于我的情况。向@hajpoj 和@Trevor 大喊大叫以获得灵感。

JSFiddle:https ://jsfiddle.net/5m2ob3yf/ (还没有工作,但你可以得到要点)。

于 2017-07-03T18:28:59.287 回答