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.


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

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 .


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

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).


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

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

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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.