如何将Twitter Bootstrap工具提示绑定到动态创建的元素?


277

我正在使用带有JavaScript的Twitter引导工具提示,如下所示:

$('a[rel=tooltip]').tooltip();

我的标记如下所示:

<a rel="tooltip" title="Not implemented" class="btn"><i class="icon-file"></i></a>

效果很好,但是我<a>动态添加了元素,而那些动态元素没有显示工具提示。我知道这是因为在完成典型的jquery $(document).ready(function()功能的文档加载后,我只绑定一次.tooltip()。

如何将其绑定到动态创建的元素?通常我会通过jquery live()方法来做到这一点。但是,我用来绑定的事件是什么?我只是不确定如何将bootstrap .tooltip()与jquery .live()挂钩。

我发现一种使这项工作可行的方法是这样的:

/* Add new 'rows' when plus sign is clicked */
$("a.add").live('click', function () {
    var clicked_li = $(this).parent('li');
    var clone = clicked_li.clone();

    clone.find(':input').each(function() {
        $(this).val('');
    });

    clicked_li.after(clone);
    $('a[rel=tooltip]').tooltip();
});

这行得通,但似乎有点骇人听闻。我还在$(ready)调用中调用完全相同的.tooltip()行。那么,页面首次加载并与该选择器匹配时存在的元素是否以工具提示两次结束?

我认为这种方法没有任何问题。我只是在寻找最佳实践或对行为的理解。


嗯,好问题,对您有帮助吗?github.com/twitter/bootstrap/issues/2374
Tim

这是一个有趣的读物,但是我只想要一种类型的工具提示。我只想确保添加任何与工具提示选择器匹配的动态添加的元素,事实并非如此。
durden2.0

3
好问题。似乎是Twitter上的一个网站。
默默无闻的卢克(Luke The Obscure)

1
@ durden2.0基督徒如何为您工作?愿意接受正确吗?
Ruslans Uralovs 2012年

3
确实与您的问题无关,但是...我发现劫持该rel属性的方式很糟糕。这是非语义的,起源于十多年前。如今,追溯到几年前的每个浏览器都支持data-*属性,没有更多的理由不使用它们。
T Nguyen

Answers:


513

试试这个:

$('body').tooltip({
    selector: '[rel=tooltip]'
});

4
大。这是正确的答案,因为它基本上是现场直播的替代品。
Mahn 2012年


5
我对此解决方案不满意的是,您不能对工具提示进行多种配置。例如,如果您将工具提示放在顶部而其他工具放在底部,则此方法将不起作用。
barbolo 2012年

7
@barbolo,只需对不同的配置使用不同的选择器。这是正确的解决方案。顺便说一句,它也可以与Popover一起使用。
Enrico Carlesso 2012年

16
引导程序3使用$('body')。tooltip({selector:'[data-toggle = tooltip]'});
MERTDOĞAN2014年

148

如果您要初始化多个工具提示配置,那么这对我来说效果很好。

$("body").tooltip({
    selector: '[data-toggle="tooltip"]'
});

然后,您可以使用data属性在单个元素上设置属性。


3
大提示。我不得不将其更改为$(“ body”)。tooltip({选择器:'[data-toggle =“ tooltip”]'});
Jafin 2013年

2
这就是Bootstrap 3的样子。太好了!
2014年

大!为在表格内使用而添加容器:'body'以避免多余的宽度。
shock_gone_wild '16

这真的很好。我在动态表上尝试了一堆东西,但是直到这之前,什么都没有真正起作用。
AnBisw

同样适用于Bootstrap 4!
Eugene Kulabuhov

17

对我来说,仅捕获mouseenter事件有点麻烦,并且工具提示未正确显示/隐藏。我必须编写此代码,并且现在可以正常运行:

$(document).on('mouseenter','[rel=tooltip]', function(){
    $(this).tooltip('show');
});

$(document).on('mouseleave','[rel=tooltip]', function(){
    $(this).tooltip('hide');
});

3
对于.on('hover')无法正常工作的原因,这在现场非常有用。
亚当

这是我使用handlebars.js的实现所需要的全部内容。如果我不使用handlebars.js,那么接受的答案也可以。
HPWD

这就是我以前这样做的方式,但是您失去了很多选项,例如悬停延迟,而我认为您需要手动实现。
DavidScherer

16

我在这里发布了更长的答案:https : //stackoverflow.com/a/20877657/207661

TL; DR:您只需要在文档就绪事件中运行的一行代码即可:

$(document.body).tooltip({ selector: "[title]" });

其他答案中建议的其他更复杂的代码似乎没有必要(我已经在Bootstrap 3.0中进行了测试)。


1
这是最好的答案。
克里斯·马里西奇

这适用于我的情况。我在Tablesorter 2.26.2中使用了一个表,并通过Ajax调用填充了值。问题是html工具提示显示为HTML文本而不是呈现的输出。这是一开始对我有用的唯一解决方案。+1,非常感谢!
阿努拉格(Anurag)

8

对我来说,这个js重现了Paola发生的相同问题

我的解决方案:

$(document.body).tooltip({selector: '[title]'})
.on('click mouseenter mouseleave','[title]', function(ev) {
    $(this).tooltip('mouseenter' === ev.type? 'show': 'hide');
});


1

我发现这些答案的组合给了我最好的结果-使我仍然可以放置工具提示并将其附加到相关的容器上:

$('body').on('mouseenter', '[rel=tooltip]', function(){
  var el = $(this);
  if (el.data('tooltip') === undefined) {
    el.tooltip({
      placement: el.data("placement") || "top",
      container: el.data("container") || false
    });
  }
  el.tooltip('show');
});

$('body').on('mouseleave', '[rel=tooltip]', function(){
  $(this).tooltip('hide');
});

相关HTML:

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.