Wie binde ich Twitter Bootstrap-Tooltips an dynamisch erstellte Elemente?

277

Ich verwende Twitter-Bootstrap-Tooltips mit Javascript wie folgt:

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

Mein Markup sieht folgendermaßen aus:

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

Dies funktioniert gut, aber ich füge <a>Elemente dynamisch hinzu und die QuickInfos werden für diese dynamischen Elemente nicht angezeigt. Ich weiß, dass ich .tooltip () nur einmal binde, wenn das Dokument mit der typischen jquery- $(document).ready(function()Funktionalität geladen ist.

Wie kann ich dies an dynamisch erstellte Elemente binden? Normalerweise würde ich dies über die Methode jquery live () tun. Was ist jedoch das Ereignis, das ich zum Binden verwende? Ich bin mir nur nicht sicher, wie ich den Bootstrap .tooltip () mit jquery .live () verbinden soll.

Ich habe einen Weg gefunden, diese Arbeit so zu machen:

/* 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();
});

Das funktioniert, scheint aber irgendwie hackisch. Ich rufe auch genau dieselbe .tooltip () -Zeile im $ (ready) -Aufruf auf. Werden die Elemente, die beim ersten Laden der Seite vorhanden sind und mit diesem Selektor übereinstimmen, zweimal mit dem Tooltip angezeigt?

Ich sehe keine Probleme mit diesem Ansatz. Ich bin nur auf der Suche nach einer Best Practice oder einem Verständnis des Verhaltens.

durden2.0
quelle
hmm gute frage, wird das helfen? github.com/twitter/bootstrap/issues/2374
Tim
Das ist eine interessante Lektüre, aber ich möchte nur einen einzigen Tooltip. Ich möchte nur sicherstellen, dass alle dynamisch hinzugefügten Elemente, die mit der QuickInfo-Auswahl übereinstimmen, hinzugefügt werden, was nicht der Fall ist.
Durden2.0
3
Gute Frage. Scheint wie eine Oversite von Twitter.
Luke The Obscure
1
@ durden2.0 Wie haben Christen die Arbeit für Sie beantwortet? Möchtest du das als richtig akzeptieren?
Ruslans Uralovs
3
Nicht wirklich mit Ihrer Frage verbunden, aber ... Ich finde es schlecht, das relAttribut zu entführen . Dies ist nicht semantisch und wurde vor über einem Jahrzehnt als Hack entwickelt. Heutzutage unterstützt jeder einzelne Browser, der mehrere Jahre zurückliegt, data-*Attribute, und es gibt keinen Grund mehr, sie nicht zu verwenden.
T Nguyen

Antworten:

513

Probier diese:

$('body').tooltip({
    selector: '[rel=tooltip]'
});
Christian Strang
quelle
4
Toll. Dies ist die richtige Antwort, da es im Grunde der Ersatz für live / on ist.
Mahn
5
Was mir an dieser Lösung nicht gefällt, ist, dass Sie keine mehrfachen Konfigurationen von Tooltips haben können. Zum Beispiel funktioniert es nicht, wenn Sie Tooltips oben und andere unten haben.
Barbolo
7
@barbolo, verwenden Sie einfach verschiedene Selektoren für verschiedene Konfigurationen. Dies ist die richtige Lösung. Übrigens funktioniert es auch mit Popover.
Enrico Carlesso
16
Bootstrap 3 benutze $ ('body'). tooltip ({selector: '[data-toggle = tooltip]'});
MERT DOĞAN
148

Wenn Sie mehrere Tooltip-Konfigurationen haben, die Sie initialisieren möchten, funktioniert dies gut für mich.

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

Anschließend können Sie die Eigenschaft für einzelne Elemente mithilfe von dataAttributen festlegen .

Rohitmishra
quelle
3
Toller Tipp. Ich musste es in $ ("body") ändern. Tooltip ({selector: '[data-toggle = "tooltip"]'});
Jafin
2
So sollte es mit Bootstrap 3 sein. Großartig!
grimmig
großartig! Für die Verwendung in einer Tabelle fügen Sie den Container hinzu: 'body', um zusätzliche Breite zu vermeiden.
Schock_gone_wild
Das funktioniert wirklich gut. Ich habe eine ganze Reihe von Sachen auf einem dynamischen Tisch ausprobiert, aber bis dahin hat nichts wirklich funktioniert.
AnBisw
Funktioniert auch mit Bootstrap 4!
Eugene Kulabuhov
17

Für mich war es ein bisschen fehlerhaft, nur das Mouseenter-Ereignis zu erfassen, und der Tooltip wurde nicht richtig angezeigt / ausgeblendet. Ich musste das schreiben und es funktioniert jetzt perfekt:

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

$(document).on('mouseleave','[rel=tooltip]', function(){
    $(this).tooltip('hide');
});
Paola Cerioli
quelle
3
Dies war sehr hilfreich, um herauszufinden, warum .on ('Hover') nicht richtig funktioniert.
Adam
Dies war alles, was ich für meine Implementierung der Verwendung von handlebars.js verwenden musste. Wenn ich nicht handlebars.js verwendet habe, hat die akzeptierte Antwort auch funktioniert.
HPWD
So habe ich das früher gemacht, aber Sie verlieren viele Optionen wie Schwebeverzögerungen, die Sie meiner Meinung nach manuell implementieren müssten.
DavidScherer
16

Ich habe hier eine längere Antwort gepostet: https://stackoverflow.com/a/20877657/207661

TL; DR: Sie benötigen nur eine Codezeile, die im dokumentenbereiten Ereignis ausgeführt wird:

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

Anderer komplizierterer Code, der in anderen Antworten vorgeschlagen wird, scheint nicht notwendig zu sein (ich habe dies mit Bootstrap 3.0 getestet).

Shital Shah
quelle
1
Dies ist die beste Antwort.
Chris Marisic
Das hat bei meinem Fall funktioniert. Ich habe eine Tabelle mit Tablesorter 2.26.2 verwendet und Werte über den Ajax-Aufruf ausgefüllt. Das Problem war, dass der HTML-Tooltip als HTML-Text anstelle der gerenderten Ausgabe angezeigt wurde. Dies ist die einzige Lösung, die auf Anhieb für mich funktioniert hat. +1 und vielen Dank!
Anurag
8

Für mich gibt dies das gleiche Problem wieder, das bei Paola auftritt

Meine Lösung:

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

Anstatt es im ganzen Körper zu suchen. Man könnte einfach die dynamische Titeloption verwenden, die in solchen Szenarien bereits verfügbar ist, denke ich:

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

Ich fand, dass eine Kombination dieser Antworten das beste Ergebnis lieferte - so konnte ich den Tooltip weiterhin positionieren und an den entsprechenden Container anhängen:

$('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');
});

Relevantes HTML:

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
mattgi
quelle