gizli bir div içinde google haritasıyla nasıl başa çıkılır (Güncellenen resim)


127

Bir sayfam var ve bir google haritam ilk başta gizli bir div içinde. Daha sonra bir bağlantıya tıkladıktan sonra div'i gösteriyorum ancak haritanın yalnızca sol üst kısmı görünüyor.

Bu kodun tıklamadan sonra çalıştırılmasını denedim:

    map0.onResize();

veya:

  google.maps.event.trigger(map0, 'resize')

herhangi bir fikir. Burada, içinde gizli harita olan div'i gösterdikten sonra gördüğüm şeyin bir resmi var.alternatif metin



@Matt Ball - güncellendi, yeniden boyutlandırma olayını oraya eklemeyi denedim ama hala çalışmıyor
leora

@Matt Ball - bunu işe koydum. google harita nesnesini oluşturduktan sonra bunu global bir değişkende depoluyorum, böylece daha sonra tekrar başvurabilirim ve yeniden boyutlandırma çağrısı şimdi çalışıyor gibi görünüyor. Harita nesnesini her gösterdiğimde yeniden oluşturmak zorunda kalmamaya çalışıyorum çünkü insanların ileri geri hareket etmesine izin veriyorum.
leora

@ooo aşağıdaki kodla bu çok basit. Eklemeniz gereken tek şey, harita nesnesinin başlatılıp başlatılmadığını kontrol etmek için bir if koşuludur. Bu, haritayı doğru bir şekilde yüklemek olan ilk probleminizi çözmek için yazılmış bir manşet dışı koddu.
Philar

@philar - evet. . burada teşekkürler. . böylelikle olumlu oy :). Her iki durumda da, yeniden başlatmayı önlemek için değişkenleri küresel düzeyde
saklamam gerekiyor

Yanıtlar:


103

Sadece kendim test ettim ve işte böyle yaklaştım. Oldukça basit, herhangi bir açıklamaya ihtiyacınız olursa bana bildirin

HTML

<div id="map_canvas" style="width:700px; height:500px; margin-left:80px;" ></div>
<button onclick="displayMap()">Show Map</button>

CSS

<style type="text/css">
#map_canvas {display:none;}
</style>

JavaScript

<script>
function displayMap()
{
    document.getElementById( 'map_canvas' ).style.display = "block";
    initialize();
}
function initialize()
{
    // create the map
    var myOptions = {
        zoom: 14,
        center: new google.maps.LatLng( 0.0, 0.0 ),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map( document.getElementById( "map_canvas" ),myOptions );
}
</script>

Yani temelde haritayı yalnızca div gösterildiğinde anında mı anlıyorsunuz? Harita nesnesinin yalnızca bir kez (sayfa yüklenirken) anında özelleştirilmesi için bunu yapmanın bir yolu var mı?
lucas

1
Ayrıca, yeniden boyutlandırmaya zaman tanımak için bir show () çağırıyorsanız, ikinci işlevi çağırmak için bir setTimeout gecikmesi önerebilirim.
Eric. 18

126

Aynı sorunu yaşıyordum ve div'i gösterdiğinde, aradığımı google.maps.event.trigger(map, 'resize');ve sorunun benim için çözüldüğünü keşfettim .


64
Yeniden boyutlandırmanın hemen ardından haritanın orijinal merkezini korumak için, yeniden boyutlandırma ifadesini şu şekilde genişletmeyi düşünün: var center = map.getCenter (); google.maps.event.trigger (harita, 'yeniden boyutlandır'); map.setCenter (ortada);
John Doppelmann

10
Neden olduğundan emin değilim, ancak çalışması için çözümü küçük setTimeout içine sarmam gerekiyor: setTimeout (function () {google.maps.event.trigger (map, 'resize')}, 100);
HoffZ

@JohnDoppelmann Teşekkürler bahşiş için! Neden merkezi korumadığı ya da onu nasıl geri zorlayacağı sezgisel değildi.
Noah Duncan

'Yeniden boyutlandırma' olayını tetikledikten sonra harita merkezini ve yakınlaştırma seviyesini tekrar ayarlayın. Daha fazla bilgi için bkz: code.google.com/p/gmaps-api-issues/issues/detail?id=1448
ruhong

@HoffZ Bu, büyük olasılıkla, gösterim efektinden önce yeniden boyutlandırma kodunuzun etkinleşmesinden kaynaklanmaktadır, zaman aşımı, gösteri gerçekleştirilene kadar geciktirir, ardından yeniden boyutlandırma çalışmasını sağlayabilir. Muhtemelen, olayı başlatırken, harita yeniden boyutlandırmadan önce div gösteriminin yürütülmesini sağlamak için kod yürütme sıranızı değiştirerek aynı etkiyi elde edebilirsiniz.
Bardo

26
google.maps.event.trigger($("#div_ID")[0], 'resize');

Değişken haritanız yoksa, divGMAP'yi içeren ilk öğe (aptalca bir şey yapmadıysanız) olmalıdır.


Google.map.Map nesnesi yerine bir div öğesinde öğeyi tetikleyebileceğinizden emin misiniz ?
Salman

@SalmanA - Bunu kontrol ettim ve benim için çalıştı (Haritanın yeni bir Merkezi var gibi görünse de). Önceki araştırmadan bunun da mümkün olduğunu bilmiyordum, bu yüzden CSN'ye tebrikler
Hal

CS N ... Bu benim için işe yarıyor, ancak orta pozisyonu yanlış noktada bırakıyor. Haritam OP'nin ekran görüntüsü gibi başlıyor ve merkez gibi: map_canvas'ımın sol üst köşesinde ortalanıyor. Nasıl ortalanacağına dair düşünceler?
Kirk Ross

13

Bir Bootstrap sekmesinin içinde düzgün görüntülenmeyen bir Google haritam vardı. Bu benim fikrimdi.

// Previously stored my map object(s) in googleMaps array

$('a[href="#profileTab"]').on('shown', function() {   // When tab is displayed...
    var map = googleMaps[0],
        center = map.getCenter();
    google.maps.event.trigger(map, 'resize');         // fixes map display
    map.setCenter(center);                            // centers map correctly
});

1
Bunun etkin olmayan bir sekmede gizlenmiş bir harita için çalışmasını sağlamak için "gösterilen" yerine "shown.bs.tab" öğesini değiştirmek zorunda kaldım. Teşekkürler
Nicola

SmartWizard 4 kullanıyorum ve bu benim için çalışan tek çözümdü ve harika çalıştı! Değiştim 'a[href="#profileTab"]'için step-2hangi haritanın DIV içeren DIV adıdır.
GeospatialPython.com

7

Div'inizi yeniden boyutlandırdığınızda haritayı nasıl yenileyebilirsiniz?

Sadece aramak yeterli değil google.maps.event.trigger(map, 'resize');Haritanın merkezini de sıfırlamalısınız.

var map;

var initialize= function (){
    ...
}

var resize = function () {
    if (typeof(map) == "undefined") {) {
        // initialize the map. You only need this if you may not have initialized your map when resize() is called.
        initialize();
    } else {
        // okay, we've got a map and we need to resize it
        var center = map.getCenter();
        google.maps.event.trigger(map, 'resize');
        map.setCenter(center);
    }
}

Yeniden boyutlandırma etkinliği nasıl dinlenir

Açısal (ng-show veya ui-bootstrap daraltması)

Ng-show'a bağlı değerden ziyade doğrudan elemanın görünürlüğüne bağlanın, çünkü $ watch, ng-show güncellenmeden önce tetiklenebilir (böylece div hala görünmez olacaktır).

scope.$watch(function () { return element.is(':visible'); },
    function () {
        resize();
    }
);

jQuery .show ()

Yerleşik geri aramayı kullanın

$("#myMapDiv").show(speed, function() { resize(); });

Bootstrap 3 Modal

$('#myModal').on('shown.bs.modal', function() {
    resize();
})

önyükleme 3 modal yeniden boyutlandırma yönteminiz sorunumu mükemmel bir şekilde çözerken, diğer önerilerin çoğu çözmedi. Teşekkürler!
BrianLegg

6

İframe kodunu kopyalayıp / yapıştırarak eklenen bir Google Haritanız varsa ve Google Haritalar API'sini kullanmak istemiyorsanız , bu kolay bir çözümdür. Gizli haritayı gösterdiğinizde aşağıdaki javascript satırını çalıştırın. Yalnızca iframe HTML kodunu alıp aynı yere ekler, böylece yeniden oluşturur:

document.getElementById("map-wrapper").innerHTML = document.getElementById("map-wrapper").innerHTML;

jQuery sürümü:

$('#map-wrapper').html( $('#map-wrapper').html() );

HTML:

....
<div id="map-wrapper"><iframe src="https://www.google.com/maps/..." /></div>
....

Aşağıdaki örnek, başlangıçta bir Bootstrap 3 sekmesinde gizlenmiş bir harita için çalışır:

<script>
$(document).ready( function() {

    /* Detects when the tab is selected */
    $('a[href="#tab-id"]').on('shown.bs.tab', function() {

        /* When the tab is shown the content of the wrapper
           is regenerated and reloaded */

        $('#map-wrapper').html( $('#map-wrapper').html() ); 

    });
});
</script>

2
Google Map https://www.google.com/maps/embed/v1/place?..
JS'yi

6

Yalnızca yerel pencere yeniden boyutlandırma olayını tetiklemek de mümkündür.

Google Haritalar kendini otomatik olarak yeniden yükleyecektir:

window.dispatchEvent(new Event('resize'));

5

Aynı sorunu yaşadım, google.maps.event.trigger(map, 'resize')benim için çalışmıyordu.

Yaptığım şey, haritayı görünür hale getirdikten sonra haritayı güncellemek için bir zamanlayıcı koymaktı div...

//CODE WORKING

var refreshIntervalId;

function showMap() {
    document.getElementById('divMap').style.display = '';
    refreshIntervalId = setInterval(function () { updateMapTimer() }, 300);
}

function updateMapTimer() {
    clearInterval(refreshIntervalId);
    var map = new google.maps.Map(....
    ....
}

Bunu yapmanın daha uygun bir yolu mu bilmiyorum ama işe yarıyor!


bir kez beklemek için setTimeout kullanın.
Joe Austin

4

JQuery ile böyle bir şey yapabilirsiniz. Bu, Umbraco CMS'de hemen görünmeyen bir sekmede bir Google Haritası yüklememe yardımcı oldu.

function waitForVisibleMapElement() {
    setTimeout(function () {
        if ($('#map_canvas').is(":visible")) {
            // Initialize your Google Map here
        } else {
            waitForVisibleMapElement();
        };
    }, 100);
};

waitForVisibleMapElement();

Bu benim ve sorunum için işe yarayan tek çözümdü. Bir Materialize.CSS sekmesinin içinde haritayı göstermeyen, ancak sol köşede yalnızca Marker ve Google logosu ile yalnızca gri bir arka plan gösteren bir Google haritam vardı. Sekme içeriği div'i, göründüğünde haritayı başlatacak şekilde ayarladım ve mükemmel çalışıyor. Örnek
Gorgon_Union

3

Çözümüm çok basit ve etkili:

HTML

<div class="map-wrap"> 
  <div id="map-canvas"></div>
</div>


CSS

.map-wrap{
  height:0;
  width:0;
  overflow:hidden;
}


jQuery

$('.map-wrap').css({ height: 'auto', width: 'auto' }); //For showing your map
$('.map-wrap').css({ height: 0, width: 0 }); //For hiding your map


2

Sanırım asıl soru, sayfanın gizli bir bölümünde büyük harfle yazılmış bir haritayla ilgili. Görüntü durumuna bakılmaksızın, başlatıldıktan sonra belge hazır olduktan sonra gizli div'deki haritayı yeniden boyutlandırarak benzer bir sorunu çözdüm. Benim durumumda, 2 haritam var, biri gösteriliyor ve biri başlatıldıklarında gizli ve her gösterildiğinde bir haritayı başlatmak istemiyorum. Eski bir gönderi, ama umarım bakan herkese yardımcı olur.


2

Bunu benim için çalışacak şekilde buldum:

gizlemek için:

$('.mapWrapper')
.css({
  visibility: 'hidden',
  height: 0
});

göstermek için:

    $('.mapWrapper').css({
      visibility: 'visible',
      height: 'auto'
    });

2

Bootstrap v3 sekmelerinde kullanılırsa, aşağıdakiler çalışmalıdır:

$('a[href="#tab-location"]').on('shown.bs.tab', function(e){
    var center = map.getCenter();
    google.maps.event.trigger(map, 'resize');
    map.setCenter(center);
});

tab-locationharitayı içeren sekmenin kimliği nerede .


2

Tıpkı John Doppelmann ve HoffZ'un belirttiği gibi, tüm kodu div gösterme işlevi veya onclick olayında aşağıdaki gibi bir araya getirin:

setTimeout(function(){
var center = map.getCenter();
google.maps.event.trigger(map, 'resize');
map.setCenter(center);
});

Benim için mükemmel çalıştı


0

Benim çözümüm şuydu:

CSS:

.map {
   height: 400px;
   border: #ccc solid 1px;
}

jQuery:

$('.map').width(555); // width of map canvas

0

Haritanın yalnızca gizli div görünür olduktan sonra yüklenmesini istemedim. Örneğin bir atlıkarınca, bu gerçekten işe yaramaz.

Bu benim çözümüm, gizli öğeyi göstermek ve bunun yerine mutlak konumla gizlemek için gizli öğeye sınıf eklemek, ardından haritayı işlemek ve harita yüklendikten sonra sınıfı kaldırmaktır.

Bootstrap Carousel'de test edilmiştir.

HTML

<div class="item loading"><div id="map-canvas"></div></div>

CSS

.loading { display: block; position: absolute; }

JS

$(document).ready(function(){
    // render map //
    google.maps.event.addListenerOnce(map, 'idle', function(){
        $('.loading').removeClass('loading');
    });
}

0

Haritayı göstermek istediğinizde bu kod satırını kullanın.

               $("#map_view").show("slow"); // use id of div which you want to show.
                    var script = document.createElement("script");
                    script.type = "text/javascript";
                    script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize";
                    document.body.appendChild(script);

0
 $("#map_view").show("slow"); // use id of div which you want to show.
     var script = document.createElement("script");
     script.type = "text/javascript";
     script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize";
     document.body.appendChild(script);

0

İlk gönderi. GoogleMap div, sekme tıklanana kadar {display: none} içeren bir kapsayıcı div içindeydi. OP ile aynı sorunu yaşadı. Bu benim için çalıştı:

google.maps.event.addDomListener(window, 'load', setTimeout(initialize, 1));

Bu kodu kodunuzun içine ve sonuna kapsayıcı div sekmenizin tıklandığı yere yapıştırın ve gizli div'inizi ortaya çıkarın. Önemli olan, kapsayıcı div'inizin başlatılmadan önce görünür olması gerektiğidir.

Burada ve diğer sayfalarda önerilen bir dizi çözümü denedim ve benim için işe yaramadı. Bunun sizin için işe yarayıp yaramadığını bana bildirin. Teşekkürler.


0

Bu kodu div'den önce ekleyin veya bir js dosyasına aktarın:

<script>
    $(document).on("pageshow","#div_name",function(){
       initialize();
    });

   function initialize() {
   // create the map

      var myOptions = {
         zoom: 14,
         center: new google.maps.LatLng(0.0, 0.0),
         mapTypeId: google.maps.MapTypeId.ROADMAP
      }
      map = new google.maps.Map(document.getElementById("div_name"), myOptions);
   }


</script>

Bu etkinlik, div yüklendikten sonra tetiklenecek ve böylece F5 tuşuna basmak zorunda kalmadan harita içeriğini yenileyecektir.


0

Haritayı gösterdikten sonra bir adrese coğrafi kod yazıyorum ve ardından haritaların merkezini ayarlıyorum. google.maps.event.trigger(map, 'resize');Benim için işe yaramadı.

Kullanmak zorunda kaldım map.setZoom(14);

Aşağıdaki kod:

document.getElementById('map').style.display = 'block';
var geocoder = new google.maps.Geocoder();
        geocoder.geocode({ 'address': input.value }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);
                var marker2 = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
                map.setZoom(14);
                marker2.addListener('dragend', function (event) {
                    $('#lat').val(event.latLng.lat());
                    $('#lng').val(event.latLng.lng());
                });

            }
        });

-1

function init_map() {
  var myOptions = {
    zoom: 16,
    center: new google.maps.LatLng(0.0, 0.0),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  map = new google.maps.Map(document.getElementById('gmap_canvas'), myOptions);
  marker = new google.maps.Marker({
    map: map,
    position: new google.maps.LatLng(0.0, 0.0)
  });
  infowindow = new google.maps.InfoWindow({
    content: 'content'
  });
  google.maps.event.addListener(marker, 'click', function() {
    infowindow.open(map, marker);
  });
  infowindow.open(map, marker);
}
google.maps.event.addDomListener(window, 'load', init_map);

jQuery(window).resize(function() {
  init_map();
});
jQuery('.open-map').on('click', function() {
  init_map();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src='https://maps.googleapis.com/maps/api/js?v=3.exp'></script>

<button type="button" class="open-map"></button>
<div style='overflow:hidden;height:250px;width:100%;'>
  <div id='gmap_canvas' style='height:250px;width:100%;'></div>
</div>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.