Bagaimana cara saya mengikat tooltip Bootstrap Twitter ke elemen yang dibuat secara dinamis?


277

Saya menggunakan tooltips bootstrap Twitter dengan javascript seperti berikut:

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

Markup saya terlihat seperti ini:

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

Ini berfungsi dengan baik, tapi saya menambahkan <a>elemen secara dinamis dan tooltips tidak muncul untuk elemen dinamis tersebut. Saya tahu itu karena saya hanya mengikat .tooltip () sekali ketika dokumen selesai dimuat dengan $(document).ready(function()fungsi jquery yang khas .

Bagaimana saya bisa mengikat ini ke elemen yang dibuat secara dinamis? Biasanya saya akan melakukan ini melalui metode jquery live (). Namun, acara apa yang saya gunakan untuk mengikat? Saya tidak yakin bagaimana cara menghubungkan bootstrap .tooltip () dengan jquery .live ().

Saya telah menemukan satu cara untuk membuat pekerjaan ini adalah sesuatu seperti ini:

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

Ini berfungsi, tetapi sepertinya agak retas. Saya juga menelepon baris .tooltip () yang sama persis dalam panggilan $ (siap). Jadi, apakah elemen yang ada saat halaman pertama dimuat dan cocok dengan pemilih itu berakhir dengan tooltip dua kali?

Saya tidak melihat masalah dengan pendekatan ini. Saya hanya mencari praktik terbaik atau pemahaman perilaku.


hmm pertanyaan yang bagus, akankah ini membantu? github.com/twitter/bootstrap/issues/2374
Tim

Itu bacaan yang menarik, tapi saya hanya menginginkan satu jenis tooltip. Saya hanya ingin memastikan setiap elemen yang ditambahkan secara dinamis yang cocok dengan pemilih tooltip ditambahkan, yang tidak terjadi.
durden2.0

3
Pertanyaan yang bagus Sepertinya oversite di pihak twitter.
Luke The Obscure

1
@ durden2.0 Bagaimana jawaban orang Kristen bekerja untuk Anda? Peduli menerima sebagai benar?
Rusia Uralovs

3
Tidak benar-benar terkait dengan pertanyaan Anda tetapi ... Saya merasa gaya buruk untuk membajak relatribut. Ini non-semantik dan berasal lebih dari satu dekade lalu sebagai peretasan. Saat ini, setiap browser yang kembali beberapa tahun mendukung data-*atribut dan tidak ada lagi alasan untuk tidak menggunakannya.
T Nguyen

Jawaban:


513

Coba yang ini:

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

4
Bagus. Ini adalah jawaban yang benar, karena itu pada dasarnya adalah pengganti live / on.
Mahn


5
Apa yang saya tidak suka tentang solusi ini adalah bahwa Anda tidak dapat memiliki beberapa konfigurasi tooltips. Misalnya, itu tidak berfungsi jika Anda memiliki tooltips yang ditempatkan di atas dan yang lain yang ditempatkan di bawah.
barbolo

7
@barbolo, cukup gunakan pemilih yang berbeda untuk konfigurasi yang berbeda. Ini solusi yang tepat. Btw, itu berfungsi juga dengan Popover.
Enrico Carlesso

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

148

Jika Anda memiliki beberapa konfigurasi tooltip yang ingin Anda inisialisasi, ini berfungsi baik untuk saya.

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

Anda kemudian dapat mengatur properti pada elemen individual menggunakan dataatribut.


3
Tip yang bagus. Saya harus mengubahnya ke $ ("body"). Tooltip ({selector: '[data-toggle = "tooltip"]'});
Jafin

2
Beginilah seharusnya dengan Bootstrap 3. Hebat!
muram

Bagus! untuk digunakan di dalam tabel tambahkan wadah: 'tubuh' untuk menghindari lebar ekstra.
shock_gone_wild

Ini bekerja dengan sangat baik. Saya mencoba banyak hal di atas meja dinamis tetapi tidak ada yang benar-benar berhasil sampai saat ini.
AnBisw

Bekerja dengan Bootstrap 4 juga!
Eugene Kulabuhov

17

Bagi saya, hanya menangkap acara mouseenter agak buggy, dan tooltip tidak menunjukkan / bersembunyi dengan baik. Saya harus menulis ini, dan sekarang berfungsi dengan baik:

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

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

3
Ini adalah insite yang sangat membantu mengapa .on ('hover') tidak berfungsi dengan baik.
Adam

Ini semua yang saya butuhkan untuk implementasi saya menggunakan setang.js. Jika saya tidak menggunakan setang.js, jawaban yang diterima juga berfungsi.
HPWD

Ini adalah bagaimana saya biasa melakukan ini tetapi Anda kehilangan banyak pilihan seperti melayang-layang penundaan yang Anda perlu menerapkan secara manual dengan ini saya pikir.
DavidScherer

16

Saya sudah mengirimkan jawaban yang lebih lama di sini: https://stackoverflow.com/a/20877657/207661

TL; DR: Anda hanya perlu satu baris kode yang berjalan di acara siap dokumen:

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

Kode lain yang lebih rumit yang disarankan dalam jawaban lain sepertinya tidak perlu (Saya sudah menguji ini dengan Bootstrap 3.0).


1
Ini jawaban terbaik.
Chris Marisic

Ini berhasil untuk kasus saya. Saya menggunakan tabel dengan Tablesorter 2.26.2 dan mengisi nilai-nilai melalui panggilan Ajax. Masalahnya adalah tooltip html ditampilkan sebagai teks HTML alih-alih hasil yang diberikan. Ini adalah satu-satunya solusi yang bekerja untuk saya di awal. +1 dan terima kasih banyak!
Anurag

8

Bagi saya, js ini mereproduksi masalah yang sama yang terjadi dengan Paola

Solusi saya:

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

2

Alih-alih mencarinya di Tubuh penuh. Orang hanya bisa menggunakan opsi judul dinamis yang sudah tersedia dalam skenario seperti itu saya pikir:

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

1

Saya menemukan kombinasi dari jawaban-jawaban ini memberi saya hasil terbaik - memungkinkan saya untuk tetap menempatkan tooltip dan menempelkannya ke wadah yang relevan:

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

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
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.