2011-05-08 59 views
5

这个肯定涉及以前关于初始化期间地图显示的问题。然而,这里的问题是在地图应该已经初始化之后地图显示被设置为无。我的widow.onload的最后一行将地图设置为display:none;地图初始化应该在那时已经完成,但事实仍然存在,最终的调用导致了这个问题。Google Maps JS v3:地图显示:无;在地图初始化之后导致损坏的地图

window.onload();功能...

window.onload = function(){ 
    changeTheme(me); // do it now so current_theme is avaible to switchTabs(); 
    switchTabs("tab3"); // sets map div visible 
    initMaps(); // map initialization. code included. 
    loadFavoritePlaces(); // asynch $getJSON call, adds markers. No matter the condition of map, markers appear in their proper locations. 
    closePopup("images"); 
    closePopup("location"); // sets maps.mini_map display: none; Problems if we loadUserTable() later. Otherwise OK. Odd! 
    closePopup("tweet"); 
    centerDiv(); 
    document.title = '@'+me.screen_name+' - PithyTwits.com'; 
    users[me.id_str] = me; 
    getPage(); // asynch $.getJSON loads tweets. Not an issue. 

    // Append a scroll event handler to tweet_div 
    $("#tweet_div").scroll(function() { 
    var pos = $(this)[0].scrollHeight - $(this).scrollTop(); 
    if(pos != prev_scroll){ // hack to prevent scroll function from firing twice 
     prev_scroll = pos; 
     if (pos == $(this).outerHeight()) { 
     $("#throbber").fadeIn(); 
     getPage(); 
     } 
    } 
    }); 

    loadUserTable(me.id_str); 
    /* loadUserTable(); calls switchTabs("tab1"); which sets map div display: none; 
    if I comment this out the map initialization completes properly, but my 'tab1' 
    doesn't get populated properly. And page doesn't start on 'tab1', which is required. */ 

// end window.onload() 
} 

initMaps();功能...

function initMaps() { 

    // markers list 
    maps.markers = new Object; 

    // visibility status' 
    maps.markerStatus = new Object; 
    maps.markerStatus['query'] = true; 
    maps.markerStatus['tweet'] = true; 
    maps.markerStatus['favorite'] = true; 

    // define marker images 
    maps.reticleImage = new google.maps.MarkerImage('images/reticle.png', 
    new google.maps.Size(63, 63), 
    new google.maps.Point(0,0), 
    ... 
    Declarations removed to streamline post. 
    ... 
    new google.maps.Point(0,0), 
    new google.maps.Point(1, 13)); 
    maps.markerShape = { 
     type: "poly", 
     coords: [9,22,16,11,16,5,11,1,6,1,2,5,2,11,9,22] 
     } 

    // setup map options 
    var latlng = new google.maps.LatLng(39.520427, -94.770621); 
    var latlng2 = new google.maps.LatLng(46.1912, -122.1944); 
    var myOptions = { 
    zoom: 3, 
    center: latlng, 
    mapTypeId: google.maps.MapTypeId.HYBRID 
    }; 
    var myOptions2 = { 
    zoom: 13, 
    center: latlng2, 
    disableDefaultUI: true, 
    draggable: false, 
    keyboardShortcuts: false, 
    mapTypeControl: false, 
    scrollwheel: false, 
    mapTypeId: google.maps.MapTypeId.HYBRID 
    }; 

    // initialize maps 
    maps.main_map = new google.maps.Map(document.getElementById("map_div"), myOptions); 
    maps.mini_map = new google.maps.Map(document.getElementById("mini_map"), myOptions2); 

    // default map center markers 
    maps.mini_map_marker = new google.maps.Marker({ 
    position: latlng2, 
    map: maps.mini_map, 
    icon: maps.favoriteMarker, 
    shadow: maps.markerShadow, 
    }); 
    maps.reticleMarker = new google.maps.Marker({ 
    position: latlng, 
    map: maps.main_map, 
    shape: reticleShape, 
    icon: maps.reticleImage, 
    }); 

    // event handlers 
    google.maps.event.addListener(maps.main_map, 'zoom_changed', mapZoomed); 
    google.maps.event.addListener(maps.main_map, 'bounds_changed', 
     function(){maps.reticleMarker.setPosition(maps.main_map.getCenter());}); 

    //idle event listener provided by @Guan in the marked answer. 
    google.maps.event.addListenerOnce(maps.main_map, 'idle', function() { 
     var div = document.getElementById("tab3_content"); 
     div.style.display = "none"; 
     div.style.position = "relative"; 
     div.style.left = "0px"; 
    }); 

    // initialize controls 
    var controls = document.getElementById("visibility_controls"); 
    maps.main_map.controls[google.maps.ControlPosition.TOP_CENTER].push(controls); 
    controls.style.display = "inline"; 
    var controls = document.getElementById("control_controls"); 
    maps.main_map.controls[google.maps.ControlPosition.RIGHT_CENTER].push(controls); 
    controls.style.display = "inline"; 
    var controls = document.getElementById("query_controls"); 
    maps.main_map.controls[google.maps.ControlPosition.BOTTOM_CENTER].push(controls); 
    controls.style.display = "inline"; 
} 

如果我叫loadUserTable();在window.onload()的结尾处;我得到这个...(被改写的)

Maps not properly initialized

如果我不叫loadUserTable();在window.onload()的结尾处;我得到这个...(正确)

Maps properly initialized

既然问题被设置为none后,地图应该初始化地图显示茎,它会导致人们相信,地图初始化实际发生非syncronously。那么我怎么知道它何时完成,并且隐藏地图div是安全的?还有一个问题,为什么mini_map似乎依赖于main_map的可见性,而不是它自己的可见性?在Linux和Chrome上,我都得到了相同的结果。

任何帮助是帮助:)

跳过

更新:我改变setTimeout的最后通话( “loadUserTable();”,1000); 1秒就足以让事情发挥作用,但不是我想要的!由于@Jobsz验证这是已知问题,因此我将采取离屏初始化,并在需要显示时将地图移到适当位置,或者在短暂超时后将其隐藏并置于适当位置。

SOLUTION:通过@Guan(勾选答案)提供

我不想在地图初始化时可见。但是当用户选择该选项卡时,需要初始化并准备好。

地图div最初设定这样......

id="tab3_content" style="display: block;position: absolute; left: -1000px;" 

这使它可见,但屏幕外左侧。

,然后设置一个听众在地图初始化空闲事件......

google.maps.event.addListenerOnce(maps.main_map, 'idle', function() { 
    var div = document.getElementById("tab3_content"); 
    div.style.display = "none"; 
    div.style.position = "relative"; 
    div.style.left = "0px"; 
}); 

这一事件时触发一次地图处于空闲状态(准备好)。它隐藏div并将其移动到屏幕上的位置。

loadUserTable()函数在正常的程序流程中调用,并且寿命很长。 :)

+0

是的 - 屏幕外初始化是我原先也在考虑的事情。为你工作得好吗? – Atticus 2011-05-08 22:55:44

回答

8
google.maps.event.addListenerOnce(map, 'idle', function() { 
    $('#addstop').css({ 
     display: 'none', 
     left: '0', 
     top: '0' 
    }); 
}); 

此事件只发生一次后的地图是满载和“空闲”

+0

这看起来像一个强大的东西!已经8个月了。我必须深入研究我的代码。现在投票...如果它看起来像我会移动支票。关屏有其优点,但问题的要点是“我怎么知道地图何时准备就绪。”这回答了。不知道'闲置'事件。应该也可以设置一个简单的监听器空闲,然后取消它的第一次打击???总之,谢谢! – BentFX 2012-01-19 18:21:53

+0

就是这样。谢谢。您的第一个StackOverflow答案是胜利者。保持它:)我仍然初始化关闭屏幕,但它会触发,并在准备好时移动div。 – BentFX 2012-01-19 20:55:49

+0

@BentFX如果你想知道什么时候一切都休息了,还要考虑'tilesloaded'事件。 [参考文献](https://developers.google.com/maps/documentation/javascript/reference#Map) – hitautodestruct 2013-01-21 11:37:44

2

是的 - 我有同样的问题。

我所做的是在显示隐藏地图的事件按钮被点击后触发初始化。

因此,我有一个隐藏的div,当它被点击显示,我显示它,然后initalize它。这是可行的你想达到什么?我假设你想要表现,因为你更愿意点击即时显示填充的地图 - 但是,如果您在点击事件中进行填充,那么填充要绑定的小区域的速度并不会太慢。

+0

感谢@Jobsz的快速回复。有时候,正确的答案是“在那里,做到了,与之战斗!” setTimeout();向我证明,这只是一个允许它工作的时间问题。它必须在屏幕外工作!仍然有为什么main_map显示破坏mini_map的困惑?奇!除非有人可以公开初始化完成回调,否则您已经得到最终答案。 – BentFX 2011-05-08 22:00:35

+0

是的,我真的很想知道隐藏的div的问题..我自己没有运气搜索这个主题的相当数量..你肯定可以做一个setTimeout并在持续时间内有一个加载器图标外观。但是,我的建议是初始化切换。如果地图已经初始化以防止重做作业,我将其映射到数据集中。如果你正在处理多个预览图,那我想你也可能是你想要做的。 – Atticus 2011-05-08 22:19:45

+0

预览图???不,mini_map只显示放大,以及所选标记的详细信息,以及当您将鼠标悬停在推文中的位置图标上时。我的下一个障碍是在所选标记的infoWindow中实现类似的功能,并保留mini_map对话框以查找推文中的位置。 – BentFX 2011-05-08 23:17:43

15

你能尝试调用

//map hold's a reference to your current map 
google.maps.event.trigger(map, 'resize'); 

包含它变得可见地图/ DIV后?

+0

令人敬畏的功能。绝对值得一票。我不得不回滚我的代码来重新创建问题,只是为了观看“调整大小”的工作。它把它全部弄平。现在我正在初始化屏幕,但是我会在初始化时将其粘贴到注释中,以备日后需要时使用。谢谢! – BentFX 2011-05-08 23:06:41

+1

我看到使用resize事件作为初始显示的一部分的缺点......如果地图被隐藏初始化,它似乎被视为一个以左上角为中心的0x0地图。然后当你触发resize事件时,它会实现新的边界,而不会移动左上角,并且你失去了初始地图中心。 – BentFX 2011-05-08 23:51:39

0

只是这可以帮助你。

我只是有一个应用程序使用与gmap div混合的标签。

我修正了同样的问题。控制台只显示腐败图像消息。你的想法帮助很大!

我只是用这个

$("#tab-3").click(function(){ 

$(".tab-3").removeClass("ui-screen-hidden"); 

$(".tab-1").addClass("ui-screen-hidden"); 

$(".tab-2").addClass("ui-screen-hidden"); 

initializedonationlocation(); 


}) 

    function initializedonationlocationdr() { 
    var directionsDisplay = new google.maps.DirectionsRenderer(); 
    geocoder2 = new google.maps.Geocoder(); 
    infowindow2 = new google.maps.InfoWindow(); 
    var myOptions = { 
     zoom: 10, 
     center: new google.maps.LatLng(38.7,-121.59), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 



    var map2 = new google.maps.Map(document.getElementById('my_map_donation_donationreceipt'), 
     myOptions); 

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

    geocoder.geocode(
      {'latLng': e.latLng}, 
      function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       if (results[0]) { 
       if (marker2) { 
        marker2.setPosition(e.latLng); 
       } else { 
        marker2 = new google.maps.Marker({ 
        position: e.latLng, 
        map: map2}); 
       } 
       infowindow2.setContent(results[0].formatted_address); 


       var postCode = extractFromAdress(results[0].address_components, "postal_code"); 
       var street = extractFromAdress(results[0].address_components, "route"); 
       var town = extractFromAdress(results[0].address_components, "locality"); 
       var country = extractFromAdress(results[0].address_components, "country"); 
       var state = extractFromAdress(results[0].address_components, "administrative_area_level_1"); 

       $("#city_donationdr").val(town); 
       $("#state_donationdr").val(state); 
       $("#zip_donationdr").val(postCode); 
       $("#address_donationdr").val(street); 
       infowindow2.open(map2, marker2); 

       // Changing window 

       var prevSelection3 = $("#tabmap").val(); 
        var newSelection3 = $("#navbar2 ul li").children("a").attr("data-tab-class"); 
        $("."+prevSelection3).addClass("ui-screen-hidden"); 
        $("."+newSelection3).removeClass("ui-screen-hidden"); 
        prevSelection3 = newSelection3; 
        $("#tabmap").val(prevSelection3); 


       document.getElementById('geocoding').innerHTML = ""; 
       $("#coords_donationdr").val(e.latLng); 
       $("#address_donationdr").focus(); 
       GetCurbSideCoordsDR(directionsDisplay,map2); 
       } else { 
       document.getElementById('geocoding').innerHTML = 
        'No results found'; 
       } 
      } else { 
       document.getElementById('geocoding').innerHTML = 
        'Geocoder failed due to: ' + status; 
      } 
      }); 

    }); 

    } 

我只当包含GMAP标签显示,只有调用初始化。没有之前。许多论坛在加载页面时显示gmap初始化。与标签结合使用时,只会在选项卡出现后调用初始化。