引导 3 弹出框:悬停时显示,单击时显示,又名.固定弹出框

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

本文关键字:显示 又名 单击 悬停 引导      更新时间:2023-09-26

使用悬停触发器显示弹出框可以正常工作。

使用单击触发器显示弹出框可以正常工作。

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

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>

而弹出的初始化,更无聊:

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

从我目前所看到的情况来看,解决方案很可能是一组非常复杂的popover('show')popover('hide')popover('toggle')调用,但我的javascript/jQuery-foo不能胜任这项任务。

编辑:

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

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

编辑:

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

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');
    });
非常简单

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

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

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

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

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

以下是我使用 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/(尚不工作,但你可以得到要点)。