Содержимое Bootstrap popover не может изменяться динамически
Я использую код следующим образом:
$(".reply").popover({
content: "Loading...",
placement: "bottom"
});
$(".reply").popover("toggle");
который создает popover и его содержимое правильно. Я хочу загрузить новые данные в popover, не закрывая popover.
Я пробовал следующие:
var thisVal = $(this);
$.ajax({
type: "POST",
async: false,
url: "Getdes",
data: { id: ID }
}).success(function(data) {
thisVal.attr("data-content", data);
});
после этого вызова данные в элементе изменяются, но не в поповере, который показан.
Как я должен делать это?
12 ответов:
если вы захватите экземпляр popover следующим образом:
var popover = $('.reply').data('bs.popover');
затем, чтобы перерисовать поповер, используйте
.setContent()
способ:popover.setContent();
я узнал, просматривая источник:https://github.com/twitter/bootstrap/blob/master/js/popover.js
так, в вашем примере, попробуйте:
thisVal.attr('data-content',data).data('bs.popover').setContent();
обновление
The
setContent()
метод также удаляет класс размещения, поэтому вы должны сделать:var popover = thisVal.attr('data-content',data).data('bs.popover'); popover.setContent(); popover.$tip.addClass(popover.options.placement);
Да, вы можете, на самом деле самый простой способ еще не предложил.
вот мой способ ->
var popover = $('#example').data('bs.popover'); popover.options.content = "YOUR NEW TEXT";
popover-это объект, если вы хотите узнать больше об этом, попробуйте сделать консоль.войти (popover) после того, как вы определяете его, чтобы увидеть, как вы можете использовать его после !
EDIT
начиная с Bootstrap 4 alpha 5, структура данных немного отличается. Вам нужно будет использовать
popover.config.content
вместоpopover.options.content
спасибо @kfriend за комментарий
в bootstrap 3:
if($el.data('bs.popover')) { $el.data('bs.popover').options.content = "New text"; } $el.popover('show');
большинство из этих решений на самом деле кажутся мне избитыми. Bootstrap стандартные документы имеют метод
destroy
Это можно использовать. Таким образом, при изменении контента через какое-то событие вы можете просто уничтожить, а затем воссоздать контент..popover('destroy')
это правильно динамически загружает, обновляет и повторно отображает содержимое из окна.
этот ответ с 2012 года не работает с Bootstrap 3 popovers. Я извлек рабочий раствор из этот вопрос:
$("#popover").данные-содержание АТР ('', 'новый контент');
Я решил проблему с помощью @David и @Sujay sreedharответ, но если поповер виден во время загрузки нового контента, поповер должен быть перемещен:
var popover = thisVal.attr('data-content',data).data('popover'); popover.setContent(); popover.$tip.addClass(popover.options.placement); // if popover is visible before content has loaded if ($(".reply").next('div.popover:visible').length){ // reposition popover.show(); }
если он не перемещается и новое содержимое имеет, например, другую высоту, всплывающее окно будет расширяться вниз, а стрелка будет вне цели!
кроме того, когда кнопка нажата после этого, она снова откроет всплывающее окно вместо его закрытия. Этот выше код решает, что проблема тоже.
Demo http://jsfiddle.net/whFv6/
(мое редактирование было отклонено, поэтому я решил опубликовать его здесь..)
ПРОСТОЕ РЕШЕНИЕ
вы можете попробовать этот :
//Bootstrap v3.3.7 var popoverEl = $("#popover"); popoverEl.attr("data-content", "NEW CONTENT"); popoverEl.popover("show");
спасибо.
после того, как popover был правильно инициализирован, вы можете напрямую использовать jquery для замены
class="popover-content"
элемент:$(".popover-content").html('a nice new content')
вы можете просто передать название функции
var content = 'Loading...' function dynamicContent(){ return content } $(".reply").popover({ content: dynamicContent, placement: "bottom" }); $(".reply").popover("toggle");
а затем динамически изменить содержимое переменной.
<button data-toggle="popover" data-html="true" data-content='<div id="myPopover">content</div>'>click</button> $('#myPopover').html('newContent')
Это очень чистый способ.
я написал асинхронный popover для bootstrap 3.1.1. Я просто назвал его
popoverasync
. Вот демонстрация:вы можете скачать исходный демо здесь:
хитрость, для меня, было написать
getContent
метод этого асинхронного popover, поэтому функция javascript пользователя для извлечения содержимого будет вызвана, ноgetContent
вернет анимацию ожидания, синхронно, назад к вызывающемуgetContent
. Таким образом, popover имеет контент в любом случае. Во-первых, пока пользователь ждет, и, наконец, когда контент поступает. То, что я имею в виду, можно найти внутриextensions.js
в демоверсии источник:надеюсь, что это поможет вам!
Дэн
HTML
<a data-toggle="popover" popover-trigger="outsideClick" title="Indicadores" data-content="" data-html="true" class="Evaluar" id="alun codigo"><span><i class="fa fa-check"></i>algun nombre</span></a>
JQUERY
$('a.Evaluar').on('click', function () { var a=$(this);//.attr('data-content', "mañana"); $.ajax({ url: "../IndicadorControlador?accion=BuscarPorProceso&cP=24", type: 'POST', dataType: 'json' }) .done(function (response) { //alert("done. "); var ind = ""; $(response).each(function (indice, elemento) { //alert(elemento.strIdentificador); //console.log('El elemento con el índice ' + indice + ' contiene ' + elemento.strIdentificador.toString()); ind += '<a href=#>'+elemento.strIdentificador.toString()+'</a>'; }); $(a).attr('data-content', ind); }) .fail(function () { sweetAlert("ERROR!", " Algo salió mal en el controlador!", "error"); }) .complete(function () { }); $('[data-toggle="popover"]').popover(); });