当popover徘徊时,我怎样才能保持bootstrap popover活着?

vik*_*vde 106 jquery popover onhover twitter-bootstrap

我正在使用twitter boostrap的popover来创建一个显示用户信息的悬停卡,我在这里触发mouseover检查jsfiddle上的popover.我想在它徘徊时保持这个popover活着.

<a href="#" id="example" class="btn btn-danger" rel="popover" >hover for popover</a>

$('#example').popover({
        html : true,
        trigger : 'manual',
        content : function() {
            return '<div class="box"></div>';
        }
    });
$(document).on('mouseover', '#example', function(){
    $('#example').popover('show');
});
$(document).on('mouseleave', '#example', function(){
    $('#example').popover('hide');
});
Run Code Online (Sandbox Code Playgroud)

你可以想到facebook悬停卡的工作.我想以同样的方式.我怎样才能做到这一点?

Oke*_*ieE 158

在Plunker中查看此工作代码

小修改(来自vikas提供的解决方案)以适应我的用例.
1.
在弹出框按钮的悬停事件上打开弹出窗口2.将鼠标悬停在弹出框上时保持弹出窗口
3. 在鼠标左键上关闭弹出窗口中的popover按钮或弹出框.

$('.pop').popover({
    trigger: 'manual',
    html: true,
    animation: false
})
.on('mouseenter', function () {
    var _this = this;
    $(this).popover('show');
    $('.popover').on('mouseleave', function () {
        $(_this).popover('hide');
    });
}).on('mouseleave', function () {
    var _this = this;
    setTimeout(function () {
        if (!$('.popover:hover').length) {
            $(_this).popover('hide');
        }
    }, 300);
});
Run Code Online (Sandbox Code Playgroud)

在Plunker玩它

  • 这个答案太棒了.截至2015年5月在BS3上运行良好^^ (3认同)

vik*_*vde 79

我来了另一个解决方案...这是代码

    $('.selector').popover({
        html: true,
        trigger: 'manual',
        container: $(this).attr('id'),
        placement: 'top',
        content: function () {
            $return = '<div class="hover-hovercard"></div>';
        }
    }).on("mouseenter", function () {
        var _this = this;
        $(this).popover("show");
        $(this).siblings(".popover").on("mouseleave", function () {
            $(_this).popover('hide');
        });
    }).on("mouseleave", function () {
        var _this = this;
        setTimeout(function () {
            if (!$(".popover:hover").length) {
                $(_this).popover("hide")
            }
        }, 100);
    });
Run Code Online (Sandbox Code Playgroud)

  • 添加`animation:false`非常重要,否则将鼠标重复移动到链接上会导致它无法正常工作 (6认同)
  • 我对您的代码进行了一些小修改@vikas(https://gist.github.com/Nitrodist/7913848).它在50ms后重新检查状态,以便它不会保持卡住状态.也就是说,它每50毫秒不断重新检查一次. (5认同)
  • 如何对其进行调整以使其适用于刚添加到文档中的实时元素? (2认同)

Woj*_*ski 28

这是我的看法:http://jsfiddle.net/WojtekKruszewski/Zf3m7/22/

有时将鼠标从弹出窗口触发器对移动到实际弹出窗口内容时,将鼠标悬停在下面的元素上.我想处理这种情况 - 只要你在超时触发之前到达弹出窗口内容,你就是安全的(弹出窗口不会消失).它需要delay选项.

这个hack基本上覆盖了Popover leave函数,但调用了原始函数(启动计时器来隐藏弹出框).然后它将一次性监听器附加到mouseenterpopover内容元素.

如果鼠标进入弹出框,则清除计时器.然后它转动它mouseleave在popover上监听,如果它被触发,它会调用原始的leave函数,以便它可以启动hide timer.

var originalLeave = $.fn.popover.Constructor.prototype.leave;
$.fn.popover.Constructor.prototype.leave = function(obj){
  var self = obj instanceof this.constructor ?
    obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
  var container, timeout;

  originalLeave.call(this, obj);

  if(obj.currentTarget) {
    container = $(obj.currentTarget).siblings('.popover')
    timeout = self.timeout;
    container.one('mouseenter', function(){
      //We entered the actual popover – call off the dogs
      clearTimeout(timeout);
      //Let's monitor popover content instead
      container.one('mouseleave', function(){
        $.fn.popover.Constructor.prototype.leave.call(self, self);
      });
    })
  }
};
Run Code Online (Sandbox Code Playgroud)

  • 使用`container = self.$ tip;'可以改进查找容器.这样,甚至可以在设置`container`属性时找到popover.这里有一个小提琴:http://jsfiddle.net/dennis_c/xJc65/ (5认同)
  • @pferrel我已经在@Wojtek_Kruszewski的小提琴中解决了这个问题:http://jsfiddle.net/HugeHugh/pN26d/看到之前检查`if(!thisTip.is(':visible'))`的部分调用`originalShow()` (3认同)

Dav*_*ase 14

我使用了触发器设置hover并将容器设置为#element最终添加了boxto 的位置right.

这应该是你的设置:

$('#example').popover({
    html: true,
    trigger: 'hover',
    container: '#example',
    placement: 'right',
    content: function () {
        return '<div class="box"></div>';
    }
});
Run Code Online (Sandbox Code Playgroud)

#exampleCSS需要position:relative;检查下面的jsfiddle:

https://jsfiddle.net/9qn6pw4p/1/

编辑

这个小提琴有两个链接,没有问题 http://jsfiddle.net/davidchase03/FQE57/4/

  • 没有一个jsfiddle为我工作.Chrome 2014年3月20日. (2认同)

小智 9

我认为一个简单的方法是:

$('.popover').each(function () {
                    var $this = $(this);
                    $this.popover({
                        trigger: 'hover',
                        content: 'Content Here',
                        container: $this
                    })
                });
Run Code Online (Sandbox Code Playgroud)

这样,popover就在目标元素本身内创建.所以当你将鼠标移到弹出窗口上时,它仍然在元素上方.Bootstrap 3.3.2适用于此.旧版本可能在动画方面存在一些问题,因此您可能需要禁用"animation:false"


小智 7

这是我在网络上的其他位的帮助下使用bootstrap popover的方式.动态获取网站上显示的各种产品的标题和内容.每个产品或popover都有唯一的ID.当退出产品($ this .pop)或popover时,Popover将消失.超时用于显示弹出窗口,直到通过产品退出而不是弹出窗口.

$(".pop").each(function () {
        var $pElem = $(this);
        $pElem.popover(
            {
                html: true,
                trigger: "manual",
                title: getPopoverTitle($pElem.attr("id")),
                content: getPopoverContent($pElem.attr("id")),
                container: 'body',
                animation:false
            }
        );
    }).on("mouseenter", function () {
        var _this = this;
        $(this).popover("show");
        console.log("mouse entered");
        $(".popover").on("mouseleave", function () {
            $(_this).popover('hide');
        });
    }).on("mouseleave", function () {
        var _this = this;
        setTimeout(function () {
            if (!$(".popover:hover").length) {
                $(_this).popover("hide");
            }
        }, 100);
    });
    function getPopoverTitle(target) {
        return $("#" + target + "_content > h3.popover-title").html();
    };

    function getPopoverContent(target) {
        return $("#" + target + "_content > div.popover-content").html();
    };
Run Code Online (Sandbox Code Playgroud)


for*_*tor 6

我同意最好的方法是使用David Chase 、Cu Ly 和其他人给出的方法,最简单的方法是使用container: $(this)以下属性:

$(selectorString).each(function () {
  var $this = $(this);
  $this.popover({
    html: true,
    placement: "top",
    container: $this,
    trigger: "hover",
    title: "Popover",
    content: "Hey, you hovered on element"
  });
});
Run Code Online (Sandbox Code Playgroud)

我想在这里指出,这种情况下的弹出窗口将继承当前元素的所有属性。因此,例如,如果您对.btn元素(bootstrap)执行此操作,您将无法选择 popover 内的文本。只是想记录下来,因为我花了很长时间在这个问题上。


小智 5

这是我设计的一种解决方案,看起来效果很好,同时还允许您使用常规的Bootstrap实现打开所有弹出窗口。

原始提琴:https : //jsfiddle.net/eXpressive/hfear592/

移植到这个问题:

<a href="#" id="example" class="btn btn-danger" rel="popover" >hover for popover</a>

$('#example').popover({
    html : true,
    trigger : 'hover',
    content : function() {
        return '<div class="box"></div>';
    }
}).on('hide.bs.popover', function () {
    if ($(".popover:hover").length) {
      return false;
    }                
}); 

$('body').on('mouseleave', '.popover', function(){
    $('.popover').popover('hide');
});
Run Code Online (Sandbox Code Playgroud)