Google地图无法在jQuery标签中使用

Joe*_*Joe 8 jquery tabs google-maps google-maps-api-3 jquery-tabs

放置在jQuery标签内的谷歌地图不起作用是一个遍布网络的问题.到目前为止,在我的研究中,似乎没有一种解决方案可行.希望有人可以帮助......

这是Firefox 10,Chrome 17,Safari 5.1.2,Opera 11.61中的错误的屏幕截图. http://www.flickr.com/photos/75523633@N04/6932970713/

IE8中不存在该错误,并且在9中是间歇性的.在Firefox中,当您打开FireBug时它会消失.

该站点在Wordpress 3.3.1中,并通过插件生成/检索地图.我使用哪个地图插件似乎并不重要; 错误保持不变.根据我的研究,这似乎是选项卡和Google Map API javascript之间的js/jQuery问题,而不是Wordpress /插件问题.

这是我的代码.现在,我正在使用wp-gmappity-easy-google-maps插件来制作地图,但我也尝试了综合谷歌地图插件.两者都在标签之外工作得很好.

HTML:

// Header calls:
<script type='text/javascript' src='http://maps.google.com/maps/api/js?sensor=false'></script>
<script type='text/javascript' src='http://xxxxxxxxxx.com/wp-content/themes/zzzzzzzzzz/scripts/tabs.min.js'></script>
// HTML Body:
<div class="tabs_framed_container">
<ul class="tabs_framed">
    <li><a href="#">Tab 1</a></li>
    <li><a href="#">Tab 2</a></li>
    <li><a href="#">Tab 3</a></li>
    <li><a href="#">Map Tab</a></li>
    <li><a href="#">Tab 3</a></li>
</ul>
<div class="tabs_framed_content">
    <h2>Tab 1 Content</h2>
    <!-- Some Content -->
</div>
<div class="tabs_framed_content">
    <h2>Tab 2 Content</h2>
    <!-- Some Content -->
</div>
    <h2>Tab 3 Content</h2>
    <!-- Some Content -->
</div>
<div class="tabs_framed_content">
    <div class="map_container">
        <div style="width:900px;margin-left:auto;margin-right:auto;">
            <div class="wpgmappity_container" id="wpgmappity-map-1" style="width:900px;height:400px;margin-left:auto;margin-right:auto;"></div>
        </div>
        <script type="text/javascript">
            function wpgmappity_maps_loaded1() {
            var latlng = new google.maps.LatLng(42.4005322,-71.2750094);
            var options = {
                center: latlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                zoomControl : true,
                zoomControlOptions :
                {
                    style: google.maps.ZoomControlStyle.SMALL,
                    position: google.maps.ControlPosition.TOP_LEFT
                },
                mapTypeControl : true,
                mapTypeControlOptions :
                {
                    style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
                    position: google.maps.ControlPosition.TOP_RIGHT
                },
                scaleControl : true,
                scaleControlOptions :
                {
                    position: google.maps.ControlPosition.TOP_LEFT
                },
                streetViewControl : true,
                streetViewControlOptions :
                {
                    position: google.maps.ControlPosition.TOP_LEFT
                },
                panControl : false,  zoom : 14
            };
            var wpgmappitymap1 = new google.maps.Map(document.getElementById('wpgmappity-map-1'), options);
            var point0 = new google.maps.LatLng(42.4005322,-71.2750093);
            var marker1_0 = new google.maps.Marker({
                icon : 'http://xxxxxxxxxx.com/wp-content/themes/zzzzzzzzzz/images/mapmarker.png',
                position : point0,
                map : wpgmappitymap1
                });
            }
            jQuery(window).load(function() {
                wpgmappity_maps_loaded1();
            });
        </script>
    </div>
</div>
<div class="tabs_framed_content">
    <h2>Tab 2 Content</h2>
    <!-- Some Content -->
</div>
Run Code Online (Sandbox Code Playgroud)

这是相关的CSS:

.tabs_framed{padding:0;margin:0;list-style-type:none;clear:left;height:25px;border-bottom:1px solid #E5E5E5;}
.tabs_framed_container{margin-bottom:40px;}
.tabs_framed a{
    display:block; position:relative; background:#fafafa; border:1px solid #E5E5E5; padding:7px 30px; margin-right:2px;
    font-size:10px; text-decoration:none; text-transform:uppercase; letter-spacing:1px; line-height:10px; color:#777;
    opacity:1; -webkit-transition:all .5s ease; -moz-transition:all .5s ease; -o-transition:all .5s ease; transition:all .5s ease;
}
.tabs_framed a:hover{color:#20548B;text-decoration:none;background:#fff;}
.tabs_framed a.current{color:#000;cursor:default;border-bottom:1px solid #fff;background:#fff;}
.tabs_framed li,{padding:0;margin:0;list-style-type:none;float:left;}
.tabs_framed_content{display:none;background-color:#fff;border:1px solid #E5E5E5;border-width:0 1px 1px 1px;padding:30px 30px 15px 30px;}

div.wpgmappity_container img { 
    background-position: 0% 0%;
    background-color: none !important;
    max-width: none !important;
    background-image: none !important;
    background-repeat: repeat !important;
    background-attachment: scroll !important;
}
Run Code Online (Sandbox Code Playgroud)

以下是管理我的标签的文件的链接:http: //themes.mysitemyway.com/awake/wp-content/themes/awake/lib/scripts/tabs.min.js

flowplayer.org/tools/forum/25/79274是我找到的一个解决方案(滚动到底部).但是,checkResize和resizeMap不再有效(请参阅code.google.com/apis/maps/documentation/javascript/reference.html#Map上的api参考,向下滚动一点"事件"并找到google.maps.event.触发(map,'resize'),这显然是替换代码).www.raymondcamden.com/index.cfm/2009/6/5/jQuery-Tabs-and-Google-Maps是另一个太旧的文章.

我见过这个提议:

jQuery(document).ready(function(){
jQuery('.tabs_container').bind('tabsshow', function(event, ui) {
    if (ui.panel.id == "map-tab") {
        google.maps.event.trigger(map, 'resize');
    }
});
});
Run Code Online (Sandbox Code Playgroud)

但我不知道如何实现它(尝试了几种方法但没有成功)或者它是否可行.

从我的所有研究中,当选择包含地图的选项卡时,您似乎必须触发地图调整大小事件.到目前为止,我没有运气适应任何解决方案 - 特别是因为我熟悉js/jQuery.似乎熟悉js或jQuery的人可以解决这个问题.

请帮我.

Jas*_*ard 12

rogercut的回答让我得到了我需要的地方.我正在使用Bootstrap选项卡,嵌套,无法让地图更新.

当我单击选项卡组2(#tg2)时,地图选项卡是第一个显示的选项卡.如果有人单击选项卡组2中的第二级选项卡(#tab1),我还需要触发调整大小.

单击处理程序有效,但问题是单击时,选项卡仍然隐藏...通过设置一个小延迟,它为调整大小显示在调整大小之前显示的时间.

// Create Map
var map;
function initialize() {
  var mapOptions = {
    zoom: 8,
    center: new google.maps.LatLng(48.8582, 2.2945), //I see Paris, I see France
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
 map = new google.maps.Map(document.getElementById('map-canvas'),
  mapOptions);
}

//Bind click handlers - Here's the important part
$('a[href=#tab1], a[href=#tg2]').on('click', function() {
    setTimeout(function(){
        google.maps.event.trigger(map, 'resize');
    }, 50);
});
Run Code Online (Sandbox Code Playgroud)

所以,我们告诉浏览器在点击后等待50ms进行调整大小.在我的测试中,50ms有足够的时间来显示标签,但又足够短,以至于用户并不会真正注意到它.事实上,我测试的4-5台机器上的测试延迟只有1毫秒 - 即使是我们坐在存储器中的狗慢速笔记本电脑.50毫秒是安全的.

希望这有助于其他人.


Joe*_*Joe 7

我放弃了插件,并使用谷歌地图短代码,已经发布了我正在使用的主题.虽然我失去了自定义标记功能,但主题开发人员终于能够帮助实现这一切.他们将以下代码添加到短代码PHP文件中.

jQuery('ul.tabs_framed').data('tabs').onClick(function(e,index) {
    resizeMap(" . 'map'.$map_id .") 
});
function resizeMap(m) {
    x = m.getZoom();
    c = m.getCenter();
    google.maps.event.trigger(m, 'resize');
    m.setZoom(x);
    m.setCenter(c);
};
Run Code Online (Sandbox Code Playgroud)

当单击包含地图的选项卡时,此代码会触发地图重新加载.它还会重新定位地图.此解决方案为我解决了问题,谷歌地图现在显示在jquery选项卡中.希望这里的一些更精通javascript的用户(以及插件开发人员!!!)可以将此解决方案适应他们自己的map-in-tabs问题.