使用Twitter的Bootstrap,Google Maps API V3无法在标签页上进行竞争

Tre*_*dyT 31 javascript jquery google-maps twitter-bootstrap

我正在使用Twitter的Bootstrap来定义我的CSS.我创建了一个包含三个选项卡的页面.第二个标签包含使用Google地图构建的地图.但是,当打开页面并使用地图切换到第二页时,地图不会完全呈现.一旦我使用谷歌地图选项卡重新加载页面作为选定的选项卡,地图就会完全加载.

我读了一些帖子,建议有相同问题的人将以下代码添加到javascript:

google.maps.event.addDomListener(window, 'resize', function() {
    map.setCenter(homeLatlng);
});
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不是解决方案.请在下面找到完整的代码:

使用Javascript:

<script type="text/javascript">
function initialize() {
    google.maps.event.addDomListener(window, 'resize', function() {
        map.setCenter(homeLatlng);
    });

    var myLatlng = new google.maps.LatLng(37.4419, -122.1419);
    var myOptions = {
        zoom: 13,
        center: myLatlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    downloadUrl("data.xml", function(data) {
        var markers = data.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
            var latlng = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")), 
                                parseFloat(markers[i].getAttribute("lng")));
            var marker = new google.maps.Marker({position: latlng, map: map});
        }
    });
}
</script>
Run Code Online (Sandbox Code Playgroud)

HTML:

<div class="tab-pane" id="orange" style="background-color:#E3F2FF;">
      <div id="map_canvas" style="width:780px; height:400px; overflow:;"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?也许我可以添加一些重新加载谷歌地图部分的JavaScript,一旦选中标签但我不知道如何做到这一点....

更新的代码仍显示错误:

<div class="tab-pane" id="orange" style="background-color:#E3F2FF;">
    <div id="map_canvas" style="width:780px; height:400px; overflow:;"></div>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript" src="util.js"></script>
    <script type="text/javascript">
      function initialize() {
        google.maps.event.addDomListener(window, 'resize', function() {
            map.setCenter(homeLatlng);
        });

        var myLatlng = new google.maps.LatLng(37.4419, -122.1419);
        var myOptions = {
          zoom: 13,
          center: myLatlng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
        downloadUrl("data.xml", function(data) {
          var markers = data.documentElement.getElementsByTagName("marker");
          for (var i = 0; i < markers.length; i++) {
            var latlng = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")),
                                        parseFloat(markers[i].getAttribute("lng")));
            var marker = new google.maps.Marker({position: latlng, map: map});
           }
        });
        map.checkResize();
    }
    </script>
</div>
Run Code Online (Sandbox Code Playgroud)

The*_*heo 47

我也在和这个问题作斗争.我使用的是模态形式,它在隐藏时会渲染地图.显示选项卡时,您需要触发此代码:

google.maps.event.trigger(map, 'resize');
map.setZoom( map.getZoom() );
Run Code Online (Sandbox Code Playgroud)

希望它对你有用.如果这不起作用,这里是我找到解决方案的链接.也许会有另一个有用的评论.

http://code.google.com/p/gmaps-api-issues/issues/detail?id=1448

  • 使用bootstrap,确保将其放入显示的事件中,而不是show事件. (4认同)

Arc*_*nic 8

这里有很多解决方案,坦率地说他们都错了.如果您必须使用Bootstrap选项卡的默认功能,请不要使用Bootstrap选项卡.如果您仅在显示选项卡后调用resize,则可能仍然存在GMaps界面问题(缩放级别等).您只需在选项卡可见后初始化地图.

var myCenter=new google.maps.LatLng(53, -1.33);
var marker=new google.maps.Marker({
    position:myCenter
});

function initialize() {
  var mapProp = {
      center:myCenter,
      zoom: 14,
      draggable: false,
      scrollwheel: false,
      mapTypeId:google.maps.MapTypeId.ROADMAP
  };

  var map=new google.maps.Map(document.getElementById("map-canvas"),mapProp);
  marker.setMap(map);

  google.maps.event.addListener(marker, 'click', function() {

    infowindow.setContent(contentString);
    infowindow.open(map, marker);

  }); 
};

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
    initialize();
});
Run Code Online (Sandbox Code Playgroud)

你可以在这个bootply中看到一个工作示例:http://www.bootply.com/102241

注意:如果您的界面仍然存在问题,可能就是这个问题: Google Maps API V3:奇怪的UI显示故障(带截图)

使用最新的gmaps api,您只需将其添加到您的样式中:

.gm-style img { max-width: none; }
.gm-style label { width: auto; display: inline; }
Run Code Online (Sandbox Code Playgroud)


Cyr*_*art 6

在测试不同的延迟后为我工作:

    $(window).resize(function() {
        setTimeout(function() {
              google.maps.event.trigger(map, 'resize');
           }, 300)            

});
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.