¿Cómo enlazo la información sobre herramientas de Bootstrap de Twitter a elementos creados dinámicamente?

277

Estoy usando la información sobre herramientas de arranque de Twitter con javascript como el siguiente:

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

Mi marcado se ve así:

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

Esto funciona bien, pero agrego <a>elementos dinámicamente y la información sobre herramientas no se muestra para esos elementos dinámicos. Sé que es porque solo ato .tooltip () una vez cuando el documento termina de cargarse con la $(document).ready(function()funcionalidad típica de jquery .

¿Cómo puedo vincular esto a elementos creados dinámicamente? Por lo general, haría esto a través del método jquery live (). Sin embargo, ¿cuál es el evento que uso para vincular? Simplemente no estoy seguro de cómo conectar el bootstrap .tooltip () con jquery .live ().

He encontrado una forma de hacer que esto funcione es algo como esto:

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

Esto funciona, pero parece un poco hack. También estoy llamando exactamente la misma línea .tooltip () en la llamada $ (lista). Entonces, ¿los elementos que existen cuando la página se carga por primera vez y coinciden con ese selector terminan con la información sobre herramientas dos veces?

No veo ningún problema con este enfoque. Solo estoy buscando una mejor práctica o comprensión del comportamiento.

durden2.0
fuente
hmm buena pregunta, ¿esto ayudará? github.com/twitter/bootstrap/issues/2374
Tim
Esa es una lectura interesante, pero solo quiero un solo tipo de información sobre herramientas. Solo quiero asegurarme de que se agregue cualquier elemento agregado dinámicamente que coincida con el selector de información sobre herramientas, lo cual no es el caso.
durden2.0
3
Gran pregunta Parece un gran sitio por parte de twitter.
Luke The Obscure
1
@ durden2.0 ¿Cómo respondieron los cristianos el trabajo para usted? Cuidado para aceptar como correcto?
Ruslans Uralovs
3
Realmente no está relacionado con su pregunta, pero ... Me parece un mal estilo secuestrar el relatributo. Esto no es semántico y se originó hace más de una década como un hack. Hoy en día, cada navegador que se remonta varios años atrás soporta data-*atributos y no hay más razón para no usarlos.
T Nguyen

Respuestas:

513

Prueba este:

$('body').tooltip({
    selector: '[rel=tooltip]'
});
Christian Strang
fuente
44
Excelente. Esta es la respuesta correcta, porque es básicamente el sustituto de live / on.
Mahn
55
Lo que no me gusta de esta solución es que no puede tener múltiples configuraciones de información sobre herramientas. Por ejemplo, no funciona si tiene información sobre herramientas que se colocan en la parte superior y otras que se colocan en la parte inferior.
barbolo
77
@barbolo, simplemente use diferentes selectores para diferentes configuraciones. Esta es la solución correcta. Por cierto, funciona también con Popover.
Enrico Carlesso
16
bootstrap 3 use $ ('body'). tooltip ({selector: '[data-toggle = tooltip]'});
MERT DOĞAN
148

Si tiene varias configuraciones de información sobre herramientas que desea inicializar, esto funciona bien para mí.

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

Luego puede establecer la propiedad en elementos individuales utilizando dataatributos.

rohitmishra
fuente
3
Gran consejo Tuve que cambiarlo a $ ("body"). Tooltip ({selector: '[data-toggle = "tooltip"]'});
Jafin
2
Así es como debería ser con Bootstrap 3. ¡Genial!
sombrío
¡Excelente! para usar dentro de una mesa, agregue el contenedor: 'cuerpo' para evitar el ancho adicional.
shock_gone_wild
Esto funciona muy bien Probé un montón de cosas en una tabla dinámica, pero nada funcionó hasta esto.
AnBisw
¡Funciona con Bootstrap 4 también!
Eugene Kulabuhov
17

Para mí, solo detectar el evento mouseenter fue un poco defectuoso, y la información sobre herramientas no se mostraba / ocultaba correctamente. Tuve que escribir esto, y ahora funciona perfectamente:

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

$(document).on('mouseleave','[rel=tooltip]', function(){
    $(this).tooltip('hide');
});
Paola Cerioli
fuente
3
Esto fue muy útil en cuanto a por qué .on ('hover') no funcionaría correctamente.
Adam
Esto fue todo lo que necesitaba usar para mi implementación del uso de handlebars.js. Si no estaba usando handlebars.js, la respuesta aceptada también funcionó.
HPWD
Así es como solía hacer esto, pero creo que pierdes muchas opciones, como retrasos de desplazamiento, que necesitarías implementar manualmente.
DavidScherer
16

He publicado una respuesta más larga aquí: https://stackoverflow.com/a/20877657/207661

TL; DR: solo necesita una línea de código que se ejecute en el evento de documento listo:

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

Otro código más complicado sugerido en otras respuestas no parece necesario (he probado esto con Bootstrap 3.0).

Shital Shah
fuente
1
Esta es la mejor respuesta.
Chris Marisic
Esto funcionó para mi caso. Utilicé una tabla con Tablesorter 2.26.2 y valores poblados a través de la llamada Ajax. El problema era que la información sobre herramientas html se mostraba como texto HTML en lugar de salida representada. Esta es la única solución que me funcionó al principio. +1 y muchas gracias!
Anurag
8

Para mí, este js reproduce el mismo problema que ocurre con Paola

Mi solución:

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

En lugar de buscarlo en todo el cuerpo. Uno podría usar la opción de título dinámico ya disponible en tales escenarios, creo:

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

Encontré que una combinación de estas respuestas me dio el mejor resultado, lo que me permitió posicionar la información sobre herramientas y adjuntarla al contenedor correspondiente:

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

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