How to update bootstrap popover text?

后端 未结 9 750
长发绾君心
长发绾君心 2020-12-07 20:31

I am using bootstrap-popover to show a message beside an element.

If I want to show different text in the popover after the first time, the text does not change. Re

相关标签:
9条回答
  • 2020-12-07 20:31

    Old question, but since I notice that the no answer provides the correct way and this is a common question, I'd like to update it.

    Use the $("a#test").popover("destroy");-method. Fiddle here.

    This will destroy the old popover and enable you to connect a new one again the regular way.

    Here's an example where you can click a button to set a new popover on an object that already has a popover attached. See fiddle for more detail.

    $("button.setNewPopoverContent").on("click", function(e) {
        e.preventDefault();
    
        $(".popoverObject").popover("destroy").popover({
            title: "New title"
            content: "New content"
        );
    });
    
    0 讨论(0)
  • 2020-12-07 20:34

    The question is more than one year old, but maybe this would be usefull for others.

    If the content is only changed while the popover is hidden, the easiest way I've found is using a function and a bit of JS code.

    Specifically, my HTML looks like:

    <input id="test" data-toggle="popover"
           data-placement="bottom" data-trigger="focus" />
    <div id="popover-content" style="display: none">
      <!-- Hidden div with the popover content -->
      <p>This is the popover content</p>
    </div>
    

    Please note no data-content is specified. In JS, when the popover is created, a function is used for the content:

    $('test').popover({
        html: true,
        content: function() { return $('#popover-content').html(); }
    });
    

    And now you can change anywhere the popover-content div and the popover will be updated the next time is shown:

    $('#popover-content').html("<p>New content</p>");
    

    I guess this idea will also work using plain text instead of HTML.

    0 讨论(0)
  • 2020-12-07 20:35

    just in-case anyone's looking for a solution that doesn't involve re-instantiating the popover and just want to change the content html, have a look at this:

    $('a#test').data('popover').$tip.find(".popover-content").html("<div>some new content yo</div>")
    

    Update: At some point between this answer being written and Bootstrap 3.2.0 (I suspect at 3.0?) this changed a little, to:

    $('a#test').data('bs.popover').tip().find ............
    
    0 讨论(0)
  • 2020-12-07 20:40

    You can always directly modify the DOM:

    $('a#test').next(".popover").find(".popover-content").html("Content");
    

    For example, if you want a popover that will load some data from an API and display that in the popover's content on hover:

        $("#myPopover").popover({
            trigger: 'hover'
        }).on('shown.bs.popover', function () {
            var popover = $(this);
            var contentEl = popover.next(".popover").find(".popover-content");
            // Show spinner while waiting for data to be fetched
            contentEl.html("<i class='fa fa-spinner fa-pulse fa-2x fa-fw'></i>");
    
            var myParameter = popover.data('api-parameter');
            $.getJSON("http://ipinfo.io/" + myParameter)
            .done(function (data) {
              var result = '';
              if (data.org) {
                result += data.org + '<br>';
              }
              if (data.city) {
                result += data.city + ', ';
              }
    
              if (data.region) {
                result += data.region + ' ';
              }
              if (data.country) {
                result += data.country;
              }
              if (result == '') {
                result = "No info found.";
              }
              contentEl.html(result);
            }).fail(function (data) {
              result = "No info found.";
              contentEl.html(result);
            });
        });
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet"/>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <a href="#" id="myPopover" data-toggle="popover" data-title="IP Details" data-api-parameter="151.101.1.69">Hover here for details on IP 151.101.1.69</a>

    This assumes that you trust the data supplied by the API. If not, you will need to escape the data returned to mitigate XSS attacks.

    0 讨论(0)
  • 2020-12-07 20:40

    Learn't from previous answers

    let popOverOptions = {
        trigger: 'click',
        ...
        };
    
    // save popOver instance
    let popOver = $(`#popover-unique-id`).popover(popOverOptions);
    
    // get its data
    let popOverData = popOver.data('bs.popover');
    
    // load data dynamically (may be with AJAX call)
    $(`#popover-unique-id`).on('shown.bs.popover', () => {
    
        setTimeout(() => {
    
            // set content, title etc...
            popOverData.config.content = 'content/////////';
    
            // updata the popup in realtime or else this will be shown next time opens
            popOverData.setContent();
    
            // Can add this if necessary for position correction: 
            popOver._popper.update();
    
        }, 2000);
    
    });
    

    This way we can update popover content easily.

    There's another way using destroy method. http://jsfiddle.net/bj5ryvop/5/

    0 讨论(0)
  • 2020-12-07 20:42

    You can access the options directly using the jquery data closure dictionary like this:

    $('a#test').data('bs.popover').options.content = 'new content';
    

    This code should work fine even after first initializing the popover.

    0 讨论(0)
提交回复
热议问题