我正在使用Twitter的Bootstrap,并希望在popover中显示Google地图。
现在它的工作方式我正在做这样的事情
$ ->
$('.thumbnails a.js-popover').popover
html: true,
content: ->
uid = $(this).data('profileUid')
popover_container = $('.popover-contents:data(profileUid=' + uid + ')')
_.each window.Maps, (map) ->
google.maps.event.trigger map, 'resize' // I hoped this would re-draw the map
popover_container.html()
popover从隐藏的.popover-contents
div加载它的内容,并使用数据属性连接到a
(以便我可以找到要显示的正确的popover)
当不在popover中时,地图可以正常工作,我认为它与通过jQuery中的html()
复制到另一个DOM元素有关。 Twitter的引导程序没有提供modal opened
回调,我真的不确定如何使地图工作。
正如您可以看到地图在完整的个人资料页面上正常工作,标记是相同的(rails部分),javascript也是共享的 - 我只能假设GoogleMaps API真的不喜欢它的< em> dom 混乱,因而导致问题。
答案 0 :(得分:6)
如果您使用的是弹出窗口,最好的办法是使用google's static API并避免与交互式地图相关的麻烦。借用文档中的 very 简单案例,您可以执行以下操作:
var options = { content: '<img src="http://maps.googleapis.com/maps/api/staticmap?center=Brooklyn+Bridge,New+York,NY&zoom=14&size=512x512&maptype=roadmap&sensor=false">' };
$('#example').popover(options)
将其包装成可重复使用的函数会产生:
var getMap = function(opts) {
var src = "http://maps.googleapis.com/maps/api/staticmap?",
params = $.extend({
center: 'New York, NY',
zoom: 14,
size: '512x512',
maptype: 'roadmap',
sensor: false
}, opts),
query = [];
$.each(params, function(k, v) {
query.push(k + '=' + encodeURIComponent(v));
});
src += query.join('&');
return '<img src="' + src + '" />';
}
var content = getMap({center: 'Fritz-Walter Stadion, Kaiserslautern'});
$('#example').popover({ content: content })
答案 1 :(得分:1)
* 这里可以找到另一个有效的答案,但这不是我采取的解决方案。 *
似乎广泛接受的是,在不可见的DOM元素中渲染Google地图会导致渲染错误,而解决方案(来自http://sethmatics.com/articles/classipress-hidden-map-tab-and-redraw-google-map-canvas/)似乎看起来像这样:
jQuery('.tabprice ul.tabnavig li a').click(function() {
if(jQuery(this).attr('href') == '#priceblock1') {
//the element has to be visible on the page for google maps to render properly
jQuery('#priceblock1').show();
//rebuild the google map canvas to the proper size
google.maps.event.trigger(map, 'resize');
//ClassiPress javascript function to build map at address
codeAddress();
}
});
我认为将dom元素从屏幕的左/右/底部移开一段很长的路可能是值得的,以避免它闪烁给用户,或者使用Z-Indexing做一些事情来确保用户没有看到不受欢迎的弹出窗口。
就我而言,rjz建议的静态地图API是完美的。
答案 2 :(得分:0)
问题是google maps api需要容器的可见元素,所以你应该在 shown.bs.modal 事件处理程序中调用api。像这样:
$picker.popover({
html: true,
content: '<div class="superPopover">'
});
$picker.on('shown.bs.popover', function () {
var $container = $('.superPopover');
new google.maps.Map($container[0]);
});