Come associare i suggerimenti di Bootstrap di Twitter a elementi creati dinamicamente?


277

Sto usando le descrizioni dei bootstrap di Twitter con javascript come il seguente:

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

Il mio markup è simile al seguente:

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

Funziona bene, ma aggiungo <a>elementi in modo dinamico e le descrizioni dei comandi non vengono visualizzate per quegli elementi dinamici. So che è perché rilevo .tooltip () solo una volta quando il documento è finito caricato con la tipica $(document).ready(function()funzionalità jquery .

Come posso associarlo a elementi creati dinamicamente? Di solito lo farei tramite il metodo jquery live (). Tuttavia, qual è l'evento che utilizzo per associare? Non sono sicuro di come collegare il bootstrap .tooltip () con jquery .live ().

Ho trovato un modo per far funzionare questo è qualcosa del genere:

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

Funziona, ma sembra un po 'hacker. Sto anche chiamando la stessa identica linea .tooltip () nella chiamata $ (pronto). Quindi, gli elementi che esistono quando la pagina viene caricata per la prima volta e corrispondono a quel selettore finiscono due volte con la descrizione comando?

Non vedo alcun problema con questo approccio. Sto solo cercando una migliore pratica o comprensione del comportamento.


hmm buona domanda, questo ti aiuterà? github.com/twitter/bootstrap/issues/2374
Tim

È una lettura interessante, ma desidero solo un singolo tipo di tooltip. Voglio solo assicurarmi che tutti gli elementi aggiunti dinamicamente che corrispondono al selettore della descrizione comandi vengano aggiunti, il che non è il caso.
durden2.0

3
Ottima domanda Sembra un sito secondario da parte di Twitter.
Luke The Obscure,

1
@ durden2.0 In che modo la risposta dei cristiani ha funzionato per te? Vuoi accettare come corretto?
Ruslans Uralovs,

3
Non proprio correlato alla tua domanda ma ... Trovo che sia un cattivo stile dirottare l' relattributo. Questo non è semantico ed è stato originato oltre un decennio fa come un hack. Al giorno d'oggi, ogni singolo browser che risale a diversi anni supporta gli data-*attributi e non c'è più motivo per non usarli.
T Nguyen,

Risposte:


513

Prova questo:

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

4
Grande. Questa è la risposta corretta, perché è sostanzialmente il sostituto di live / on.
Mahn,


5
Quello che non mi piace di questa soluzione è che non puoi avere più configurazioni di tooltip. Ad esempio, non funziona se si dispone di descrizioni comandi posizionate in alto e altre posizionate in basso.
barbolo,

7
@barbolo, usa semplicemente diversi selettori per diverse configurazioni. Questa è la soluzione giusta A proposito, funziona anche con Popover.
Enrico Carlesso,

16
bootstrap 3 usa $ ('body'). tooltip ({selector: '[data-toggle = tooltip]'});
MERT DOĞAN,

148

Se hai più configurazioni di tooltip che vuoi inizializzare, questo funziona bene per me.

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

È quindi possibile impostare la proprietà su singoli elementi utilizzando gli dataattributi.


3
Ottimo consiglio Ho dovuto cambiarlo in $ ("body"). Tooltip ({selector: '[data-toggle = "tooltip"]'});
Jafin,

2
Ecco come dovrebbe essere con Bootstrap 3. Fantastico!
cupo

grande! per l'uso all'interno di una tabella aggiungere il contenitore: 'body' per evitare una larghezza extra.
shock_gone_wild

Funziona davvero bene. Ho provato un sacco di cose su un tavolo dinamico ma nulla ha funzionato fino a questo momento.
AnBisw,

Funziona anche con Bootstrap 4!
Eugene Kulabuhov,

17

Per me, solo catturare l'evento mouseenter era un po 'difettoso e la descrizione comandi non veniva mostrata / nascosta correttamente. Ho dovuto scrivere questo, e ora funziona perfettamente:

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

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

3
Questo è stato molto utile nonostante il motivo per cui .on ('hover') non avrebbe funzionato bene.
Adam,

Questo era tutto ciò che dovevo usare per la mia implementazione dell'uso di handlebars.js. Se non stavo usando handlebars.js, anche la risposta accettata ha funzionato.
HPWD,

Questo è il modo in cui lo facevo, ma perdi molte opzioni come ritardi al passaggio del mouse che dovresti implementare manualmente con questo, credo.
DavidScherer

16

Ho pubblicato una risposta più lunga qui: https://stackoverflow.com/a/20877657/207661

TL; DR: è necessaria solo una riga di codice che viene eseguita nell'evento pronto per il documento:

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

Non sembra necessario altro codice più complicato suggerito in altre risposte (l'ho provato con Bootstrap 3.0).


1
Questa è la risposta migliore
Chris Marisic,

Questo ha funzionato per il mio caso. Ho usato una tabella con Tablesorter 2.26.2 e valori popolati tramite chiamata Ajax. Il problema era che la descrizione comandi html veniva mostrata come testo HTML anziché come output di rendering. Questa è l'unica soluzione che ha funzionato per me nel primo tentativo. +1 e molte grazie!
Anurag

8

Per me, questo js riproduce lo stesso problema che si verifica con Paola

La mia soluzione:

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

2

Invece di cercarlo in tutto il corpo. Si potrebbe semplicemente usare l'opzione del titolo dinamico già disponibile in tali scenari penso:

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

1

Ho trovato una combinazione di queste risposte che mi ha dato il miglior risultato, permettendomi di posizionare ancora la descrizione comando e collegarla al contenitore pertinente:

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

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.