74

我已经彻底搜索过 StackOverflow 和谷歌,但结果都是空的。因此,如果已经提出并解决了这个问题,请提前道歉。

注意:我是 jQuery 的新手,所以我不确定如何自己编写。我确信这是一个简单的代码片段,但我无法理解它。

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

jQuery:

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

HTML:

<a href="" rel="popover" data-class="dynamic-class" title="Title goes here" data-content="Content goes here">

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

<div class="popover ... dynamic-class">
    <!-- remainder of the popover code as per usual -->
</div>

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

提前感谢您的所有回复!

4

22 回答 22

75

您可以通过从调用者获取弹出框对象data并访问其$tip属性来执行此操作,而无需破解 Bootstrap 并且无需更改模板。

$('a[rel=popover]')
  .popover({ placement: 'bottom', trigger: 'hover' })
  .data('bs.popover')
  .tip()
  .addClass('my-super-popover');
于 2013-09-10T11:13:43.113 回答
55

在 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>'
});
于 2013-02-14T04:27:15.857 回答
22

根据@bchhun 写的内容和很多挠头,我觉得我应该回答我自己的问题,因为我已经开始工作了。我还注意到这已被收藏和喜欢,所以我希望我能帮助像我这样的 jQuery 新手。

在当前的 Bootstrap 构建 [v2.1.0] 中,所有脚本都已合并。因此,如果您在构建中包含了所有脚本(并且没有编辑任何新行/删除了一些),那么请转到未.js压缩文件的第 1108 行。您将找到以下代码:

$tip
  .css(tp)
  .addClass(placement)
  .addClass('in')

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

  .addClass(this.$element.attr("data-class"))

因此,现在每当您添加data-class到 popover 调用时,它都会将属性添加到<div class="popover">div。

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

于 2012-08-30T12:52:19.997 回答
18

它是一个旧帖子,但我将其添加为参考。修改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>
    });
});

希望这可以帮助 :)

于 2013-01-16T08:43:22.580 回答
14

仅将该类添加到适当的弹出框而不针对其他人如何?

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

或一些变体,例如从“someElement”的数据中获取自定义类名,如下所示:

$('#someElement').popover({placement: function(context, src) {
    $(context).addClass($(src).data('customClassName'));
    return 'top';
});
于 2013-11-09T12:14:08.497 回答
10

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

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

希望这可以帮助...

于 2013-06-17T00:07:26.080 回答
8

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

我的解决方案很简单,与标记的答案有点相同——我认为 popover 是库的扩展tooltip.js。我的意思是-检查一下,源代码只有一百多行。所以我创建了一个名为 的文件popover-extend.js,并将整个 popover 源代码复制粘贴到其中。从那里很容易 - 简单地操作这些行:

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

然后:

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

现在你可以这样做:

<a href="#" rel="popover" 
   data-cls="dynamic-class" 
   title="Title goes here" data-content="Content goes here">

如果您像我一样想要添加更多功能,这是一个非常好的方法。例如,这是我向标题添加通用关闭按钮的方式(尽管它要求弹出框具有指定的 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);
}

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

希望这可以帮助任何寻找替代操作源代码的人

于 2014-03-16T09:03:57.997 回答
5

我有同样的问题,我喜欢@Kate 的回答,但是源文件的更改将来会产生很多问题,当您更新引导程序的版本时,您可能会忘记这些小更改。所以我找到了另一种方法:

 $(element).popover({...}).data("popover").tip().addClass("your_class")

作为@CorayThan 修复它data("popover")

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

于 2013-05-31T14:26:07.790 回答
3

这里已经很晚了,我已经累了,但是如果您决定更新 bootstrap 的 js 文件,这里有一个快速的单行程序,将来将无法使用。

看看这个gist第 150 行的 bootstrap-tooltip.js 文件。

这是修改后的工具提示:

这是修改后的工具提示

查看下方的检查器窗口,您会注意到动态类已添加到工具提示中。

明天我会发布一个更长期和适当的答案。

于 2012-08-29T04:14:54.457 回答
2

这对我有用。它的灵感来自此处的引导程序文档,即事件部分。

$("a[rel=popover]").popover().on("show.bs.popover", function(){
    $(".popover").addClass("your-custom-class");
});
于 2013-10-14T15:51:39.993 回答
2

您也可以使用“模板”选项

$element.popover({                               
   html: true,
   trigger: 'click',
   template: '<div class="popover '+MY_CLASS+'" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
   content: function() {
    return 'hello';
   }
});

从您的数据类属性更新 MY_CLASS。

于 2015-01-30T07:01:12.603 回答
2

您可以使用该container选项来解决此问题。

$('[data-toggle="popover"]').popover({
    container: '#foo'
});

或通过标签属性设置

<a href="#" data-toggle="popover" data-container="#foo" data-content="Content">Foo</a>

并在关闭body标签之前添加它

<div id="foo"></div>

然后你可以做类似的事情#foo > .popover。我知道这不是一个万能的解决方案,但它是一种方法。

于 2016-12-02T03:07:43.790 回答
1

这从外部扩展您的类bootstrap core class,只需将属性data-class和选项添加dataClass:到您的tooltip函数中

!function($){   
    $.extend($.fn.tooltip.Constructor.DEFAULTS,{
        dataClass: false
    }); 
    var Tooltip = $.fn.tooltip.Constructor;
        _show = Tooltip.prototype.show;

    Tooltip.prototype.show = function (){
        _show.apply(this,Array.prototype.slice.apply(arguments));

        if (this.options.dataClass!=="undefined" && this.options.dataClass){
            var that = this;
            var $tip = this.tip();
            if (this.$element.attr("data-class") !== undefined)
                $tip.addClass(this.$element.attr("data-class"));
        }
    };
}(jQuery);
于 2015-02-11T03:51:26.417 回答
1

对于 bootstrap v3.3.2,您可以在 bootstrap.js 上找到这些行

   $tip
    .detach()
    .css({ top: 0, left: 0, display: 'block' })
    .addClass(placement)
    .data('bs.' + this.type, this)

然后你添加这一行

    .addClass(this.$element.attr("data-class")) 

现在要在您的 popover 元素上添加一个类,您只需放置一个属性, data-class="classexemple"然后一切正常

在www.mixpres.com上找到我们

于 2015-05-06T19:22:36.310 回答
1

在 Bootstrap 4 中,您可以使用以下data-template属性:

<button data-toggle="popover" data-template='<div class="popover MYSUPERCLASS" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' data-offset="-10 0" data-html="true" data-trigger="focus" data-placement="bottom" data-content='My Popover'>Button</button>
于 2017-03-10T10:32:54.303 回答
1
$('a[rel=popover]')
  .popover({ placement: 'bottom', trigger: 'hover' })
  .data('bs.popover')
  .addAttachmentClass('my-own-popover')

您将在元素中获得bs-popover-my-own-popover类。.popover

于 2018-07-27T11:48:48.747 回答
1

这个问题的最佳解决方案是扩展 popover 并构建您自己的 Popover 版本。下面是代码,它基于引导版本 3.3.7

        (function($){
            var PopoverEx = function(element, options){
                this.init('popover', element, options);
            }

                PopoverEx.prototype = $.extend({}, $.fn.popover.Constructor.prototype, {

                    constructor: PopoverEx,
                    tip: function(){
                        if(!this.$tip){
                            this.$tip = $(this.options.template);
                            if(this.options.modifier) this.$tip.addClass(this.options.modifier);
                        }
                        return this.$tip; 
                    }       
                });

            $.fn.popoverex = function(option){
               return this.each(function () {
                var $this   = $(this)
                var data    = $this.data('bs.popover')
                var options = typeof option == 'object' && option

                if (!data && /destroy|hide/.test(option)) return
                if (!data) $this.data('bs.popover', (data = new PopoverEx(this, options)))
                if (typeof option == 'string') data[option]()
              })
            }
        })(window.jQuery);

用法

HTML 代码

    <a href="#" class="btn btn-large btn-danger" 
          rel="popover" 
          data-modifier="popover-info" 
          title="A Title" 
          data-content="And here's some amazing content.right?">Hover for popover</a>   

JS脚本

    jQuery(document).ready(function($) {
        $('[rel="popover"]').popoverex();
    });

您可以从这个 git 页面 https://gist.github.com/vinoddC/475669d94e97f4d7b6bcfde4cef80420找到完整版本和描述

这是布赖恩伍德沃德作品的更新版本。

于 2018-09-08T07:09:39.010 回答
1

我知道这个线程很旧,但是对于那些像我一样偶然发现这篇文章的人来说,这是另一种允许更多自定义的方法。我没有用 Bootstrap 4 测试过,但是用 Bootstrap 3 测试过。

您可以使用自定义数据属性通过 html 元素将 css 类“提交”到弹出窗口,而不是在函数中硬编码类。在本例中,我将该属性称为“数据类”。

由于此方法利用了弹出框“放置”选项可用的功能,因此我将其配置为保留弹出框中配置的原始放置。

jQuery( '[data-toggle="popover"]' ).popover({

    container: 'body',

    placement: function ( popover, trigger ){

        // Get the submitted placement for the popover
        var placement = jQuery( trigger ).attr( 'data-placement' );

        // Get the class(es) to apply to the popover
        var dataClass = jQuery( trigger ).attr( 'data-class' );

        // Apply the submitted class(es) to the popover element
        jQuery( popover).addClass( dataClass );

        // Return the original placement for the popover
        return placement;

        },

        trigger: 'hover'

});

我希望这有帮助。如果有人有更好或更清洁的方法,我很乐意学习:)

于 2020-06-15T08:56:17.600 回答
0

对不起,但不太明白你的问题......但你想要的是添加一个父div?放轻松......看看这是不是你想要的:

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

演示:http: //jsfiddle.net/PRQfJ/

于 2012-08-29T04:21:04.887 回答
0

适用于每个版本的 BS 的最佳选择是将其放入特定的类中,然后在显示该类后,找到该类,并将您的类名添加到它的 popover 父级

// create a template that add the message inside
var $tmp = $("<div class='popoperrormessage'>" + error + "</div>");


            $(this).popover("destroy").popover({
                trigger: "manual",
                animation: false,
                html: true,
                placement:"right",
                content: $tmp,
                container: "body"
            }).popover("show");


            // now we have to find the parent of the popoperrormessagemessage
            $(".popoperrormessage").parents(".popover").addClass("hello");

现在你的弹出窗口将有hello

于 2014-05-21T10:01:29.720 回答
0

这是我的解决方法,可能不是最有效的,但我发现它最容易实现。

 $('[data-content]').each(function(){
    var options = {
        html: true //optional
    };

    if ($(this)[0].hasAttribute('data-class')) {
        options['template'] = '<div class="popover" role="tooltip ' + $(this).attr('data-class') + '"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>';
    }

    $(this).popover(options);
});

只需像其他示例一样添加data-class="custom-class"到元素中。

于 2016-05-19T18:55:31.330 回答
-1

我不确定你为什么要这样做,但在我的例子中,我只是想设置自定义样式......所以在 CSS 中只是为当前弹出框编写了正确的选择器。a.rating-popover - 这是我打开 popover 的链接。-> popover 元素将生成到该元素的下一个元素。所以我们可以选择它

a.rating-popover + div.popover{
   background: blue;
}

瞧,蓝色背景。仅适用于使用 a.rating-popover 元素打开的弹出框。

于 2013-05-01T13:20:31.580 回答