Содержимое 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 54

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);

демо: http://jsfiddle.net/44RvK

Да, вы можете, на самом деле самый простой способ еще не предложил.

вот мой способ ->

    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. Вот демонстрация:

async popover demo

вы можете скачать исходный демо здесь:

демо источник

хитрость, для меня, было написать 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();
});