动态地向Bootstrap的'popover'容器添加一个类

Kat*_*ate 65 css jquery twitter-bootstrap

我已经彻底搜索了StackOverflow和谷歌,但是空洞了.如果已经提出并已经解决了这个问题,请提前道歉.

NB:我是jQuery的新手,所以我不确定如何自己写这个.我确信这是一个简单的代码片段,但无法绕过它.

我要做的是使用一个data-元素(例如:data-class或类似的)将一个新类(或ID,我不再挑剔!)附加到顶级弹出窗口<div>.我目前的代码如下:

jQuery的:

$('a[rel=popover]')
    .popover({
        placement : 'bottom',
        trigger : 'hover'
    })
    .click(function(e) {
        e.preventDefault()
    });
Run Code Online (Sandbox Code Playgroud)

HTML:

<a href="" rel="popover" data-class="dynamic-class" title="Title goes here" data-content="Content goes here">
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会吐出的HTML类型是这样的:

<div class="popover ... dynamic-class">
    <!-- remainder of the popover code as per usual -->
</div>
Run Code Online (Sandbox Code Playgroud)

这是我能做的吗?弹出窗口的bootstrap网站上的文档有点稀疏,所以我花了一段时间才到达这一点,不幸的是:(

在此先感谢任何和所有回复!

Set*_*ery 67

你可以通过从调用者那里获取popover对象data并访问其$tip属性,而无需破解Bootstrap并且无需更改模板.

$('a[rel=popover]')
  .popover({ placement: 'bottom', trigger: 'hover' })
  .data('bs.popover')
  .tip()
  .addClass('my-super-popover');
Run Code Online (Sandbox Code Playgroud)

  • 在v2.3.1中,`$ tip`应该用`tip()`替换 (7认同)
  • 就像下面说的tranver一样,在较新的Boostrap中你需要使用`bs.popover`和`tip()`,比如`$(element).popover({...}).data("bs.popover"). ()` (3认同)
  • 这应该是这个问题的答案 (3认同)
  • 请注意,数据名称在Bootstrap 3中更改为"bs.popover". (2认同)
  • 是的,因为`.data(...)`检索第一个匹配项的数据值.如果要设置所有元素,可以使用每个`.each(function(){$(this).data('bs.popover').tip.addClass('my-super-popover');}) `或者映射`.map(function(){return $(this).data('bs.popover').tip;}).addClass('my-super-popover');` (2认同)
  • 我已经升级到 **Bootstrap4**,它的工作原理是:`$('[data-toggle="popover"]') .each(function() { $($(this).popover('show') 。 popover('hide') .data('bs.popover') .tip ).addClass('custom-large-popover'); }); ` 一些说明: 由于 **tip** 返回 dom 元素,我们需要将其包装在一个 jQuery 对象中: `$(element returns by tip).addClass()` 奇怪的是,如果没有显示 popover,提示元素未初始化,所以我显示它并隐藏它。其他方法非常受欢迎! (2认同)

cba*_*rri 47

在版本2.3中还有另一种方法可以实现这一点.您可以覆盖默认模板以将类包含到容器中.

var pop = $('a', this.el).popover({
  trigger: 'click'
  , template: '<div class="popover awesome-popover-class"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
});
Run Code Online (Sandbox Code Playgroud)


Kat*_*ate 22

基于@bchhun所写的内容和大量的头脑,我觉得我应该回答我自己的问题,因为我开始工作了.我也注意到这一点很受欢迎和喜欢,所以我希望我能像其他人一样帮助jQuery的新手.

在当前的Bootstrap构建[v2.1.0]中,脚本都是合并的.因此,如果您已在构建中包含所有脚本(并且未编辑任何新行/取出一些),则转到未缩小.js文件的第1108行.你会发现以下代码:

$tip
  .css(tp)
  .addClass(placement)
  .addClass('in')
Run Code Online (Sandbox Code Playgroud)

你将要为此添加一个新行,即:

  .addClass(this.$element.attr("data-class"))
Run Code Online (Sandbox Code Playgroud)

所以现在每当你添加data-class到popover调用时,它都会将属性添加到<div class="popover">div中.

现在我看到它,它是如此明显:)

  • 如果有人将此作为拉取请求提交,那将会很棒. (3认同)

小智 16

它是一个旧帖子,但我只是作为参考添加它.修改Shankar Cabus的答案,而不是将动态类添加到父级,它将添加到创建的.popover div中.

$(function(){
    $('a[rel=popover]')
    .popover({
        placement : 'bottom',
        trigger : 'hover'
    })
    .on("hover", function(){
        $('.popover').addClass($(this).data("class")); //Add class .dynamic-class to <div>
    });
});
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)

  • 我知道这是很久以前的事了,但仅供参考 - 这与我最初的问题无关,所以无论如何它都没有帮助.我想为每个单独的popover分别使用单独的类,而不是所有popovers的一个通用类.因此,为什么我创建了一个新的数据元素.我能理解这对其他人有什么帮助,但这与我最初的要求无关. (3认同)
  • +1而不是破解核心,这使得更难以使插件保持最新状态,这是最好的情况. (2认同)

kde*_*nte 9

只需在初始化工具提示时设置隐藏的"模板"选项.我不知道为什么引导团队会保守这个秘密......

$(elem).popover({
    template: '<div class="popover YOURCLASS"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
}).popover('show');
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...


Jan*_*iec 8

如何将该类仅添加到适当的popover,而不是针对其他人?

$('#someElement').popover({placement: function(context, src) {
    $(context).addClass('my-custom-class');
    return 'top'; // - 'top' placement in my case
});
Run Code Online (Sandbox Code Playgroud)

或者某些变体,比如从'someElement'的数据中获取自定义类名,如下所示:

$('#someElement').popover({placement: function(context, src) {
    $(context).addClass($(src).data('customClassName'));
    return 'top';
});
Run Code Online (Sandbox Code Playgroud)

  • 我认为这确实是最简单,最直接的答案,无需修改模板或使用`.tip()`。我喜欢它,因为它可以让我使用.popover的`trigger:'manual'`和`.show()`而没有任何其他问题。 (2认同)

yuv*_*uvi 8

这是几年前提出来的,而且有很多答案.但是......我最近不得不自己解决同样的问题,我 - (a)想避免操纵源代码,(b)需要一个通用的解决方案不断重复使用(所以使用template: '...'每个初始化的解决方案都没有).

我的解决办法很简单,而且是那种一样明显的答案-我想通酥料饼是一个扩展了的tooltip.js库.我的意思是 - 检查一下,源代码只有不到一百行.所以我创建了一个名为的文件popover-extend.js,并将整个popover源代码复制粘贴.从那里很容易 - 简单操作这些行:

Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    // add this:
    cls: ''
});
Run Code Online (Sandbox Code Playgroud)

然后:

Popover.prototype.setContent = function () {
    // add this:
    if (this.options.cls) {
        $tip.addClass(this.options.cls);    
    }
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

<a href="#" rel="popover" 
   data-cls="dynamic-class" 
   title="Title goes here" data-content="Content goes here">
Run Code Online (Sandbox Code Playgroud)

如果你像我一样想要添加更多功能,这是一个非常好的方法.例如,这是我如何在标题中添加一个通用关闭按钮(虽然它要求popover具有指定的id):

// added this to the the DEFAULTS
close: ''


// added this to the setContent function
if (this.options.close) {
    var id = this.$element.attr('id'),
        btn = $("<button></button>", {
            "class": "close",
            "id": "close",
            "onclick": "$('#"+id+"').popover('hide');"
    }),

    title = $tip.find('.popover-title');

    btn.html("&times;");
    btn.appendTo(title);
}
Run Code Online (Sandbox Code Playgroud)

关于它的一个很酷的事情是,您在DEFAULTS中设置的所有内容都可以通过html进行配置,即如果您添加一个名为的变量foo,您将自动能够通过它进行操作data-foo=.

希望这有助于任何人寻找操作源代码的替代方案

  • 只想指出任何人重新寻找这样的解决方案; 我的这个问题在2012年8月被问到(当我们使用Bootstrap 2.3版时我相信).事情变了..!感谢您为最新的Bootstrap版本(3.1.1)添加解决方案. (2认同)

Jef*_*res 5

我有同样的问题,我喜欢@Kate的答案,但是源文件中的更改将来会产生很多问题,当你更新bootstrap的版本时,你可能会忘记这些小改动.所以我找到了另一种方法:

 $(element).popover({...}).data("popover").tip().addClass("your_class")
Run Code Online (Sandbox Code Playgroud)

正如@CorayThan修复它 data("popover")

popover 的方法tip()返回popover元素,并在未创建时创建,因此即使您处于popover的初始化(这是我的情况= D),您也将始终获得正确的popover元素.

  • 这对我不起作用.创建popover,然后使用`$(element).data('popover').tip().addClass("your_class");`确实有效. (2认同)