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()メソッドを介してこれを行います。しかし、バインドに使用するイベントは何ですか?ブートストラップ.tooltip()をjquery .live()に接続する方法がわからないだけです。

この作業を行う1つの方法は次のようなものです。

/* 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()行を呼び出しています。では、ページが最初に読み込まれてセレクターに一致するときに存在する要素は、ツールチップで2回表示されるのでしょうか。

私はこのアプローチで何の問題も見ていません。私は、行動のベストプラクティスまたは理解を求めています。


うーん良い質問です、これは役に立ちますか?github.com/twitter/bootstrap/issues/2374
Tim

おもしろい読み物ですが、私は単一のタイプのツールチップだけを望んでいます。ツールチップセレクターに一致する動的に追加される要素が確実に追加されるようにしたいのですが、そうではありません。
durden2.0

3
すばらしい質問です。ツイッターのオーバーサイトのようです。
ルーク、あいまいさ

1
@ durden2.0クリスチャンはあなたのためにどのように答えましたか?正しいものとして受け入れますか?
Ruslansウラロフス

3
あなたの質問にはあまり関係ありませんが... rel属性を乗っ取るのは悪いスタイルだと思います。これは非セマンティックで、10年以上前にハッキングとして発生しました。現在、数年前に戻ったすべてのブラウザーはdata-*属性をサポートしており、それらを使用しない理由はもうありません。
T Nguyen 14

回答:


513

これを試してください:

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

4
すごい。これは正解です。これは、基本的にlive / onの代用であるためです。
Mahn、2012


5
このソリューションについて私が気に入らないのは、ツールチップを複数設定できないことです。たとえば、ツールチップが上に配置され、他のツールチップが下に配置されている場合は機能しません。
barbolo 2012

7
@barbolo、構成ごとに異なるセレクターを使用するだけです。これが正しい解決策です。ところで、それはポップオーバーでも動作します。
Enrico Carlesso 2012

16
ブートストラップ3は$( 'body')。tooltip({selector: '[data-toggle = tooltip]'});を使用します。
MERTDOĞAN2014年

148

初期化する複数のツールチップ構成がある場合、これは私にはうまくいきます。

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

次に、data属性を使用して個々の要素にプロパティを設定できます。


3
素晴らしいヒント。$( "body")。tooltip({selector: '[data-toggle = "tooltip"]'});に変更する必要がありました。
Jafin 2013

2
これは、Bootstrap 3での使用方法です。
厳しい2014年

すごい!テーブル内で使用するには、余分な幅を避けるために 'body'コンテナーを追加します。
shock_gone_wild 2016年

これは本当にうまくいきます。私は動的テーブルでたくさんのものを試しましたが、これまで実際には何も機能しませんでした。
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:ドキュメント準備完了イベントで実行されるコードは1行だけ必要です。

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

他の回答で提案されている他のより複雑なコードは必要ないようです(私はこれをBootstrap 3.0でテストしました)。


1
これが最良の答えです。
Chris Marisic

これは私の場合にはうまくいきました。Tablesorter 2.26.2でテーブルを使用し、Ajax呼び出しを介して値を設定しました。問題は、htmlツールチップがレンダリングされた出力ではなく、HTMLテキストとして表示されることでした。これは、私にとって最初に機能した唯一のソリューションです。+1とたくさんの感謝!
Anurag 2017年

8

私にとって、このjsはで発生する同じ問題を再現します Paola

私の解決策:

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

2

フルボディで検索するのではなく。私はこのようなシナリオですでに利用可能な動的なタイトルオプションを使用することができると思います:

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

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.