Tải nội dung bật lên Bootstrap bằng AJAX. Điều này có khả thi không?


90

Các phần thích hợp của những gì tôi đã thử ở đây:

<a href="#" data-content="<div id='my_popover'></div>"> Click here </a>

$(".button").popover({html: true})

$(".button").click(function(){
    $(this).popover('show');
    $("#my_popover").load('my_stuff')
})

Khi tôi nhấp vào, tôi thấy yêu cầu được thực hiện, nhưng không điền vào cửa sổ bật lên. Tôi thậm chí không thấy HTML cho popover được thêm vào DOM, nhưng đó có thể là firebug.

Có ai đã thử điều này?


1
Tôi chưa làm việc với bootstrap, nhưng tôi sẽ tưởng tượng rằng có thể phần tử này không tồn tại khi bạn đang cố thêm nội dung vào nó, nhưng đó là một phỏng đoán. Bạn có gặp bất kỳ lỗi javascript nào không?
Seth

Nếu bạn có nhiều cửa sổ bật lên và muốn tải nội dung khác nhau cho mỗi cửa sổ bật lên, thì câu trả lời này rất gọn gàng và cho phép bạn giữ lại nhiều thiết lập ngoài hộp cho cửa sổ bật lên - tất cả những gì bạn cần làm là lưu trữ ID của cửa sổ bật lên trên các thuộc tính của liên kết, và đọc chúng trong 'shown.bs.popover'xử lý: stackoverflow.com/a/39028723/1371408
Matty J

Câu trả lời:


105

Xem bài đăng trên blog của tôi để biết giải pháp hoạt động: https://medium.com/cagataygurturk/load-a-bootstrap-popover-content-with-ajax-8a95cd34f6a4

Đầu tiên, chúng ta nên thêm thuộc tính data-poload vào các phần tử mà bạn muốn thêm cửa sổ bật lên. Nội dung của thuộc tính này phải là url được tải (tuyệt đối hoặc tương đối):

<a href="#" title="blabla" data-poload="/test.php">blabla</a>

Và trong JavaScript, tốt nhất là trong $ (tài liệu) .ready ();

$('*[data-poload]').hover(function() {
    var e=$(this);
    e.off('hover');
    $.get(e.data('poload'),function(d) {
        e.popover({content: d}).popover('show');
    });
});

off('hover')ngăn tải dữ liệu nhiều lần và popover()liên kết một sự kiện di chuột mới. Nếu bạn muốn dữ liệu được làm mới tại mỗi sự kiện di chuột, bạn nên loại bỏ phần tắt.

Vui lòng xem JSFiddle hoạt động của ví dụ.


4
Tôi có một số điều kỳ lạ khi tôi di chuyển hai lần trước khi lệnh gọi ajax hoàn tất ... Cửa sổ bật lên của tôi sẽ "dính" mở. Tôi đã giải quyết nó bằng cách di chuyển "el.unbind ('hover')" sang ngay trước $ .get ().
Luke The Obscure vào

1
Điều này hoạt động, nhưng cửa sổ bật lên cũng gắn bó với tôi, mặc dù việc hủy liên kết là trước khi nhận được
Androme

2
Nếu bạn đang cố gắng tải một URL bên ngoài, bạn sẽ gặp phải các hạn chế truy cập tên miền chéo. Để giải quyết vấn đề này, bạn có thể đặt thuộc tính của cửa sổ bật htmllên true, sau đó đặt thuộc contenttính thành thẻ HTML iframe, chẳng hạn như content: '<iframe src="http://www.google.com"></iframe>'. Bạn cũng sẽ cần ghi đè thuộc max-widthtính của cửa sổ bật lên bằng CSS và rất có thể cũng phải xóa kiểu dáng của iframe bằng CSS.
Gavin

1
@FrzKhan bạn có thể sử dụng e.off('hover')phương pháp
codenamev

3
điều này không hoạt động do stackoverflow.com/questions/4111194/… thay đổi thành .hover (function () {}) hoạt động.
Developalexis

132

Hoạt động tốt cho tôi:

$('a.popup-ajax').popover({
    "html": true,
    "content": function(){
        var div_id =  "tmp-id-" + $.now();
        return details_in_popup($(this).attr('href'), div_id);
    }
});

function details_in_popup(link, div_id){
    $.ajax({
        url: link,
        success: function(response){
            $('#'+div_id).html(response);
        }
    });
    return '<div id="'+ div_id +'">Loading...</div>';
}

1
Câu trả lời thiên tài! và đó là lý do tại sao đã chỉnh sửa nó để làm cho nó dễ đọc hơn
itazzad

2
Giải pháp tuyệt vời. Tuy nhiên, với phiên bản hiện tại của bootstrap, có vẻ như der có thể là một số vấn đề với phương pháp này github.com/twbs/bootstrap/issues/12563. Tôi đã gặp sự cố hai lần và giải pháp nhanh chóng là đảm bảo một tiêu đề trong mỗi cửa sổ bật lên. Điều này cũng có nghĩa là tôi thực sự không bao giờ thấy văn bản Đang tải mà bạn đang sử dụng.
Rasmus Christensen

Hoạt động, ngoại trừ việc tôi phải sử dụng liên kết dữ liệu thay vì href, khi sử dụng href trình duyệt của tôi sẽ chỉ mở url trong href trong cửa sổ mới.
TinusSky

20
Điều này không gây ra vấn đề liên kết? Khi sử dụng phương pháp này trên 3.3.1 (và sử dụng Chrome), cửa sổ bật lên sẽ tự căn chỉnh khi "Đang tải ..." được hiển thị, nhưng ngay sau khi nội dung thực sự của cửa sổ bật lên của tôi được tải, căn chỉnh không điều chỉnh cho phù hợp .. .
Matt,

5
Giải pháp tốt. Một nhược điểm của giải pháp này là cuộc gọi ajax được thực hiện hai lần. Thành phần popover là một chú giải công cụ đầu tiên kiểm tra nội dung bằng cách sử dụng hasContent và sau đó lấy nội dung bằng setContent.
Liam

23

Sau khi đọc tất cả các giải pháp này, tôi nghĩ rằng giải pháp sẽ trở nên đơn giản hơn nhiều nếu bạn sử dụng một lệnh gọi ajax đồng bộ . Sau đó, bạn có thể sử dụng một cái gì đó như:

  $('#signin').popover({
    html: true,
    trigger: 'manual',
    content: function() {
      return $.ajax({url: '/path/to/content',
                     dataType: 'html',
                     async: false}).responseText;
    }
  }).click(function(e) {
    $(this).popover('toggle');
  });

1
Điều này đã giúp tôi rất nhiều, vì tôi đang gặp sự cố với hiển thị cửa sổ bật lên ở một vị trí nhất định trước khi ajax trả lại nội dung (khiến nó tải ra khỏi màn hình). Cảm ơn ngài!
Derek

Nó có thể đơn giản hơn, nhưng cũng kém thanh lịch hơn so với giải pháp được đăng bởi @Ivan Klass.
Ian Kemp

6
async: falsegiết chết này cho tôi
mxmissile

Mặc dù chắc chắn là dễ dàng hơn, nhưng JavaScript và mã đồng bộ không thực sự kết hợp tốt với nhau. Vì JavaScript là một luồng nên sẽ chặn bất kỳ mã nào thực thi trong thời gian có yêu cầu.
IluTov

1
AJAX đồng bộ không được dùng nữa.
Barmar

9

Tôi đã cập nhật câu trả lời phổ biến nhất. Nhưng trong trường hợp những thay đổi của tôi không được chấp thuận, tôi đưa ra đây một câu trả lời riêng.

Sự khác biệt là:

  • TẢI văn bản hiển thị trong khi nội dung đang tải. Rất tốt cho kết nối chậm.
  • Đã loại bỏ hiện tượng nhấp nháy xảy ra khi chuột rời khỏi cửa sổ bật lên lần đầu tiên.

Đầu tiên, chúng ta nên thêm thuộc tính data-poload vào các phần tử mà bạn muốn thêm cửa sổ bật lên. Nội dung của thuộc tính này phải là url được tải (tuyệt đối hoặc tương đối):

<a href="#" data-poload="/test.php">HOVER ME</a>

Và trong JavaScript, tốt nhất là trong $ (tài liệu) .ready ();

 // On first hover event we will make popover and then AJAX content into it.
$('[data-poload]').hover(
    function (event) {
        var el = $(this);

        // disable this event after first binding 
        el.off(event);

        // add initial popovers with LOADING text
        el.popover({
            content: "loading…", // maybe some loading animation like <img src='loading.gif />
            html: true,
            placement: "auto",
            container: 'body',
            trigger: 'hover'
        });

        // show this LOADING popover
        el.popover('show');

        // requesting data from unsing url from data-poload attribute
        $.get(el.data('poload'), function (d) {
            // set new content to popover
            el.data('bs.popover').options.content = d;

            // reshow popover with new content
            el.popover('show');
        });
    },
    // Without this handler popover flashes on first mouseout
    function() { }
);

off('hover')ngăn tải dữ liệu nhiều lần và popover()liên kết một sự kiện di chuột mới. Nếu bạn muốn dữ liệu được làm mới tại mỗi sự kiện di chuột, bạn nên loại bỏ phần tắt.

Vui lòng xem JSFiddle hoạt động của ví dụ.


7

Một biến thể của mã từ Çağatay Gürtürk, thay vào đó bạn có thể sử dụng hàm ủy nhiệm và buộc ẩn cửa sổ bật lên trên hoverout.

$('body').delegate('.withajaxpopover','hover',function(event){
    if (event.type === 'mouseenter') {
        var el=$(this);
        $.get(el.attr('data-load'),function(d){
            el.unbind('hover').popover({content: d}).popover('show');
        });
    }  else {
        $(this).popover('hide');
    }
});

Đối với jquery gần đây: $ ('* [data-poload]'). On ('mouseenter mouseleave', function (event) {
jpprade

7

Giải pháp của Çağatay Gürtürk rất hay nhưng tôi đã trải qua sự kỳ lạ tương tự được mô tả bởi Luke The Obscure:

Khi tải ajax kéo dài quá nhiều (hoặc các sự kiện chuột diễn ra quá nhanh), chúng tôi có .popover ('hiển thị') và không có .popover ('ẩn') trên một phần tử nhất định khiến cửa sổ bật lên vẫn mở.

Tôi thích giải pháp tải trước khổng lồ này, tất cả nội dung cửa sổ bật lên được tải và các sự kiện được xử lý bởi bootstrap giống như trong cửa sổ bật lên thông thường (tĩnh).

$('.popover-ajax').each(function(index){

    var el=$(this);

    $.get(el.attr('data-load'),function(d){
        el.popover({content: d});       
    });     

});

7

Vào năm 2015, đây là câu trả lời tốt nhất

$('.popup-ajax').mouseenter(function() {
   var i = this
   $.ajax({
      url: $(this).attr('data-link'), 
      dataType: "html", 
      cache:true, 
      success: function( data{
         $(i).popover({
            html:true,
            placement:'left',
            title:$(i).html(),
            content:data
         }).popover('show')
      }
   })
});

$('.popup-ajax').mouseout(function() {
  $('.popover:visible').popover('destroy')
});

6

Giải pháp khác:

$target.find('.myPopOver').mouseenter(function()
{
    if($(this).data('popover') == null)
    {
        $(this).popover({
            animation: false,
            placement: 'right',
            trigger: 'manual',
            title: 'My Dynamic PopOver',
            html : true,
            template: $('#popoverTemplate').clone().attr('id','').html()
        });
    }
    $(this).popover('show');
    $.ajax({
        type: HTTP_GET,
        url: "/myURL"

        success: function(data)
        {
            //Clean the popover previous content
            $('.popover.in .popover-inner').empty();    

            //Fill in content with new AJAX data
            $('.popover.in .popover-inner').html(data);

        }
    });

});

$target.find('.myPopOver').mouseleave(function()
{
    $(this).popover('hide');
});

Ý tưởng ở đây là để kích hoạt bằng tay màn hình hiển thị của PopOver với mouseenter & MouseLeave sự kiện.

Trên mouseenter , nếu không có PopOver nào được tạo cho mục của bạn ( if ($ (this) .data ('popover') == null) ), hãy tạo nó. Điều thú vị là bạn có thể xác định nội dung PopOver của riêng mình bằng cách chuyển nó dưới dạng đối số ( mẫu ) cho hàm popover () . Đừng quên đặt tham số html thành true .

Ở đây tôi chỉ tạo một mẫu ẩn có tên là popovertemplate và sao chép nó với JQuery. Đừng quên xóa thuộc tính id sau khi bạn sao chép nó, nếu không, bạn sẽ kết thúc với các id trùng lặp trong DOM. Cũng lưu ý rằng style = "display: none" để ẩn mẫu trong trang.

<div id="popoverTemplateContainer" style="display: none">

    <div id="popoverTemplate">
        <div class="popover" >
            <div class="arrow"></div>
            <div class="popover-inner">
                //Custom data here
            </div>
        </div>
    </div>
</div>

Sau bước tạo (hoặc nếu nó đã được tạo), bạn chỉ cần hiển thị popOver với $ (this) .popover ('show');

Sau đó, cuộc gọi Ajax cổ điển. Để thành công, bạn cần phải làm sạch nội dung cửa sổ bật lên cũ trước khi đưa dữ liệu mới mới từ máy chủ . Làm cách nào để chúng tôi có được nội dung popover hiện tại? Với bộ chọn .popover.in ! Lớp .in chỉ ra rằng cửa sổ bật lên hiện đang được hiển thị, đó là mẹo ở đây!

Để kết thúc, trên sự kiện mouseleave , chỉ cần ẩn cửa sổ bật lên.


Điều tương tự đối với tôi, điều đơn giản nhất & tốt nhất ;-)
Thomas Decaux

vấn đề với điều này là trên mỗi lần di chuột mà bạn đang yêu cầu dữ liệu từ máy chủ. Nó chỉ nên tải dữ liệu một lần.
Richard Torcato

2
@Richard Torcato Một mặt, bạn đã đúng. Tuy nhiên, sẽ khá dễ dàng để đưa kết quả vào bộ nhớ cache. Mặt khác, có thể chúng tôi muốn nhấn máy chủ để tải dữ liệu mới trên mỗi lần di chuột. Vì vậy, việc triển khai bộ nhớ đệm là tùy thuộc vào bạn
doanduyhai

Tôi nhận ra rằng cái này đã cũ rồi, nhưng trong trường hợp ai đó đang nhìn vào cái này, tôi không thể tưởng tượng nó hoạt động tốt như nó là nếu bạn có nhiều cửa sổ bật lên và bạn cuộn qua mỗi cửa sổ trong số chúng. Di chuột qua A, yêu cầu được gửi cho A, Di chuột qua B và di chuột vào nó, yêu cầu được gửi cho B, phản hồi từ B đến, cập nhật cửa sổ bật lên cho B, phản hồi cho A đến, cập nhật cửa sổ bật lên cho B (vì hàm thành công sẽ . bất cứ điều gì chỉ rõ ràng với lớp đó Nhìn vào này để bổ sung sức giúp đỡ trên mặc dù stackoverflow.com/a/34030999/2524589
KSib

3

Đây là giải pháp của tôi cũng hoạt động tốt với nội dung được tải ajax.

/*
 * popover handler assigned document (or 'body') 
 * triggered on hover, show content from data-content or 
 * ajax loaded from url by using data-remotecontent attribute
 */
$(document).popover({
    selector: 'a.preview',
    placement: get_popover_placement,
    content: get_popover_content,
    html: true,
    trigger: 'hover'
});

function get_popover_content() {
    if ($(this).attr('data-remotecontent')) {
        // using remote content, url in $(this).attr('data-remotecontent')
        $(this).addClass("loading");
        var content = $.ajax({
            url: $(this).attr('data-remotecontent'),
            type: "GET",
            data: $(this).serialize(),
            dataType: "html",
            async: false,
            success: function() {
                // just get the response
            },
            error: function() {
                // nothing
            }
        }).responseText;
        var container = $(this).attr('data-rel');
        $(this).removeClass("loading");
        if (typeof container !== 'undefined') {
            // show a specific element such as "#mydetails"
            return $(content).find(container);
        }
        // show the whole page
        return content;
    }
    // show standard popover content
    return $(this).attr('data-content');
}

function get_popover_placement(pop, el) {
    if ($(el).attr('data-placement')) {
        return $(el).attr('data-placement');
    }
    // find out the best placement
    // ... cut ...
    return 'left';
}

3

Nếu nội dung trong cửa sổ bật lên không có khả năng thay đổi, bạn chỉ nên truy xuất nội dung đó một lần. Ngoài ra, một số giải pháp ở đây có vấn đề là nếu bạn di chuyển nhanh qua nhiều "bản xem trước", bạn sẽ nhận được nhiều cửa sổ bật lên đang mở. Giải pháp này giải quyết cả hai điều đó.

$('body').on('mouseover', '.preview', function() 
{
    var e = $(this);
    if (e.data('title') == undefined)
    {
        // set the title, so we don't get here again.
        e.data('title', e.text());

        // set a loader image, so the user knows we're doing something
        e.data('content', '<img src="/images/ajax-loader.gif" />');
        e.popover({ html : true, trigger : 'hover'}).popover('show');

        // retrieve the real content for this popover, from location set in data-href
        $.get(e.data('href'), function(response)
        {
            // set the ajax-content as content for the popover
            e.data('content', response.html);

            // replace the popover
            e.popover('destroy').popover({ html : true, trigger : 'hover'});

            // check that we're still hovering over the preview, and if so show the popover
            if (e.is(':hover'))
            {
                e.popover('show');
            }
        });
    }
});

3

Tôi nghĩ rằng giải pháp của tôi đơn giản hơn với chức năng mặc định.

http://jsfiddle.net/salt/wbpb0zoy/1/

$("a.popover-ajax").each(function(){
		 $(this).popover({
			trigger:"focus",
			placement: function (context, source) {
                  var obj = $(source);
				  $.get(obj.data("url"),function(d) {
                        $(context).html( d.titles[0].title)
                  });	
			},
			html:true,
			content:"loading"
		 });
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/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.6/js/bootstrap.min.js"></script>


<ul class="list-group">
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Cras justo odio</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Dapibus ac facilisis in</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Morbi leo risus</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Porta ac consectetur ac</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Vestibulum at eros</a></li>
</ul>


1

Tôi đã thử giải pháp của Çağatay Gürtürk nhưng có cùng điều kỳ lạ với Luke the Ít người biết đến. Sau đó đã thử giải pháp của Asa Kusuma. Điều này hoạt động, nhưng tôi tin rằng Ajax sẽ đọc mỗi khi cửa sổ bật lên được hiển thị. Lệnh gọi hủy liên kết ('hover') không có hiệu lực. Đó là bởi vì ủy quyền đang giám sát các sự kiện trong một lớp cụ thể - nhưng lớp đó không thay đổi.

Đây là giải pháp của tôi, dựa trên Asa Kusuma. Các thay đổi:

  • Đã thay thế delegatebằng onđể khớp với các thư viện JQuery mới.
  • Xóa lớp 'withajaxpopover' thay vì sự kiện di chuột không liên kết (không bao giờ bị ràng buộc)
  • Thêm "trigger: hover" vào cửa sổ bật lên để Bootstrap sẽ xử lý hoàn toàn nó bắt đầu với lần sử dụng thứ hai.
  • Hàm tải dữ liệu của tôi trả về JSon, giúp dễ dàng chỉ định cả tiêu đề và nội dung cho cửa sổ bật lên.
    / * Mục tiêu: Hiển thị chú giải công cụ / cửa sổ bật lên nơi nội dung được tải xuống từ
              ứng dụng lần đầu tiên duy nhất.

        Cách thực hiện: Tìm nạp nội dung phù hợp và đăng ký chú giải công cụ / cửa sổ bật lên lần đầu tiên 
              chuột nhập phần tử DOM có lớp "withajaxpopover". Gỡ bỏ
              lớp từ phần tử để chúng tôi không làm điều đó vào lần sau khi con chuột vào.
              Tuy nhiên, điều đó không hiển thị chú giải công cụ / cửa sổ bật lên lần đầu tiên
              (vì chuột đã được nhập khi chú giải công cụ được đăng ký).
              Vì vậy, chúng ta phải tự mình hiển thị / ẩn nó đi.
    * /
    $ (function () {
      $ ('body'). on ('hover', '.withajaxpopover', function (event) {
          if (event.type === 'mouseenter') {
              var el = $ (this);
              $ .get (el.attr ('data-load'), function (d) {
                  el.removeClass ('withajaxpopover')
                  el.popover ({trigger: 'hover', 
                              tiêu đề: d.title, 
                              content: d.content}). popover ('show');
              });
          } khác {
              $ (this) .popover ('hide');
          }
      });
    });

1

Tôi đã thử một số gợi ý ở đây và tôi muốn trình bày của tôi (hơi khác một chút) - Tôi hy vọng nó sẽ giúp ích cho ai đó. Tôi muốn hiển thị cửa sổ bật lên khi nhấp chuột đầu tiên và ẩn nó khi nhấp chuột thứ hai (tất nhiên với việc cập nhật dữ liệu mỗi lần). Tôi đã sử dụng một biến bổ sung visableđể biết liệu cửa sổ bật lên có hiển thị hay không. Đây là mã của tôi: HTML:

<button type="button" id="votingTableButton" class="btn btn-info btn-xs" data-container="body" data-toggle="popover" data-placement="left" >Last Votes</button>

Javascript:

$('#votingTableButton').data("visible",false);

$('#votingTableButton').click(function() {  
if ($('#votingTableButton').data("visible")) {
    $('#votingTableButton').popover("hide");
    $('#votingTableButton').data("visible",false);          
}
else {
    $.get('votingTable.json', function(data) {
        var content = generateTableContent(data);
        $('#votingTableButton').popover('destroy');
        $('#votingTableButton').popover({title: 'Last Votes', 
                                content: content, 
                                trigger: 'manual',
                                html:true});
        $('#votingTableButton').popover("show");
        $('#votingTableButton').data("visible",true);   
    });
}   
});

Chúc mừng!


1
<button type="button" id="popover2" title="" data-content="<div id='my_popover' style='height:250px;width:300px;overflow:auto;'>Loading...Please Wait</div>" data-html="true" data-toggle="popover2" class="btn btn-primary" data-original-title="A Title">Tags</button>

$('#popover2').popover({ 
    html : true,
    title: null,
    trigger: "click",
    placement:"right"
});

$("#popover2").on('shown.bs.popover', function(){
    $('#my_popover').html("dynamic content loaded");

});

1

Đây là một cách giải quyết một số vấn đề:

  1. Các vấn đề về căn chỉnh sau khi nội dung được cập nhật, đặc biệt nếu vị trí là "hàng đầu". Chìa khóa đang gọi._popper.update() , tính toán lại vị trí của cửa sổ bật lên.
  2. Chiều rộng thay đổi sau khi nội dung được cập nhật. Nó không phá vỡ bất cứ điều gì, nó chỉ trông chói tai cho người dùng. Để giảm bớt điều đó, tôi đặt chiều rộng của cửa sổ bật lên thành 100% (sau đó được giới hạn bởi dấu max-width).
var e = $("#whatever");
e.popover({
    placement: "top",
    trigger: "hover",
    title: "Test Popover",
    content: "<span class='content'>Loading...</span>",
    html: true
}).on("inserted.bs.popover", function() {
    var popover = e.data('bs.popover');
    var tip = $(popover.tip);
    tip.css("width", "100%");
    $.ajax("/whatever")
        .done(function(data) {
            tip.find(".content").text(data);
            popover._popper.update();
        }).fail(function() {
            tip.find(".content").text("Sorry, something went wrong");
        });
});

Tôi thích các khái niệm, nhưng tiếc là chúng không phù hợp với tôi ... (cụ thể là cập nhật vị trí và chiều rộng 100%) Không chắc liệu những điều này có thay đổi với Bootstrap 4 không?
Ben in CA

Chiều rộng 100% có thể phụ thuộc vào cách các phần tử của bạn được bố trí ... có thể. Hộp có còn mở rộng sau khi nội dung được tải không?
Gabriel Luci

Đối với vị trí này, bạn có thể đặt một breakpoint tại popover._popper.update()và chắc chắn rằng popover, _popperupdatetất cả đều có những giá trị mong đợi. Chắc chắn có thể là những điều đó đã thay đổi.
Gabriel Luci,

Đúng - hộp mở rộng sau nội dung mới. Và tôi đã thử ghi một số giá trị vào bảng điều khiển và không được xác định.
Ben in CA

1
- Bạn đúng. Hóa ra tôi đã cố gắng làm một số thứ phức tạp hơn cùng một lúc và sau đó nó không hoạt động. Nhưng bây giờ tôi cũng có thể kết hợp điều đó. Đây là một fiddle: jsfiddle.net/udfz5wrv/1 Cho phép bạn sử dụng các bộ chọn (nếu bạn cần liên kết các trình xử lý, v.v.), truy cập dữ liệu từ bộ chọn, hiển thị một vòng quay tải bootstrap, v.v.
Ben in CA

1

Có quá nhiều câu trả lời ở đây nhưng tôi cũng không tìm thấy câu trả lời nào trong số đó là những gì tôi muốn. Tôi đã mở rộng câu trả lời của Ivan Klass là cả Bootstrap 4 đều thích hợp và được lưu trữ thông minh.

Lưu ý rằng đoạn mã sẽ không thực sự tải địa chỉ từ xa do chính sách CORS của Stackoverflow.

var popoverRemoteContents = function(element) {
  if ($(element).data('loaded') !== true) {
    var div_id = 'tmp-id-' + $.now();
    $.ajax({
      url: $(element).data('popover-remote'),
      success: function(response) {
        $('#' + div_id).html(response);
        $(element).attr("data-loaded", true);
        $(element).attr("data-content", response);
        return $(element).popover('update');
      }
    });
    return '<div id="' + div_id + '">Loading...</div>';
  } else {
    return $(element).data('content');
  }
};

$('[data-popover-remote]').popover({
  html: true,
  trigger: 'hover',
  content: function() {
    return popoverRemoteContents(this);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.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>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>

<span data-popover-remote="http://example.com/">Remote Popover test with caching</span>


Tôi đã có thể điều chỉnh cái này một cách dễ dàng với giải pháp tôi cần. Cảm ơn bạn!
Nieminen

0

một câu trả lời tương tự như điều này đã được đưa ra trong chủ đề này: Đặt nội dung dữ liệu và hiển thị cửa sổ bật lên - đó là một cách tốt hơn để thực hiện những gì bạn hy vọng đạt được. Nếu không, bạn sẽ phải sử dụng tùy chọn live: true trong các tùy chọn của phương thức bật lên. Hy vọng rằng điều này sẽ giúp


0
$("a[rel=popover]").each(function(){
        var thisPopover=$(this);
                var thisPopoverContent ='';
                if('you want a data inside an html div tag') {
                thisPopoverContent = $(thisPopover.attr('data-content-id')).html();
                }elseif('you want ajax content') {
                    $.get(thisPopover.attr('href'),function(e){
                        thisPopoverContent = e;
                    });
            }
        $(this).attr(   'data-original-title',$(this).attr('title') );
        thisPopover.popover({
            content: thisPopoverContent
        })
        .click(function(e) {
            e.preventDefault()
        });

    });

lưu ý rằng tôi đã sử dụng cùng một thẻ href và làm cho nó không thay đổi trang khi nhấp vào, đây là một điều tốt cho SEO và cả nếu người dùng không có javascript!


0

Tôi thích giải pháp của Çağatay, nhưng tôi không thấy cửa sổ bật lên khi di chuột ra. Tôi đã thêm chức năng bổ sung này với cái này:

// hides the popup
$('*[data-poload]').bind('mouseout',function(){
   var e=$(this);
   e.popover('hide'); 
});

0

Tôi đã sử dụng giải pháp ban đầu nhưng đã thực hiện một số thay đổi:

Đầu tiên, tôi sử dụng getJSON()thay get()vì vì tôi đang tải tập lệnh json. Tiếp theo, tôi đã thêm hành vi kích hoạt của di chuột để khắc phục sự cố cửa sổ bật lên dính.

$('*[data-poload]').on('mouseover',function() {
    var e=$(this);
    $.getJSON(e.data('poload'), function(data){
        var tip;
        $.each(data, function (index, value) {
           tip = this.tip;
           e.popover({content: tip, html: true, container: 'body', trigger: 'hover'}).popover('show');
        });
    });
});

0

Tôi đã thêm html: true, vì vậy nó không hiển thị đầu ra html thô, trong trường hợp bạn muốn định dạng kết quả của mình. Bạn cũng có thể thêm nhiều điều khiển hơn.

    $('*[data-poload]').bind('click',function() {
        var e=$(this);
        e.unbind('click');
        $.get(e.data('poload'),function(d) {
            e.popover({content: d, html: true}).popover('show', {

            });
        });
    });

0

Hiển thị cửa sổ bật lên ajax trên phần tử tĩnh với trình kích hoạt di chuột:

$('.hover-ajax').popover({
    "html": true,
    trigger: 'hover',
    "content": function(){
        var div_id =  "tmp-id-" + $.now();
        return details_in_popup($(this).attr('href'), div_id);
    }
});

function details_in_popup(link, div_id){
    $.ajax({
        url: link,
        success: function(response){
            $('#'+div_id).html(response);
        }
    });
    return '<div id="'+ div_id +'">Loading...</div>';
}

Html:

<span class="hover-ajax" href="http://domain.tld/file.php"> Hey , hoover me ! </span>

0
  $('[data-poload]').popover({
    content: function(){
      var div_id =  "tmp-id-" + $.now();
      return details_in_popup($(this).data('poload'), div_id, $(this));
    },
    delay: 500,

    trigger: 'hover',
    html:true
  });

  function details_in_popup(link, div_id, el){
      $.ajax({
          url: link,
          cache:true,
          success: function(response){
              $('#'+div_id).html(response);
              el.data('bs.popover').options.content = response;
          }
      });
      return '<div id="'+ div_id +'"><i class="fa fa-spinner fa-spin"></i></div>';
  }   

Nội dung Ajax được tải một lần! xemel.data('bs.popover').options.content = response;


0

Tôi đã làm và nó hoạt động hoàn hảo với ajax và tải nội dung bật lên.

var originalLeave = $.fn.popover.Constructor.prototype.leave;
        $.fn.popover.Constructor.prototype.leave = function(obj){
            var self = obj instanceof this.constructor ?
                obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
            var container, timeout;

            originalLeave.call(this, obj);

            if(obj.currentTarget) {
                container = $(obj.currentTarget).siblings('.popover')
                timeout = self.timeout;
                container.one('mouseenter', function(){
                    //We entered the actual popover – call off the dogs
                    clearTimeout(timeout);
                    //Let's monitor popover content instead
                    container.one('mouseleave', function(){
                        $.fn.popover.Constructor.prototype.leave.call(self, self);
                    });
                })
            }
        };
        var attr = 'tooltip-user-id';
        if ($('a['+ attr +']').length)
            $('a['+ attr +']').popover({
                html: true,
                trigger: 'click hover',
                placement: 'auto',
                content: function () {
                    var this_ = $(this);
                    var userId = $(this).attr(attr);
                    var idLoaded = 'tooltip-user-id-loaded-' + userId;
                    var $loaded = $('.' + idLoaded);
                    if (!$loaded.length) {
                        $('body').append('<div class="'+ idLoaded +'"></div>');
                    } else if ($loaded.html().length) {
                        return $loaded.html();
                    }
                    $.get('http://example.com', function(data) {
                        $loaded.html(data);
                        $('.popover .popover-content').html(data);
                        this_.popover('show');
                    });
                    return '<img src="' + base_url + 'assets/images/bg/loading.gif"/>';
                },
                delay: {show: 500, hide: 1000},
                animation: true
            });

Bạn có thể xem qua http://kienthuchoidap.com . Di chuyển cái này và di chuột đến tên người dùng của người dùng.


0

Đối với tôi công việc thay đổi dữ liệu-nội dung befora tải bật lên:

$('.popup-ajax').data('content', function () {
    var element = this;
    $.ajax({
        url: url,
        success: function (data) {

            $(element).attr('data-content', data)

            $(element).popover({
                html: true,
                trigger: 'manual',
                placement: 'left'
            });
            $(element).popover('show')
        }})
})

0

Điều này phù hợp với tôi, mã này khắc phục sự cố căn chỉnh có thể:

<a class="ajax-popover" data-container="body" data-content="Loading..." data-html="data-html" data-placement="bottom" data-title="Title" data-toggle="popover" data-trigger="focus" data-url="your_url" role="button" tabindex="0" data-original-title="" title="">
  <i class="fa fa-info-circle"></i>
</a>

$('.ajax-popover').click(function() {
  var e = $(this);
  if (e.data('loaded') !== true) {
    $.ajax({
      url: e.data('url'),
      dataType: 'html',
      success: function(data) {
        e.data('loaded', true);
        e.attr('data-content', data);
        var popover = e.data('bs.popover');
        popover.setContent();
        popover.$tip.addClass(popover.options.placement);
        var calculated_offset = popover.getCalculatedOffset(popover.options.placement, popover.getPosition(), popover.$tip[0].offsetWidth, popover.$tip[0].offsetHeight);
        popover.applyPlacement(calculated_offset, popover.options.placement);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        return instance.content('Failed to load data');
      }
    });
  }
});

Đề phòng trường hợp, điểm cuối tôi đang sử dụng trả về html (một phần rails)

Tôi đã lấy một số phần của mã từ đây https://stackoverflow.com/a/13565154/3984542

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.