ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用带有 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() 方法来做到这一点。但是,我用来绑定的事件是什么?我只是不确定如何将引导程序 .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
这是一个有趣的阅读,但我只想要一种类型的工具提示。我只想确保添加任何与工具提示选择器匹配的动态添加的元素,但事实并非如此。
好问题。似乎是 twitter 的过度网站。
@durden2.0 基督徒的回答对你有什么帮助?愿意接受正确吗?
与您的问题并不真正相关,但是...我发现劫持 rel 属性的方式很糟糕。这是非语义的,并且起源于十多年前作为黑客。如今,几年前的每个浏览器都支持 data-* 属性,没有更多理由不使用它们。

C
Christian Strang

试试这个:

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

伟大的。这是正确的答案,因为它基本上是 live/on 的替代品。
我不喜欢这个解决方案的是你不能有多个工具提示配置。例如,如果您的工具提示位于顶部而其他工具提示位于底部,则它不起作用。
@barbolo,只需为不同的配置使用不同的选择器。这是正确的解决方案。顺便说一句,它也适用于 Popover。
引导 3 使用 $('body').tooltip({selector:'[data-toggle=tooltip]'});
N
Nobody

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

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

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


很棒的小费。我不得不将其更改为 $("body").tooltip({ selector: '[data-toggle="tooltip"]' });
这就是 Bootstrap 3 应该有的样子。太好了!
伟大的!在表格内使用时添加容器:'body' 以避免额外的宽度。
这真的很好用。我在动态表上尝试了一大堆东西,但在此之前没有任何效果。
也适用于 Bootstrap 4!
P
Paola Cerioli

对我来说,只捕获 mouseenter 事件有点麻烦,并且工具提示没有正确显示/隐藏。我不得不写这个,现在它工作得很好:

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

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

这对于现场为什么 .on('hover') 不能正常工作非常有帮助。
这就是我实现使用handlebars.js所需的全部内容。如果我没有使用 handlebars.js,那么接受的答案也有效。
这就是我曾经这样做的方式,但是我认为您会失去很多选项,例如悬停延迟,您需要手动实现这些选项。
C
Community

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

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

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

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


这是最好的答案。
这适用于我的情况。我使用了一个带有 Tablesorter 2.26.2 的表,并通过 Ajax 调用填充了值。问题是 html 工具提示显示为 HTML 文本而不是呈现的输出。这是第一次对我有用的唯一解决方案。 +1 非常感谢!
C
Community

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

我的解决方案:

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

J
Jaskaran Singh

而不是在全文中搜索它。我认为可以只使用在这种情况下已经可用的动态标题选项:

$btn.tooltip({
  title: function(){
    return $(this).attr('title');
  }
});

m
mattgi

我发现这些答案的组合给了我最好的结果 - 允许我仍然定位工具提示并将其附加到相关容器:

$('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>

W
Webucator

在不使用 jQuery 的 Bootstrap 5 中,您可以这样做:

const btn = document.createElement('button'); btn.innerHTML = '点击我'; btn.dataset['toggle'] = '工具提示'; btn.dataset['placement'] = 'top'; btn.title = '你的工具提示在这里';新的引导程序。工具提示(btn); document.getElementById('parent').appendChild(btn);