Ubah konten Bootstrap Tooltip Twitter saat klik


224

Saya memiliki tooltip pada elemen jangkar, yang mengirimkan permintaan AJAX saat klik. Elemen ini memiliki tooltip (dari Twitter Bootstrap). Saya ingin konten tooltip berubah ketika permintaan AJAX berhasil kembali. Bagaimana saya bisa memanipulasi tooltip setelah inisiasi?

Jawaban:


411

Baru saja menemukan ini hari ini sambil membaca kode sumber. Jadi $.tooltip(string)memanggil fungsi apa pun di dalam Tooltipkelas. Dan jika Anda melihat Tooltip.fixTitle, itu mengambil data-original-titleatribut dan mengganti nilai judul dengannya.

Jadi kami hanya melakukan:

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

dan tentu saja, itu memperbarui judul, yang merupakan nilai di dalam tooltip.

Cara lain (lihat @ lukmdo komentar di bawah):

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

5
Terima kasih! Ini telah membingungkan selama satu jam.
ranting

160
Atau bahkan lebih pendek (lebih halus)$(element).attr('title', 'NEW_TITLE').tooltip('fixTitle').tooltip('show');
lukmdo

5
Anda juga dapat mengubah judul melalui data ('tooltip'). Opsi properti, lihat stackoverflow.com/questions/10181847/...
James McMahon

4
Tidak dapat menemukan dokumentasi di 'fixTitle', jadi saya kira bukan ide yang baik untuk menggunakan ini !? ...
user2846569

16
Ini sebenarnya tidak bekerja untuk saya, tooltip berganti nilai dan kemudian menghilang dengan cepat. $(element).attr('data-original-title', newValue).tooltip('show');adalah solusi kerja paling sederhana bagi saya.
Gabe O'Leary

98

Di Bootstrap 3 cukup untuk memanggil elt.attr('data-original-title', "Foo")karena perubahan pada "data-original-title"atribut sudah memicu perubahan pada tampilan tooltip.

UPDATE: Anda dapat menambahkan .tooltip ('show') untuk segera menampilkan perubahan, Anda tidak perlu mouseout dan mouseover target untuk melihat perubahan pada judul

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

5
Jawaban bersih, mengapa tidak ada up: <
ays0110

3
Itu tidak berlaku perubahan segera, Anda perlu mouseout dan mouseover target untuk melihat teks judul baru
Lev Lukomsky

9
Ini sebenarnya jawaban terbaik dan Anda dapat menambahkan .tooltip('show');untuk menampilkannya setelah pembaruan
Jared

Ini adalah satu-satunya solusi (dari banyak yang dicoba) yang sepertinya hanya berfungsi (bs3). Solusi yang bagus pasti!
jyoseph

3
Solusi ini lebih baik daripada yang lainnya
Ayyaz Zafar

14

Anda dapat memperbarui teks tooltip tanpa benar-benar memanggil acara / sembunyikan:

$(myEl)
    .attr('title', newTitle)
    .tooltip('fixTitle')
    .tooltip('setContent')

3
Ini, dengan .tooltip('show')di ujung rantai, bekerja untuk saya.
markau

1
ya, setContentdan showlakukan triknya! Anda dapat mengubah data-original-titlesecara langsung alih-alih menggunakanfixTitle
brauliobo

Diuji pada Bootstrap v2.3.1
Ricardo

13

inilah solusi yang bagus jika Anda ingin mengubah teks tanpa menutup dan membuka kembali tooltip.

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

dengan cara ini, teks diganti tanpa menutup tooltip (tidak memposisikan ulang, tetapi jika Anda melakukan satu perubahan kata dll itu harus baik-baik saja). dan ketika Anda mengarahkan + kembali pada tooltip, itu masih diperbarui.

** ini bootstrap 3, untuk 2 Anda mungkin harus mengubah data / nama kelas


5
Says $tipbukan atribut dari$(element)
Augustin Riedinger

Apakah itu:$(element).attr('title', newTitle).tooltip('fixTitle').parent().find('.tooltip .tooltip-inner').text(newTitle);
Augustin Riedinger

Saya memperbarui tooltip pada elemen tetangga ketika mengetik ke bidang teks, dan tooltip menghilang bagi saya dengan kode ini ketika saya menekan tombol.
gemetar

Terima kasih untuk ini. Satu-satunya masalah dengan solusi ini adalah tampaknya mengacaukan posisi tooltip setelah perubahan teks.
Wojciech Zylinski

13

untuk Bootstrap 4:

$(element).attr("title", "Copied!").tooltip("_fixTitle").tooltip("show").attr("title", "Copy to clipboard").tooltip("_fixTitle");

3
Ini menggunakan API tidak berdokumen. Awas.
Chloe

9

Ini berfungsi jika tooltip telah dipakai (mungkin dengan javascript):

$("#tooltip_id").data('tooltip').options.title="New_value!";
$("#tooltip_id").tooltip('hide').tooltip('show');

7
Dengan bootstrap 3, menjadi$('#tooltip_id').data('bs.tooltip').options.title = 'New_value!';
ajbeaven

Hai relasional, dapatkah Anda mengubah jawaban Anda untuk mencerminkan koreksi komentar? Terima kasih.
thouliha

7

Untuk bootstrap 3.x

Ini sepertinya solusi terbersih:

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

Show digunakan untuk membuat pembaruan judul segera dan tidak menunggu tooltip disembunyikan dan ditampilkan lagi.


7

Berikut ini adalah pembaruan untuk Bootstrap 4 :

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

Tetapi cara terbaik adalah melakukan ini:

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

atau sebaris:

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

Dari sisi UX Anda hanya melihat bahwa teks diubah tanpa efek pudar atau sembunyikan / tampilkan dan tidak perlu _fixTitle.


6

Anda bisa mengubah data-original-titlemenggunakan kode berikut:

$(element).attr('data-original-title', newValue);

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>


4

Berikut ini bekerja yang terbaik untuk saya, pada dasarnya saya membuang tooltip yang ada dan tidak repot-repot menunjukkan tooltip baru. Jika memanggil show di tooltip seperti di jawaban lain, itu muncul meskipun kursor tidak melayang di atasnya.

Alasan saya pergi untuk solusi ini adalah bahwa solusi lain, menggunakan kembali tooltip yang ada, menyebabkan beberapa masalah aneh dengan tooltip kadang-kadang tidak muncul ketika mengarahkan kursor di atas elemen.

function updateTooltip(element, tooltip) {
    if (element.data('tooltip') != null) {
        element.tooltip('hide');
        element.removeData('tooltip');
    }
    element.tooltip({
        title: tooltip
    });
}

1
Jawaban terbaik untuk ini. Pertanyaan.
Daniel Miliński

@ DanielMiliński Terima kasih :)
aknuds1

1
Jika Anda menggunakan boostrap3, Anda harus menggunakan data('bs.tooltip')alih-alihdata('tooltip')
Nigel Angel

3

Di bootstrap 4 saya hanya menggunakan $(el).tooltip('dispose'); lalu menciptakan kembali seperti biasa. Jadi, Anda dapat meletakkan buang di depan fungsi yang membuat tooltip untuk memastikan itu tidak menggandakan.

Harus memeriksa keadaan dan mengotak-atik nilai tampaknya kurang ramah.


Haruskah kita memanggil $ (el) .tooltip ('buang') sebelum atau setelah memperbarui judul tooltip?
Fifi

@imabot buang tooltip lama, lalu buat ulang dengan data baru. Jika tooltips Anda rumit, Anda mungkin ingin mengambil atau menyimpan konfigurasi awal sehingga Anda bisa membuat ulang dengan konfigurasi itu + nilai baru. Harapan itu masuk akal.
Martin Lyne

2

Anda dapat mengatur konten pada panggilan tooltip dengan suatu fungsi

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

Anda tidak harus menggunakan hanya judul elemen yang dipanggil.


2

Terima kasih kode ini sangat membantu saya, saya merasa efektif pada proyek saya

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


1

Hancurkan tooltip yang sudah ada sebelumnya sehingga kami dapat mengisi kembali dengan konten tooltip baru

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

1

Saya tidak bisa mendapatkan jawaban yang berfungsi, berikut ini solusinya:

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

0

Saya pikir Mehmet Duran hampir benar, tetapi ada beberapa masalah ketika menggunakan beberapa kelas dengan tooltip yang sama dan penempatannya. Kode berikut juga menghindari kesalahan js memeriksa apakah ada kelas yang disebut "tooltip_class". Semoga ini membantu.

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

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

    }

0

Ubah teks dengan mengubah teks dalam elemen secara langsung. (tidak memperbarui posisi tooltip).

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

Ubah teks dengan menghancurkan tooltip lama, lalu buat dan tampilkan yang baru. (Menyebabkan yang lama memudar dan yang baru memudar)

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

Saya menggunakan metode teratas untuk menghidupkan "Penghematan." pesan (menggunakan &nbspsehingga tooltip tidak berubah dalam ukuran) dan untuk mengubah teks menjadi "Selesai." (plus padding) saat permintaan selesai.

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

0

Ini bekerja untuk saya: (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>

Atribut data-html="true"memungkinkan untuk menggunakan html pada judul tooltip.


0

Dengan Boostrap objek Tooltip:

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

0

Untuk BS4 (dan BS3 dengan perubahan kecil) .. setelah pencarian dan uji coba selama berjam-jam, saya menemukan solusi yang paling dapat diandalkan untuk masalah ini dan bahkan memecahkan masalah membuka lebih dari satu (tooltip atau popover) pada saat yang sama, dan masalah membuka secara otomatis setelah kehilangan fokus, dll.

$('[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>


0

Saya hanya menguji ini di bootstrap 4 & tanpa memanggil .show ()

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

-1

Anda dapat menggunakan kode ini untuk menyembunyikan tip alat, mengubah judulnya, dan menampilkan tooltip lagi, ketika permintaan ajax berhasil kembali.

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

-1

Saya menggunakan jalan keluar yang mudah ini:

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


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

Berguna jika Anda perlu mengubah teks tooltip setelah diinisialisasi dengan attr 'data-original-title'.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.