Як я пов'язую підказки інструментів Twitter Bootstrap з динамічно створеними елементами?


277

Я використовую підказки для завантаження у Twitter із JavaScript, наприклад:

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

Моя розмітка виглядає так:

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

Це прекрасно працює, але я додаю <a>елементи динамічно, і підказки не відображаються для цих динамічних елементів. Я знаю, що це тому, що я пов'язую .tooltip () лише один раз, коли документ закінчується завантаженим типовою $(document).ready(function()функцією jquery .

Як я можу пов’язати це з динамічно створеними елементами? Зазвичай я б це робив методом jquery live (). Однак, що таке подія, яку я використовую для зв’язування? Я просто не впевнений, як підключити завантажувальний файл .tooltip () за допомогою jquery .live ().

Я знайшов один із способів зробити цю роботу приблизно таким:

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

Це працює, але здається своєрідним хакером. Я також дзвоню точно таку саму лінію .tooltip () у виклику $ (готовий). Отож, чи існують елементи, коли сторінка завантажується вперше і збігається з цим селектором в кінці підказки двічі?

Я не бачу проблем із таким підходом. Я просто шукаю найкращу практику чи розуміння поведінки.


хм гарне запитання, чи допоможе це? github.com/twitter/bootstrap/isissue/2374
Тім

Це цікаве прочитання, але я хочу лише одного типу підказки. Я просто хочу переконатися, що будь-які динамічно додані елементи, що відповідають селектору підказки, будуть додані, що не так.
durden2.0

3
Чудове запитання. Здається, як надмірний сайт з боку твіттера.
Люк Неясний

1
@ durden2.0 Як відповідали християни на вас? Хочете прийняти як правильне?
Руслан Ураловс

3
Не дуже пов’язаний із вашим запитанням, але ... мені здається, поганий стиль викрадати relатрибут. Це несемантично і зародилося понад десятиліття тому як хак. Сьогодні кожен браузер, який повертається кілька років, підтримує data-*атрибути, і немає більше причин не використовувати їх.
T Nguyen

Відповіді:


513

Спробуйте це:

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

4
Чудово. Це правильна відповідь, адже це в основному заміна живого / увімкненого.
Ман


5
Що мені не подобається в цьому рішенні, це те, що ви не можете мати кілька конфігурацій підказок. Наприклад, він не працює, якщо у вас є підказки, розміщені зверху та інші, які розміщені знизу.
barbolo

7
@barbolo, просто використовуйте різні селектори для різних конфігурацій. Це правильне рішення. До речі, це також працює з Popover.
Енріко Карлессо

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

148

Якщо у вас є кілька конфігурацій підказок, які ви хочете ініціалізувати, це добре працює для мене.

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

Потім можна встановити властивість для окремих елементів за допомогою dataатрибутів.


3
Чудова порада. Мені довелося змінити його на $ ("body"). Tooltip ({selector: '[data-toggle = "tooltip"]'});
Джафін

2
Ось як має бути з Bootstrap 3. Чудово!
похмурий

чудово! для використання всередині таблиці додайте контейнер: 'body', щоб уникнути зайвої ширини.
shock_gone_wild

Це працює дуже добре. Я спробував цілу купу речей на динамічному столі, але до цього нічого не вийшло.
AnBisw

Працює і з Bootstrap 4!
Євген Кулабухов

17

Для мене лише ловлі події миші, було трохи помилковим, і підказка не відображалася / ховалася належним чином. Мені довелося це написати, і воно зараз працює чудово:

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

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

3
Це було дуже корисно наполягати на тому, чому .on ("наведення") не буде працювати правильно.
Адам

Це все, що мені потрібно було використати для моєї реалізації з використанням handlebars.js. Якщо я не використовував handlebars.js, прийнята відповідь також спрацювала.
HPWD

Ось як я це робив, але ви втрачаєте багато варіантів, таких як затримка наведення курсора, яку вам потрібно буде вручну реалізувати з цим, я думаю.
DavidScherer

16

Тут я розмістив довшу відповідь: https://stackoverflow.com/a/20877657/207661

TL; DR: Вам потрібен лише один рядок коду, який запускається в документі, готовому до документа:

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

Інший складніший код, запропонований в інших відповідях, не здається необхідним (я протестував це за допомогою Bootstrap 3.0).


1
Це найкраща відповідь.
Кріс Марісіч

Це працювало для моєї справи. Я використовував таблицю з Tablesorter 2.26.2 та заповненими значеннями через виклик Ajax. Проблема полягала в тому, що html підказка відображалася як HTML-текст замість виведеного виводу. Це єдине рішення, яке працювало для мене в першу чергу. +1 та велика подяка!
Анураг

8

Для мене цей js відтворює ту саму проблему, що і з Паолою

Моє рішення:

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

2

Замість того, щоб шукати його в повному обсязі. Можна просто використовувати варіант динамічного заголовка, який уже доступний у таких сценаріях:

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

1

Я знайшов, що комбінація цих відповідей дала мені найкращий результат - дозволяючи мені все-таки розташувати підказку та приєднати її до відповідного контейнера:

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

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.