我尝试的相应部分在这里:
<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')
})
当我点击时,我看到请求已经完成,但是没有填充弹出窗口。我甚至没有看到用于弹出窗口的HTML被添加到DOM中,但这可能是萤火虫。
有人试过吗?
答案 0 :(得分:117)
对我来说没问题:
$('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 :(得分:101)
请参阅我的博文,了解有效的解决方案:https://medium.com/cagataygurturk/load-a-bootstrap-popover-content-with-ajax-8a95cd34f6a4
首先,我们应该为您想要的元素添加data-poload属性 喜欢添加一个弹出窗口。该属性的内容应该是 要加载的URL(绝对或相对):
<a href="#" title="blabla" data-poload="/test.php">blabla</a>
在JavaScript中,最好是在$(document).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')
会阻止多次加载数据并popover()
绑定 一个新的悬停事件。如果您希望在每次悬停时刷新数据 事件,你应该删除。请参阅示例的正常工作JSFiddle。
答案 2 :(得分:23)
阅读完所有这些解决方案之后,如果您使用同步 ajax调用,我认为解决方案会变得更加简单。然后你可以使用类似的东西:
$('#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');
});
答案 3 :(得分:8)
来自ÇağatayGürtürk的代码的变体,您可以使用委托函数,并强制将弹出窗口隐藏在悬停上。
$('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');
}
});
答案 4 :(得分:8)
我更新了最受欢迎的答案。但是如果我的修改不会被批准,我在这里单独给出答案。
差异是:
首先,我们应该为您想要的元素添加data-poload属性 喜欢添加一个弹出窗口。该属性的内容应该是 要加载的URL(绝对或相对):
<a href="#" data-poload="/test.php">HOVER ME</a>
在JavaScript中,最好是在$(document).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')
会阻止多次加载数据并popover()
绑定
一个新的悬停事件。如果您希望在每次悬停时刷新数据
事件,你应该删除。
请参阅示例的正常工作JSFiddle。
答案 5 :(得分:6)
另一种解决方案:
$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');
});
这里的想法是通过 mouseenter &amp;来手动触发PopOver的显示。 mouseleave 事件。
在 mouseenter 上,如果没有为您的商品创建PopOver( if($(this).data('popover')== null)),请创建它。有趣的是,您可以通过将其作为参数(模板)传递给 popover()函数来定义自己的PopOver内容。不要忘记将 html 参数设置为 true 。
这里我只创建一个名为 popovertemplate 的隐藏模板,并使用JQuery进行克隆。 克隆后不要忘记删除id属性否则你最终会在DOM中找到重复的ID。另请注意 style =“display:none”以隐藏页面中的模板。
<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>
在创建步骤之后(或者如果已经创建),您只需使用 $(this).popover('show');
显示popOver然后是经典的Ajax调用。成功后,您需要在从服务器添加新的新数据之前清除旧的popover内容。我们如何获得当前的popover内容?使用 .popover.in 选择器! .in 类表示当前显示了popover,这就是诀窍!
要完成,请在 mouseleave 事件中隐藏弹出框。
答案 6 :(得分:6)
ÇağatayGürtürk的解决方案很不错,但我经历了Luke The Obscure描述的同样奇怪:
当ajax加载持续太多(或鼠标事件太快)时,我们在给定元素上有一个.popover('show')和没有.popover('hide'),导致popover保持打开状态。
我更喜欢这种大规模预加载解决方案,所有popover内容都被加载,事件由正常(静态)弹出窗口中的引导程序处理。
$('.popover-ajax').each(function(index){
var el=$(this);
$.get(el.attr('data-load'),function(d){
el.popover({content: d});
});
});
答案 7 :(得分:6)
2015年,这是最好的答案
$('.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')
});
答案 8 :(得分:3)
我认为我的解决方案更简单,具有默认功能。
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"
});
});
&#13;
<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>
&#13;
答案 9 :(得分:3)
如果popover中的内容不太可能改变,那么只检索一次它是有意义的。此外,这里的一些解决方案存在的问题是,如果您快速移动多个“预览”,则会获得多个打开的弹出窗口。 这个解决方案解决了这两个问题。
$('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');
}
});
}
});
答案 10 :(得分:2)
这里的答案太多了,但是我也没有一个是我想要的。我已经将Ivan Klass的答案扩展为既适用于Bootstrap 4又具有智能缓存功能。
请注意,由于Stackoverflow的CORS策略,该代码段实际上不会加载远程地址。
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>
答案 11 :(得分:2)
这是我的解决方案,也适用于加载了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';
}
答案 12 :(得分:1)
我在这里尝试了一些建议,我想介绍一下(这有点不同) - 我希望它会帮助某人。我想在第一次点击时显示弹出窗口并在第二次点击时隐藏(当然每次更新数据)。
我使用了一个额外的变量visable
来知道弹出窗口是否可见。
这是我的代码:
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);
});
}
});
干杯!
答案 13 :(得分: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");
});
答案 14 :(得分:1)
我尝试了ÇağatayGürtürk的解决方案,但却和Luke the Obscure一样神秘。然后尝试了Asa Kusuma的解决方案。这是有效的,但我相信它会在显示弹出框的每个时读取。对unbind的调用('hover')无效。那是因为委托正在监视特定类中的事件 - 但该类没有改变。
这是我的解决方案,紧密基于Asa Kusuma的。变化:
delegate
替换on
以匹配新的JQuery库。/* Goal: Display a tooltip/popover where the content is fetched from the application the first time only. How: Fetch the appropriate content and register the tooltip/popover the first time the mouse enters a DOM element with class "withajaxpopover". Remove the class from the element so we don't do that the next time the mouse enters. However, that doesn't show the tooltip/popover for the first time (because the mouse is already entered when the tooltip is registered). So we have to show/hide it ourselves. */ $(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', title: d.title, content: d.content}).popover('show'); }); } else { $(this).popover('hide'); } }); });
答案 15 :(得分:0)
我使用了原始解决方案,但进行了一些更改:
首先,我使用getJSON()
而不是get()
,因为我正在加载json脚本。接下来,我添加了悬停的触发器行为以修复粘滞弹出问题。
$('*[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');
});
});
});
答案 16 :(得分:0)
在这个帖子中给出了与此类似的答案:Setting data-content and displaying popover - 这是一种更好的方式来做你希望实现的目标。否则,您必须在popover方法的选项中使用live:true选项。希望这有助于
答案 17 :(得分:0)
我添加了html:true,因此它不会显示原始html输出,以防您想要格式化结果。您还可以添加更多控件。
$('*[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', {
});
});
});
答案 18 :(得分:0)
使用悬停触发器在静态元素上显示ajax popover:
$('.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>
答案 19 :(得分: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>';
}
Ajax内容加载一次!见el.data('bs.popover').options.content = response;
答案 20 :(得分:0)
我做了,并且使用ajax和加载popover内容完成了它的工作。
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
});
您可以查看http://kienthuchoidap.com。转到此处并将鼠标悬停在用户名。
答案 21 :(得分:0)
我喜欢Çağatay的解决方案,但我弹出窗口并没有隐藏在mouseout上。我添加了这个额外的功能:
// hides the popup
$('*[data-poload]').bind('mouseout',function(){
var e=$(this);
e.popover('hide');
});
答案 22 :(得分: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()
});
});
请注意,我使用了相同的href标签并使其在点击时不会更改页面,这对SEO来说是件好事,如果用户没有javascript也是如此!
答案 23 :(得分:0)
对我来说,工作更改数据内容befora load popover:
$('.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')
}})
})
答案 24 :(得分:0)
这适用于我,此代码修复了可能的对齐问题:
library(data.table)
dat<-data.table(problem)
setkey(dat, pickup_zipcode, pickup_name)
dat[J(94107, "Safeway"), pickup_name:="Safeway-H2"]
setkey(dat, pickup_zipcode, pickup_name)
dat[J(94107, "Whole Foods Market"), pickup_name:="Whole Foods Market-H1"]
setkey(dat, pickup_zipcode, pickup_name)
dat[J(94110, "Pizzeria Delfina"), pickup_name:="Pizzeria Delfina-H3"]
以防万一,我正在使用的端点返回html(一个rails部分)
我从这里获取了部分代码https://stackoverflow.com/a/13565154/3984542
答案 25 :(得分:0)
以下是解决一些问题的方法:
._popper.update()
,重新计算弹出窗口的位置。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");
});
});