Cambie el contenido de la información sobre herramientas de Bootstrap de Twitter al hacer clic

224

Tengo una información sobre herramientas en un elemento de anclaje, que envía una solicitud AJAX al hacer clic. Este elemento tiene información sobre herramientas (de Twitter Bootstrap). Quiero que el contenido de la información sobre herramientas cambie cuando la solicitud AJAX regrese con éxito. ¿Cómo puedo manipular la información sobre herramientas después del inicio?

rebelión
fuente

Respuestas:

411

Acabo de encontrar esto hoy mientras leía el código fuente. Entonces $.tooltip(string)llama a cualquier función dentro de la Tooltipclase. Y si nos fijamos Tooltip.fixTitle, obtiene el data-original-titleatributo y reemplaza el valor del título con él.

Entonces simplemente hacemos:

$(element).tooltip('hide')
          .attr('data-original-title', newValue)
          .tooltip('fixTitle')
          .tooltip('show');

y efectivamente, actualiza el título, que es el valor dentro de la información sobre herramientas.

Otra forma (ver el comentario de @lukmdo a continuación):

$(element).attr('title', 'NEW_TITLE')
          .tooltip('fixTitle')
          .tooltip('show');
Mehmet Duran
fuente
55
¡Gracias! Esto se había desconcertado durante una hora.
ramita
160
O incluso más corto (más suave)$(element).attr('title', 'NEW_TITLE').tooltip('fixTitle').tooltip('show');
lukmdo
55
También puede cambiar el título a través de la propiedad data ('tooltip'). Options
James McMahon
44
No se pudo encontrar documentación sobre 'fixTitle', ¡así que supongo que no es una buena idea usar esto! ...
usuario2846569
16
Esto en realidad no funcionó para mí, la información sobre herramientas cambió los valores y luego desapareció rápidamente. $(element).attr('data-original-title', newValue).tooltip('show');fue la solución de trabajo más simple para mí.
Gabe O'Leary
98

En Bootstrap 3 es suficiente llamar elt.attr('data-original-title', "Foo")ya que los cambios en el "data-original-title"atributo ya desencadenan cambios en la pantalla de información sobre herramientas.

ACTUALIZACIÓN: puede agregar .tooltip ('show') para mostrar los cambios de inmediato, no necesita desplazar el mouse y pasar el mouse sobre el objetivo para ver el cambio en el título

elt.attr('data-original-title', "Foo").tooltip('show');
Adriaan Tijsseling
fuente
55
Respuesta limpia, por qué no hay ups: <
ays0110
3
No aplica los cambios de inmediato, debe pasar el mouse y el mouse sobre el objetivo para ver el nuevo texto del título
Lev Lukomsky,
99
Esta es realmente la mejor respuesta y puede agregar .tooltip('show');para que se muestre después de la actualización
Jared
Esta es la única solución (de muchas probadas) que parecía funcionar (bs3). Buena solución para seguro!
jyoseph
3
Esta solución es mejor que todas las demás
Ayyaz Zafar
14

puede actualizar el texto de información sobre herramientas sin llamar realmente a show / hide:

$(myEl)
    .attr('title', newTitle)
    .tooltip('fixTitle')
    .tooltip('setContent')
BenG
fuente
3
Esto, .tooltip('show')en el extremo de la cadena, funcionó para mí.
markau
1
sí, setContenty showhace el truco! puedes cambiar data-original-titledirectamente en lugar de usarfixTitle
brauliobo
Probado en Bootstrap v2.3.1
Ricardo
13

Heres una buena solución si desea cambiar el texto sin cerrar y volver a abrir la información sobre herramientas.

$(element).attr('title', newTitle)
          .tooltip('fixTitle')
          .data('bs.tooltip')
          .$tip.find('.tooltip-inner')
          .text(newTitle)

de esta manera, el texto se reemplaza sin cerrar la información sobre herramientas (no se reposiciona, pero si está haciendo un cambio de una palabra, etc., debería estar bien). y cuando coloca el cursor sobre + información sobre herramientas, todavía se actualiza.

** esto es bootstrap 3, para 2 probablemente tengas que cambiar los datos / nombres de clase

ndreckshage
fuente
55
Dice $tipque no es un atributo de$(element)
Augustin Riedinger
Hizo eso:$(element).attr('title', newTitle).tooltip('fixTitle').parent().find('.tooltip .tooltip-inner').text(newTitle);
Augustin Riedinger
Estoy actualizando una información sobre herramientas en un elemento vecino cuando escribo en un campo de texto, y la información sobre herramientas desaparece para mí con este código cuando presiono una tecla.
temblorosa
Gracias por esto. El único problema con esta solución es que parece alterar la posición de la información sobre herramientas después del cambio de texto.
Wojciech Zylinski
13

para Bootstrap 4:

$(element).attr("title", "Copied!").tooltip("_fixTitle").tooltip("show").attr("title", "Copy to clipboard").tooltip("_fixTitle");
Bajo
fuente
3
Esto usa API no documentada. Tener cuidado.
Chloe
9

Esto funciona si la información sobre herramientas se ha instanciado (posiblemente con javascript):

$("#tooltip_id").data('tooltip').options.title="New_value!";
$("#tooltip_id").tooltip('hide').tooltip('show');
Relacional
fuente
77
Con arranque 3, se convierte en$('#tooltip_id').data('bs.tooltip').options.title = 'New_value!';
ajbeaven
Hola relacional, ¿podrías cambiar tu respuesta para reflejar las correcciones de comentarios? Gracias.
thouliha
7

Para bootstrap 3.x

Esto parece la solución más limpia:

$(element)
  .attr('data-original-title', 'New title').tooltip('show')

Show se usa para actualizar el título de inmediato y no esperar a que la información sobre herramientas se oculte y se muestre nuevamente.

empa
fuente
7

Aquí hay una actualización para Bootstrap 4 :

var title = "Foo";
elt.attr('data-original-title', title);
elt.tooltip('update');
elt.tooltip('show');

Pero la mejor manera es hacer esto:

var title = "Foo";
elt.attr('title', title);
elt.attr('data-original-title', title);
elt.tooltip('update');
elt.tooltip('show');

o en línea:

var title = "Foo";
elt.attr('title', title).attr('data-original-title', title).tooltip('update').tooltip('show');

Desde el lado de UX, solo ve que el texto se cambia sin efectos de desvanecimiento u ocultar / mostrar y no hay necesidad de hacerlo _fixTitle.

Ivijan Stefan Stipić
fuente
6

Puede cambiar el data-original-titleuso del siguiente código:

$(element).attr('data-original-title', newValue);
Morteza QorbanAlizade
fuente
6

Bootstrap 4

$('#topic_1').tooltip('dispose').tooltip({title: 'Goodbye'}).tooltip('show')

https://getbootstrap.com/docs/4.1/components/tooltips/#tooltipdispose

$('#topic_1').tooltip({title: 'Hello'}).tooltip('show');
setTimeout( function() {
  $('#topic_1').tooltip('dispose').tooltip({title: 'Goodbye'}).tooltip('show');
}, 5000);
#topic_1 {
  border: 1px solid red;
  margin: 50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js" integrity="sha384-o+RDsa0aLu++PJvFqy8fFScvbHFLtbvScb8AjopnFD+iEQ7wo/CG0xlczd+2O/em" crossorigin="anonymous"></script>

<div id="topic_1">Topic 1</div>

Chloe
fuente
4

Lo siguiente funcionó mejor para mí, básicamente estoy desechando cualquier información sobre herramientas existente y sin molestarme en mostrar la nueva información sobre herramientas. Si se llama a show en la información sobre herramientas como en otras respuestas, aparece incluso si el cursor no se encuentra sobre él.

La razón por la que elegí esta solución es que las otras soluciones, al reutilizar la información sobre herramientas existente, condujeron a algunos problemas extraños con la información sobre herramientas que a veces no se muestra al pasar el cursor sobre el elemento.

function updateTooltip(element, tooltip) {
    if (element.data('tooltip') != null) {
        element.tooltip('hide');
        element.removeData('tooltip');
    }
    element.tooltip({
        title: tooltip
    });
}
aknuds1
fuente
1
La mejor respuesta a esta pregunta.
Daniel Miliński
@ DanielMiliński Gracias :)
aknuds1
1
Si está usando boostrap3, debe usarlo en data('bs.tooltip')lugar dedata('tooltip')
Nigel Angel
3

En bootstrap 4 solo uso $(el).tooltip('dispose'); luego recrear como normal. Por lo tanto, puede colocar la disposición antes de una función que crea información sobre herramientas para asegurarse de que no se duplique.

Tener que verificar el estado y jugar con los valores parece menos amigable.

Martin Lyne
fuente
¿Deberíamos llamar a $ (el) .tooltip ('dispose') antes o después de actualizar el título de la información sobre herramientas?
Fifi
@imabot deseche la información sobre herramientas anterior y luego vuelva a crearla con datos nuevos. Si la información sobre herramientas es compleja, es posible que desee recuperar o almacenar la configuración inicial para poder recrear con esa configuración + nuevos valores. Espero que tenga sentido.
Martin Lyne
2

Puede establecer contenido en la llamada de información sobre herramientas con una función

        $("#myelement").tooltip({
            "title": function() {
                return "<h2>"+$("#tooltipcontainer").html()+"</h2>";
            }
        });

No tiene que usar solo el título del elemento llamado.

estudio 42 francia
fuente
2

Gracias, este código fue muy útil para mí, lo encontré efectivo en mis proyectos

$(element).attr('title', 'message').tooltip('fixTitle').tooltip('show');

Suerte
fuente
1

Destruya cualquier información sobre herramientas preexistente para que podamos repoblar con nuevo contenido de información sobre herramientas

$(element).tooltip("destroy");    
$(element).tooltip({
    title: message
});
Jerin
fuente
1

No pude obtener ninguna de las respuestas funcionando, aquí hay una solución:

$('#'+$(element).attr('aria-describedby')+' .tooltip-inner').html(newTitle);
Alex
fuente
0

Creo que Mehmet Duran tiene casi razón, pero hubo algunos problemas al usar varias clases con la misma información sobre herramientas y su ubicación. El siguiente código también evita errores de js que comprueban si hay alguna clase llamada "tooltip_class". Espero que esto ayude.

if (jQuery(".tooltip_class")[0]){    

        jQuery('.tooltip_class')
            .attr('title', 'New Title.')
            .attr('data-placement', 'right')
            .tooltip('fixTitle')
            .tooltip('hide');

    }
René Fernández
fuente
0

Cambie el texto alterando el texto en el elemento directamente. (no actualiza la posición de información sobre herramientas).

$('.tooltip-inner', $element.next()).html(newHtml);
$('.tooltip-inner', $element.next()).text(newText);

Cambie el texto destruyendo la información sobre herramientas anterior, luego creando y mostrando una nueva. (Hace que el viejo se desvanezca y el nuevo se desvanezca)

$element
.tooltip('destroy')
.tooltip({
    // Repeat previous options.
    title: newText,
})
.tooltip('show');

Estoy usando el método superior tanto para animar el "Ahorro". mensaje ( &nbsppara que la información sobre herramientas no cambie de tamaño) y para cambiar el texto a "Listo". (más relleno) cuando se completa la solicitud.

$element.tooltip({
  placement: 'left',
  title: 'Saving...',
  trigger: 'manual',
}).tooltip('show');

var parent = $element.parent();
var interval_id = setInterval(function(){
    var text = $('.tooltip-inner', parent).html();
    switch(text) {
    case 'Saving.&nbsp;&nbsp;': text = 'Saving..&nbsp;'; break;
    case 'Saving..&nbsp;': text = 'Saving...'; break;
    case 'Saving...': text = 'Saving.&nbsp;&nbsp;'; break;
    }
    $('.tooltip-inner', parent).html(text);
}, 250);

send_request( function(){
    // When the request is complete
    clearInterval(interval_id);
    $('.tooltip-inner', parent).html('Done.&nbsp;&nbsp;&nbsp;&nbsp;');
    setTimeout(function() {
        $element.tooltip('hide');
    }, 1500 /* Show "Done." for a bit */);
});
Nate
fuente
0

Esto funcionó para mí: (bootstrap 3.3.6; jquery = 1.11.3)

<a id="alertTooltip" href="#" data-html="true" class="tooltip" data-toggle="tooltip" title="Tooltip message"></a>

<script>
  $('#alertTooltip').attr('title', "Tooltip new <br /> message").tooltip('fixTitle');
</script>

El atributo data-html="true"permite usar html en el título de la información sobre herramientas.

omabra
fuente
0

Con el objeto de información sobre herramientas Boostrap:

$(element).attr('data-original-title', 'New value');
$(element).data('bs.tooltip').tip().find('.tooltip-inner').text('New value');
B. Aselina
fuente
0

Para BS4 (y BS3 con cambios menores) ... después de horas de búsqueda y pruebas, se me ocurrió la solución más confiable para este problema e incluso resuelve el problema de abrir más de una (información sobre herramientas o popover) al mismo tiempo, y el problema de abrirse automáticamente después de perder el foco, etc.

$('[data-toggle="tooltip"]').tooltip({
  trigger: 'hover'
}).on('shown.bs.tooltip', function() {
  var link = $(this);
  var data = '';
  data += '<ul style="list-style-type:none;margin:0;padding:0;text-align:left;font-size:12px">';
  data += '	<li>Sherif Salah</li>';
  data += '	<li>Muhammad Salah</li>';
  data += '	<li>and a gazillion more...</li>';
  data += '</ul>';
  link.attr('data-original-title', data);
  setTimeout(function() {
    if (link.is(':hover')) {
      link.tooltip("dispose").tooltip("show");
    }
  }, 1000);
});
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />
</head>

<body>
  <div class="card">
    <div class="card-body text-center">
      <a href="JavaScript:void(0);" class="btn btn-sm btn-link" data-toggle="tooltip" data-placement="top" data-html="true" title="Loading...">gazillion</a>
    </div>
  </div>
  <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>

</html>

Sherif Salah
fuente
0

Solo probé esto en bootstrap 4 y sin llamar a .show ()

el.tooltip('hide').attr('data-original-title', 'message');
OBL
fuente
-1

puede usar este código para ocultar la información sobre herramientas, cambiar su título y mostrar la información sobre herramientas nuevamente, cuando la solicitud ajax regrese con éxito.

$(element).tooltip('hide');
$(element).attr('title','this is new title');
$(element).tooltip('fixTitle');
setTimeout(function() {  $(element).tooltip('show');}, 500);
Saifee
fuente
-1

Estoy usando esta salida fácil:

$(document).ready(function() {
    $("#btn").prop('title', 'Click to copy your shorturl');
});

function myFunction(){
  $(btn).tooltip('hide');
  $(btn).attr('data-original-title', 'Test');
  $(btn).tooltip('show');
});

Jorge
fuente
-1
$(this).attr('data-original-title', 'click here to publish')
       .tooltip('fixTitle')
       .tooltip('show');

Es útil si necesita cambiar el texto de la información sobre herramientas después de que se haya inicializado con attr 'data-original-title'.

Amina
fuente