Изменить содержимое всплывающей подсказки Twitter Bootstrap

224

У меня есть всплывающая подсказка для элемента привязки, которая отправляет запрос AJAX по щелчку. Этот элемент имеет всплывающую подсказку (из Twitter Bootstrap). Я хочу, чтобы содержимое всплывающей подсказки изменялось при успешном завершении запроса AJAX. Как я могу манипулировать всплывающей подсказкой после инициации?

бунт
источник

Ответы:

411

Просто нашел это сегодня, читая исходный код. Так что $.tooltip(string)вызывает любую функцию в Tooltipклассе. И если вы посмотрите на Tooltip.fixTitleэто, он получаетdata-original-title атрибут и заменяет значение заголовка им.

Итак, мы просто делаем:

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

и, конечно же, он обновляет заголовок, который является значением внутри всплывающей подсказки.

Другой способ (см. Комментарий @lukmdo ниже):

$(element).attr('title', 'NEW_TITLE')
          .tooltip('fixTitle')
          .tooltip('show');
Мехмет Дюран
источник
5
Спасибо! Это было сбито с толку в течение часа.
веточка
160
Или даже короче (ровнее)$(element).attr('title', 'NEW_TITLE').tooltip('fixTitle').tooltip('show');
lukmdo
5
Вы также можете изменить заголовок с помощью свойства data ('tooltip'). Options, см. Stackoverflow.com/questions/10181847/…
James McMahon
4
Не удалось найти документацию по 'fixTitle', поэтому я думаю, что не стоит использовать это !? ...
user2846569
16
Это на самом деле не работает для меня, подсказка переключала значения, а затем быстро исчезала. $(element).attr('data-original-title', newValue).tooltip('show');было самым простым рабочим решением для меня.
Гейб О'Лири
98

В Bootstrap 3 достаточно вызвать, так elt.attr('data-original-title', "Foo")как изменения в "data-original-title"атрибуте уже вызывают изменения в отображении всплывающей подсказки.

ОБНОВЛЕНИЕ: Вы можете добавить .tooltip ('show'), чтобы показать изменения немедленно, вам не нужно указывать мышью и цель наведения мыши, чтобы увидеть изменение в заголовке

elt.attr('data-original-title', "Foo").tooltip('show');
Адриан Тайсселинг
источник
5
Чистый ответ, почему бы не взлеты: <
ays0110
3
Изменения не применяются немедленно, вам нужно навести указатель мыши и навести курсор мыши, чтобы увидеть новый текст заголовка
Лев Лукомский,
9
На самом деле это лучший ответ, и вы можете добавить .tooltip('show');его, чтобы показать после обновления
Джаред
Это единственное решение (из многих опробованных), которое, похоже, просто работает (bs3). Хорошее решение точно!
Джозеф
3
Это решение лучше всех остальных
Айяз Зафар
14

Вы можете обновить текст всплывающей подсказки без фактического вызова show / hide:

$(myEl)
    .attr('title', newTitle)
    .tooltip('fixTitle')
    .tooltip('setContent')
Бенг
источник
3
Это, с .tooltip('show')конца цепи, работало для меня.
Маркау
1
да, setContentи showделает трюк! Вы можете изменить data-original-titleнепосредственно вместо использованияfixTitle
Браулиобо
Проверено на Bootstrap v2.3.1
Рикардо
13

Вот отличное решение, если вы хотите изменить текст без закрытия и повторного открытия подсказки.

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

таким образом, текст заменяется без закрытия всплывающей подсказки (не перемещается, но если вы изменяете одно слово и т. д., все должно быть в порядке). и когда вы отпираете + всплывающую подсказку, она все еще обновляется.

** это загрузчик 3, для 2 вы, вероятно, должны изменить имена данных / классов

ndreckshage
источник
5
Говорит $tip, не является атрибутом$(element)
Августин Ридингер
Сделал это:$(element).attr('title', newTitle).tooltip('fixTitle').parent().find('.tooltip .tooltip-inner').text(newTitle);
Августин Ридингер
Я обновляю всплывающую подсказку для соседнего элемента при вводе текста в текстовое поле, и подсказка исчезает для меня с этим кодом при нажатии клавиши.
Тремби
Спасибо за это. Единственная проблема, связанная с этим решением, заключается в том, что после изменения текста оно, похоже, портит положение всплывающей подсказки.
Войцех Зилинский
13

для Bootstrap 4:

$(element).attr("title", "Copied!").tooltip("_fixTitle").tooltip("show").attr("title", "Copy to clipboard").tooltip("_fixTitle");
бас
источник
3
Это использует недокументированный API. Осторожно.
Хлоя
9

Это работает, если всплывающая подсказка была создана (возможно, с помощью javascript):

$("#tooltip_id").data('tooltip').options.title="New_value!";
$("#tooltip_id").tooltip('hide').tooltip('show');
реляционный
источник
7
С начальной $('#tooltip_id').data('bs.tooltip').options.title = 'New_value!';
загрузкой
Эй, вы можете изменить свой ответ, чтобы отразить исправления комментариев? Спасибо.
Тулиха
7

Для начальной загрузки 3.x

Это кажется самым чистым решением:

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

Шоу используется для немедленного обновления заголовка, а не для ожидания скрытия и повторного отображения всплывающей подсказки.

EMPA
источник
7

Вот обновление для Bootstrap 4 :

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

Но лучший способ сделать это так:

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

или встроенный:

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

Со стороны UX вы просто видите, что текст изменяется без эффектов замирания или скрытия / показа, и в этом нет необходимости _fixTitle.

Ивиян Стефан Стипич
источник
6

Вы можете просто изменить, data-original-titleиспользуя следующий код:

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

Следующее сработало лучше всего для меня, в основном, я удаляю любую существующую подсказку и не удосужился показать новую подсказку. При вызове show во всплывающей подсказке, как и в других ответах, оно всплывает, даже если курсор не находится над ним.

Причина, по которой я остановился на этом решении, состоит в том, что другие решения, повторно использующие существующую подсказку, привели к некоторым странным проблемам с подсказкой, которые иногда не отображаются при наведении курсора на элемент.

function updateTooltip(element, tooltip) {
    if (element.data('tooltip') != null) {
        element.tooltip('hide');
        element.removeData('tooltip');
    }
    element.tooltip({
        title: tooltip
    });
}
aknuds1
источник
1
Лучший ответ на этот вопрос.
Даниэль Милиньски
@ DanielMiliński Спасибо :)
aknuds1
1
Если вы используете boostrap3, вам нужно использовать data('bs.tooltip')вместоdata('tooltip')
Nigel Angel
3

В bootstrap 4 я просто использую, а $(el).tooltip('dispose');затем воссоздаю как обычно. Таким образом, вы можете поместить dispose перед функцией, которая создает всплывающую подсказку, чтобы убедиться, что она не удваивается.

Необходимость проверять состояние и возиться с ценностями кажется менее дружелюбной.

Мартин Лайн
источник
Должны ли мы вызывать $ (el) .tooltip ('dispose') до или после обновления заголовка всплывающей подсказки?
Фифи
@imabot утилизируйте старую подсказку, а затем воссоздайте с новыми данными. Если ваши всплывающие подсказки сложны, вы можете получить или иным образом сохранить исходную конфигурацию, чтобы вы могли просто воссоздать ее с новыми настройками. Надеюсь, что это имеет смысл.
Мартин Лайн
2

Вы можете установить контент при вызове всплывающей подсказки с помощью функции

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

Вам не нужно использовать только заголовок вызываемого элемента.

студия 42 франция
источник
2

Спасибо, этот код был очень полезным для меня, я нашел его эффективным в моих проектах

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

Счастливый
источник
1

Уничтожьте любую ранее существующую подсказку, чтобы мы могли заполнить ее новым содержанием

$(element).tooltip("destroy");    
$(element).tooltip({
    title: message
});
jerin
источник
1

Я не смог получить ни одного из ответов, вот обходной путь:

$('#'+$(element).attr('aria-describedby')+' .tooltip-inner').html(newTitle);
Alex
источник
0

Я думаю, что Мехмет Дюран почти прав, но были некоторые проблемы при использовании нескольких классов с одинаковыми подсказками и их размещением. Следующий код также избегает проверки ошибок js, если есть какой-либо класс с именем «tooltip_class». Надеюсь это поможет.

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

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

    }
Рене Фернандес
источник
0

Измените текст, изменив текст в элементе напрямую. (не обновляет позицию всплывающей подсказки).

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

Измените текст, уничтожив старую подсказку, а затем создав и отобразив новую. (Заставляет старый исчезать, а новый исчезать)

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

Я использую метод top, чтобы оживить «Сохранение». сообщение (при &nbspэтом всплывающая подсказка не изменяется по размеру) и изменить текст на «Готово». (плюс дополнение), когда запрос завершен.

$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
источник
0

Это сработало для меня: (загрузчик 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>

Атрибут data-html="true"позволяет использовать html в заголовке всплывающей подсказки.

omabra
источник
0

С всплывающей подсказкой объекта Boostrap:

$(element).attr('data-original-title', 'New value');
$(element).data('bs.tooltip').tip().find('.tooltip-inner').text('New value');
B.Asselin
источник
0

Для BS4 (и BS3 с небольшими изменениями) .. после нескольких часов поиска и испытаний, я нашел самое надежное решение этой проблемы, и оно даже решает проблему открытия более одного (всплывающая подсказка или всплывающее окно) одновременно, и проблема автоматического открытия после потери фокуса и т. д.

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

Я только протестировал это в начальной загрузке 4 и без вызова .show ()

el.tooltip('hide').attr('data-original-title', 'message');
ОБЛ
источник
-1

Вы можете использовать этот код, чтобы скрыть подсказку, изменить ее заголовок и снова показать подсказку, когда запрос ajax успешно завершится.

$(element).tooltip('hide');
$(element).attr('title','this is new title');
$(element).tooltip('fixTitle');
setTimeout(function() {  $(element).tooltip('show');}, 500);
Saifee
источник
-1

Я использую этот простой выход:

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

Полезно, если вам нужно изменить текст всплывающей подсказки после того, как он был инициализирован с помощью attr 'data-original-title'.

амин
источник