Twitter Bootstrap araç ipuçlarını dinamik olarak oluşturulan öğelere nasıl bağlarım?


277

Aşağıdaki gibi javascript ile Twitter bootstrap araç ipuçları kullanıyorum:

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

İşaretlemem şöyle görünüyor:

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

Bu iyi çalışıyor, ancak <a>öğeleri dinamik olarak ekliyorum ve araç ipuçları bu dinamik öğeler için görünmüyor. Belge tipik jquery $(document).ready(function()işlevselliği ile yüklendiğinde .tooltip () bir kez bağlamak çünkü biliyorum .

Bunu dinamik olarak oluşturulan öğelere nasıl bağlayabilirim? Genellikle bunu jquery live () yöntemi ile yaparım. Ancak, bağlamak için kullandığım olay nedir? Ben nasıl bootstrap .tooltip () jquery .live () ile bağlamak için emin değilim.

Bu işi yapmanın bir yolunu buldum:

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

Bu işe yarıyor, ama biraz hileli görünüyor. Ayrıca $ (hazır) çağrısında aynı .tooltip () satırını arıyorum. Peki, sayfa ilk kez yüklediğinde ve bu seçiciyle eşleştiğinde var olan öğeler araç ipucuyla iki kez sonuçlanıyor mu?

Bu yaklaşımla ilgili herhangi bir sorun görmüyorum. Sadece en iyi uygulamayı veya davranışı anlamaya çalışıyorum.


hmm iyi soru, bu yardımcı olur mu? github.com/twitter/bootstrap/issues/2374
Tim

Bu ilginç bir okuma, ama sadece tek bir araç ipucu istiyorum. Sadece araç ipucu seçicisiyle eşleşen dinamik olarak eklenen öğelerin eklendiğinden emin olmak istiyorum, durum böyle değil.
durden2.0

3
Harika bir soru. Twitter kısmında abartı gibi görünüyor.
Luke The Obscure

1
@ durden2.0 Hıristiyanlar sizin için nasıl cevap verdi? Doğru olarak kabul etmek ister misiniz?
Ruslans Uralovs

3
Sorunuzla gerçekten ilgili değil ama ... Bu relözelliği kaçırmak kötü bir stil buluyorum . Bu semantik değildir ve on yıl önce bir hack olarak ortaya çıkmıştır. Günümüzde, birkaç yıl geriye giden her tarayıcı, data-*özellikleri desteklemektedir ve bunları kullanmamanın bir nedeni yoktur.
T Nguyen

Yanıtlar:


513

Bunu dene:

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

4
Harika. Bu doğru cevaptır, çünkü temelde canlı / açıkın yerine geçer.
Mahn


5
Bu çözüm hakkında sevmediğim şey, araç ipuçlarının çoklu yapılandırmasına sahip olamayacağınızdır. Örneğin, üstte ve diğer altta bulunan araç ipuçlarınız varsa çalışmaz.
barbolo

7
@barbolo, farklı konfigürasyonlar için sadece farklı seçiciler kullanın. Bu doğru çözüm. Btw, Popover ile de çalışıyor.
Enrico Carlesso

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

148

Başlatmak istediğiniz birden fazla ipucu yapılandırmanız varsa, bu benim için iyi çalışıyor.

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

Ardından, dataöznitelikleri kullanarak özelliği tek tek öğeler üzerinde ayarlayabilirsiniz .


3
Harika bir ipucu. Bunu $ ("body") olarak değiştirmek zorunda kaldım. Tooltip ({selector: '[data-toggle = "tooltip"]'});
Jafin

2
Bootstrap 3 ile böyle olmalı. Harika!
gaddar

harika! bir tablonun içinde kullanmak için konteyner ekleyin: ekstra genişlikten kaçınmak için 'gövde'.
shock_gone_wild

Bu gerçekten iyi çalışıyor. Dinamik bir masada bir sürü şey denedim ama hiçbir şey gerçekten bu kadar çalıştı.
AnBisw

Bootstrap 4 ile de çalışır!
Eugene Kulabuhov

17

Benim için, sadece mouseenter olayını yakalamak biraz buggy oldu ve araç ipucu düzgün bir şekilde göstermiyor / gizlenmiyordu. Bunu yazmak zorunda kaldım ve şimdi mükemmel çalışıyor:

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

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

3
Bu .on ('hover') 'in neden işe yaramayacağı konusunda çok yardımcı oldu.
Adam

Bu gidon.js kullanarak benim uygulama için kullanmam gereken tek şeydi. Handlebars.js kullanmıyorsam, kabul edilen cevap da işe yaradı.
HPWD

Ben bunu böyle yapıyordum ama sanırım bununla manuel olarak uygulamanız gereken vurgulu gecikmeler gibi birçok seçeneği kaybedersiniz.
DavidScherer

16

Burada daha uzun cevap gönderdim: https://stackoverflow.com/a/20877657/207661

TL; DR: Belgeye hazır olayda çalışan yalnızca bir kod satırına ihtiyacınız vardır:

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

Diğer cevaplarda önerilen diğer daha karmaşık kodlar gerekli görünmüyor (Bootstrap 3.0 ile test ettim).


1
Bu en iyi cevap.
Chris Marisic

Bu benim durumum için çalıştı. Tablesorter 2.26.2 ile bir tablo kullandım ve Ajax çağrısı ile değerleri doldurdum. Sorun, html araç ipucunun işlenen çıktı yerine HTML metni olarak gösterilmesiydi. İlk seferde benim için çalışan tek çözüm bu. +1 ve çok teşekkürler!
Anurag

8

Benim için, bu js ile aynı sorunu yeniden üretir Paola

Çözümüm:

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

2

Tam Vücutta aramak yerine. Biri sadece böyle senaryolarda zaten mevcut dinamik başlık seçeneği kullanabilirsiniz:

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

1

Bu cevapların bir kombinasyonunun bana en iyi sonucu verdiğini gördüm - araç ipucunu hala konumlandırmamı ve ilgili kaba eklememi sağladım:

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

Alakalı HTML:

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.