70

当使用 Google Maps API 在 jQuery UI 选项卡中呈现地图时,有许多问题似乎是众所周知的。我已经看到发布了关于类似问题的 SO 问题(例如,此处此处),但那里的解决方案似乎仅适用于 Maps API 的 v2。我检查的其他参考资料在这里这里,以及我可以通过谷歌搜索找到的几乎所有内容。

我一直在尝试将地图(使用 API 的 v3)填充到 jQuery 选项卡中,结果不一。我正在使用所有东西的最新版本(目前是 jQuery 1.3.2,jQuery UI 1.7.2,不知道地图)。

这是标记和 javascript:

<body>
    <div id="dashtabs">
        <span class="logout">
            <a href="go away">Log out</a>
        </span>
        <!-- tabs -->
        <ul class="dashtabNavigation">
            <li><a href="#first_tab" >First</a></li>
            <li><a href="#second_tab" >Second</a></li>
            <li><a href="#map_tab" >Map</a></li>
        </ul>

        <!--  tab containers -->
        <div id="first_tab">This is my first tab</div>
        <div id="second_tab">This is my second tab</div>
        <div id="map_tab">
             <div id="map_canvas"></div>
        </div>
    </div>
</body>

$(document).ready(function() {
    var map = null;
    $('#dashtabs').tabs();
    $('#dashtabs').bind('tabsshow', function(event, ui) {
        if (ui.panel.id == 'map_tab' && !map)
        {
            map = initializeMap();
            google.maps.event.trigger(map, 'resize');
        }
    });
});

function initializeMap() {
    // Just some canned map for now
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
        zoom: 8,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    return new google.maps.Map($('#map_canvas')[0], myOptions);
}

以下是我发现的有效/无效的内容(对于 Maps API v3):

  • 使用 jQuery UI Tabs 文档(以及我链接的两个问题的答案)中描述的偏左技术根本不起作用。事实上,功能最好的代码使用 CSS .ui-tabs .ui-tabs-hide { display: none; }
  • 让地图显示在选项卡中的唯一方法是将 CSS 的宽度和高度设置#map_canvas为绝对值。将宽度和高度更改为auto100%导致地图根本不显示,即使它已经成功渲染(使用绝对宽度和高度)。
  • 我在 Maps API 之外的任何地方都找不到它的文档,但它map.checkResize()不再起作用了。相反,您必须通过调用来触发调整大小事件google.maps.event.trigger(map, 'resize')
  • 如果地图未在绑定到tabsshow事件的函数内初始化,则地图本身会正确呈现,但控件不会 - 大多数只是完全丢失。

所以,这是我的问题:

  • 有没有其他人有完成同样壮举的经验?如果是这样,您如何确定实际可行的方法,因为记录的技巧不适用于 Maps API v3?
  • 根据jQuery UI 文档使用 Ajax 加载选项卡内容怎么样?我还没有机会玩弄它,但我的猜测是它会进一步破坏 Maps。让它发挥作用的机会有多大(或者不值得尝试)?
  • 如何使地图填充尽可能大的区域?我希望它填充标签并适应页面大小调整,就像在 maps.google.com 上完成的那样。但是,正如我所说,我似乎坚持只将绝对宽度和高度 CSS 应用于地图 div。

抱歉,如果这是冗长的,但这可能是 Maps API v3 + jQuery 选项卡的唯一文档。干杯!

4

17 回答 17

22

注意:此答案收到了无效的第 3 方编辑,它实质上替换了其内容,这是第 3 方编辑不应该做的事情。但是,结果可能比原来的更有用,所以下面给出两个版本:


  • 原作者 Anon 2010 年的版本,经过 Anon 的一次编辑

    google.maps.event.trigger(map, 'resize'); map.setZoom(map.getZoom());

http://code.google.com/p/gmaps-api-issues/issues/detail?id=1448建议 作为 v3 替代 v2 的 checkResize()。

Blech - 糟糕的谷歌,没有 cookie。


  • 用户 Eugeniusz Fizdejko 的 2012 年完整重写表格:

对我来说,添加标记时有效:

var marker = new google.maps.Marker({
    position: myLatlng,
    title:"Hello World!"
});

google.maps.event.addListener(map, "idle", function(){
    marker.setMap(map);
});
于 2010-10-15T22:42:12.600 回答
13

实际上在上面划掉我的答案。jQueryUI 网站有答案,这里是:

为什么...

...我的滑块、谷歌地图、sIFR 等放置在隐藏(非活动)选项卡中时不起作用?

任何需要一些维度计算来初始化的组件都不会在隐藏的选项卡中工作,因为选项卡面板本身是通过 display: none 隐藏的,因此内部的任何元素都不会报告它们的实际宽度和高度(在大多数浏览器中为 0) .

有一个简单的解决方法。使用 off-left 技术隐藏非活动的选项卡面板。例如,在您的样式表中,将类选择器“.ui-tabs .ui-tabs-hide”的规则替换为

.ui-tabs .ui-tabs-hide {
    position: absolute;
    left: -10000px;
}

对于 Google 地图,您还可以在选项卡显示如下后调整地图大小:

$('#example').bind('tabsshow', function(event, ui) {
    if (ui.panel.id == "map-tab") {
        resizeMap();
    }
});

resizeMap() 将在特定地图上调用 Google 地图的 checkResize()。

于 2010-06-18T01:50:40.793 回答
12

只需重新定义隐藏选项卡的 css 类:

.ui-tabs .ui-tabs-hide {
    position: absolute !important;
    left: -10000px !important;
    display:block !important;
}
于 2010-08-13T04:20:26.200 回答
9

这是您可以为 Google Maps v3 执行的操作:

google.maps.event.addListenerOnce(map, 'idle', function() {
    google.maps.event.trigger(map, 'resize');
    map.setCenter(point); // be sure to reset the map center as well
});
于 2012-05-28T19:41:11.437 回答
4

这并不能回答你所有的问题,但我已经让它工作了,所有其他答案都缺少一件事——当你用“resize”事件重绘地图时,你将失去地图的中心位置。因此,如果您的地图以某个位置为中心,您还需要使用setCenter再次更新地图的中心。

此外,您不希望每次触发选项卡更改时都初始化地图,因为这样做效率不高并且可能导致额外的地理编码。首先,您需要保存居中位置,可以是静态纬度/经度,或者如果进行地理编码,可能看起来像这样:

var address = "21 Jump St, New York, NY"; 
var geocoder = new google.maps.Geocoder();    
var myOptions = {
  zoom: 16,      
  mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

var center;

geocoder.geocode( { 'address': address}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {        
    center = results[0].geometry.location;
    map.setCenter(center);
    var marker = new google.maps.Marker({
        map: map, 
        position: results[0].geometry.location
    });
  } else {
    alert("Geocode was not successful for the following reason: " + status);
  }
});

然后

$("#tabs").tabs();

$('#tabs').bind('tabsshow', function(event, ui) {
    if (ui.panel.id == "mapTab") {
        google.maps.event.trigger(map, "resize");
        map.setCenter(center);   // Important to add this!      
    }
});

其中“mapTab”是您的 mapTab 的 ID,“map”是您的地图对象的 var 名称。

于 2012-06-04T23:01:14.713 回答
4

我在显示选项卡后加载地图。

这很hacky,但对我有用。只需将地图 iframe 的 url 存储在 iframes rel 属性中,如下所示:

<iframe width="490" height="300" rel="http://maps.google.com/maps?f=q&amp;source=s..."></iframe>

此事件会将 iframe src 属性设置为 rel 中的 url。

        $("#tabs").tabs({
            show:function(event, ui) {
                var rel = $(ui.panel).find('iframe').attr('rel');
                $(ui.panel).find('iframe').attr('src',rel);
            }
        });
于 2010-09-21T04:51:20.853 回答
2

确保在初始化选项卡的代码段之前调用了初始化地图的代码。

我唯一的烦恼是单击地图选项卡会使浏览器跳转到地图上,并且它打破了 jQuery 放置在主选项卡容器周围的默认边框。我在地图标签的 a 标签中添加了一个 return false onclick 调用来处理第一个标签,并在主标签 div 上添加了一个简单的边框大小:0 来处理第二个标签。

所有这些都对我有用。

祝你好运!

于 2010-03-24T12:17:40.657 回答
1

我已经通过每个论坛寻找这个问题的答案......他们都说使用

map.checkResize()

解决方案....似乎没有任何效果...然后我...为什么在显示选项卡时不初始化选项卡所以我使用了这个

$("#servicesSlider ").tabs({        
                //event: 'mouseover'
            fx: { height: 'toggle', opacity: 'toggle'},
            show: function(event, ui) {
                  if (ui.panel.id == "service5") {
                      $(ui.panel).css("height","100%")
                    initialize()
                    }}
            });

“service5”是包含我的谷歌地图 v3 的标签的 ID。

希望这对你有用!

于 2009-12-01T19:40:35.423 回答
1

我也有这个问题,我是通过 AJAX 加载地图的。

百分比的问题似乎与面板没有任何设置大小(包含加载标记的面板)有关。

在创建选项卡时使用以下代码对我有很大帮助:

$("#mainTabs").tabs({'show': function(event, ui){
  $(ui.panel).attr('style', 'width:100%;height:100%;');
  return true;
 }});
于 2010-03-19T16:04:47.303 回答
1

嘿伙计们,这段代码修复了错误,但在 IE 中不起作用。经过搜索和搜索,我发现我们必须添加以下行并且一切正常:

< !--[if IE]>
< style type="text/css">
.ui-tabs .ui-tabs-hide { position: relative; }
< /style>
< ![endif]-->
于 2010-07-03T12:40:38.160 回答
0

我有同样的问题,没有一个答案对我有用。也许我不知道如何在我的代码中使用它们,所以我在选项卡菜单中添加了一个 onclick 事件来初始化 Google 地图并且它正在工作。我不知道这是否是一个好习惯。

jQuery(document).ready(function($) {
$( '#tabs' ).tabs();
var href = $('#tabs').find('a[href="#tabs-4"]');
(href).on('click',function(){
    initialize();
})});
var map;
function initialize() {
  var mapOptions = {
    zoom: 8,
    center: new google.maps.LatLng(-34.397, 150.644),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  map = new google.maps.Map(document.getElementById('map'),
      mapOptions);
}

<div id="tabs-4">
    <div id="map" style="width:580px;height:380px;">
    </div>
</div>
于 2013-07-16T02:27:23.627 回答
0

我通过异步加载 API轻松地完成了这项工作,然后简单地从事件中关联到相关选项卡loadScript的标签中调用,如下所示:<a>onclick

<li><a href="#tab3" onclick="loadScript();">Maps</a></li>
于 2012-09-04T19:28:10.013 回答
0

Maps API v3 (exp) 和 jQuery UI 1.10 的另一个解决方案:

var pano = new google.maps.StreetViewPanorama(...);

$('#tabs').tabs({
  'activate': function(event, ui) {
    if (ui.newPanel[0].id == "maps-tabs-id") {
      pano.setVisible(true);
    }
  }
});
于 2013-11-15T11:51:25.763 回答
0

你可以打电话

map.fitBounds(边界)

这将刷新

于 2010-01-21T17:54:15.483 回答
0

我做了 Keith 所说的,它对我有用,在我的情况下,我使用 jQuery 航点进行标签式导航,为了更好地理解这里是我使用的代码:

在头部

<head>

<!-- Google Maps -->
<script>
function initialize() {
  var mapOptions = {
    zoom: 8,
    center: new google.maps.LatLng(-34.397, 150.644)
  };

  var map = new google.maps.Map(document.getElementById('map_canvas'),
      mapOptions);
}

function loadScript() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp' + '&signed_in=true&callback=initialize';
  document.body.appendChild(script);
}
window.onload = loadScript;
</script>

</head>

在我的标签里面:

<li><a href="#MyMap" onclick="loadScript();">My Map</a></li>

然后在 DIV

<div id="map_canvas"></div>

希望这对某人有所帮助,谢谢大家!

于 2015-01-30T05:07:58.963 回答
0

非常恼人的问题,但有一点破解它是可以解决的。关键是当您选择一个新选项卡时,使相对位置#tabs 调整为每个选项卡的外部高度。我是这样做的:

$('#tabs').tabs({
   selected:0,
   'select': function(event, ui) {
    //this is the href of the tab you're selecting
    var currentTab = $(ui.tab).attr('href');
    //this is the height of the related tab plus a figure on the end to account for padding...
    var currentInner = $(currentTab + '.detail-tab').outerHeight() + 40;
    //now just apply the height of the current tab you're selecting to the entire position:relative #tabs ID
    $('#tabs').css('height', currentInner);
   }
  });

这是我使用的CSS:

#tabs { position: relative; }
/*set the width here to whatever your column width is*/
.ui-tabs-panel{ position:absolute;top:0px; left:0; width:575px;}
.ui-tabs-panel.ui-tabs-hide { display:block !important; position:absolute;  left:-99999em; top:-9999em}
于 2010-11-18T00:32:50.603 回答
0

我在 中遇到了同样的问题,在加载选项卡Semantic UI时调用函数时问题已得到解决,或者您也可以绑定它。init();

于 2015-12-20T15:22:45.337 回答