วิธีจัดการกับแผนที่ google ภายใน div ที่ซ่อนอยู่ (ภาพที่อัปเดต)


127

ฉันมีเพจและแผนที่ Google อยู่ใน div ที่ซ่อนไว้ในตอนแรก จากนั้นฉันจะแสดง div หลังจากที่ฉันคลิกลิงก์ แต่มีเพียงด้านบนซ้ายของแผนที่เท่านั้นที่ปรากฏขึ้น

ฉันพยายามให้รหัสนี้ทำงานหลังจากคลิก:

    map0.onResize();

หรือ:

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

ความคิดใด ๆ นี่คือภาพของสิ่งที่ฉันเห็นหลังจากแสดง div พร้อมกับแผนที่ที่ซ่อนอยู่ในนั้นข้อความแสดงแทน


มีคำถามมากมายเกี่ยวกับ SO เกี่ยวกับเรื่องนี้รวมถึงการแสดงแผนที่ Google จากพื้นที่ที่ซ่อนอยู่
Matt Ball

@Matt Ball - ตามที่อัปเดตฉันพยายามเพิ่มเหตุการณ์การปรับขนาดที่นั่น แต่ก็ยังไม่ทำงาน
leora

@Matt Ball - ฉันทำให้มันได้ผล หลังจากที่ฉันสร้างออบเจ็กต์แผนที่ google ฉันเก็บสิ่งนั้นไว้ในตัวแปรส่วนกลางเพื่อให้ฉันสามารถอ้างอิงได้อีกครั้งในภายหลังและการเรียกปรับขนาดตอนนี้ดูเหมือนจะใช้งานได้ ฉันพยายามที่จะไม่ต้องสร้างวัตถุแผนที่ขึ้นมาใหม่ทุกครั้งที่ฉันแสดงเพราะฉันอนุญาตให้คนอื่นสลับไปมาได้
leora

@ooo นั้นง่ายมากด้วยรหัสด้านล่าง สิ่งที่คุณต้องเพิ่มคือเงื่อนไข if เพื่อตรวจสอบว่าวัตถุแผนที่ได้รับการเตรียมใช้งานแล้วหรือไม่ นี่คือรหัสปิดข้อมือที่เขียนขึ้นเพื่อแก้ไขปัญหาเริ่มต้นของคุณซึ่งคือการโหลดแผนที่อย่างถูกต้อง
Philar

@philar - ครับ. . ขอบคุณที่นี่. . จึงโหวตขึ้น :) ไม่ว่าจะด้วยวิธีใดฉันต้องจัดเก็บตัวแปรในระดับโลกเพื่อหลีกเลี่ยงการเริ่มต้นใหม่
leora

คำตอบ:


103

เพิ่งทดสอบด้วยตัวเองและนี่คือวิธีที่ฉันเข้าหามัน ตรงไปตรงมาโปรดแจ้งให้เราทราบหากคุณต้องการคำชี้แจงใด ๆ

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>

จาวาสคริ

<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>

โดยพื้นฐานแล้วคุณจะสร้างอินสแตนซ์แผนที่เมื่อ div ปรากฏขึ้นเท่านั้น? มีวิธีใดบ้างที่จะทำให้วัตถุแผนที่ถูกสร้างอินสแตนซ์เพียงครั้งเดียว (ในการโหลดหน้า)
lucas

1
ฉันสามารถแนะนำการหน่วงเวลา setTimeout เพื่อเรียกใช้ฟังก์ชันที่สองได้หากคุณกำลังเรียกใช้รายการ () เพื่อให้มีเวลาในการปรับขนาด
Eric.18

126

ฉันประสบปัญหาเดียวกันและพบว่าเมื่อแสดง div โทรgoogle.maps.event.trigger(map, 'resize');และดูเหมือนว่าจะแก้ไขปัญหาให้ฉันได้


64
เพื่อรักษาจุดศูนย์กลางเดิมของแผนที่ไว้ทันทีหลังจากปรับขนาดแล้วให้พิจารณาขยายคำสั่ง resize ด้วยวิธีนี้: var center = map.getCenter (); google.maps.event.trigger (แผนที่ 'ปรับขนาด'); map.setCenter (กลาง);
John Doppelmann

10
ไม่แน่ใจว่าทำไม แต่ฉันต้องรวมโซลูชันไว้ใน setTimeout ขนาดเล็กเพื่อให้ใช้งานได้: setTimeout (function () {google.maps.event.trigger (map, 'resize')}, 100);
HoffZ

@JohnDoppelmann ขอบคุณสำหรับคำแนะนำ! มันไม่ง่ายเลยว่าทำไมมันถึงไม่รักษาจุดศูนย์กลางและวิธีบังคับกลับ
Noah Duncan

ตั้งศูนย์แผนที่และระดับการซูมอีกครั้งหลังจากเรียกใช้เหตุการณ์ "ปรับขนาด" สำหรับข้อมูลเพิ่มเติมโปรดดูcode.google.com/p/gmaps-api-issues/issues/detail?id=1448
ruhong

@HoffZ อาจเป็นเพราะโค้ดการปรับขนาดของคุณเริ่มทำงานก่อนที่จะแสดงเอฟเฟกต์การหมดเวลาจะล่าช้าจนกว่าจะมีการแสดงจากนั้นการปรับขนาดจะทำให้สามารถใช้งานได้ คุณอาจได้ผลเช่นเดียวกันในการเปลี่ยนลำดับการดำเนินการของรหัสเพื่อให้แน่ใจว่าเมื่อเริ่มทำงานเหตุการณ์การแสดง div จะถูกดำเนินการก่อนที่จะปรับขนาดแผนที่
Bardo

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

หากคุณไม่มีแผนที่ตัวแปรควรเป็นองค์ประกอบแรก (เว้นแต่คุณจะทำอะไรโง่ ๆ ) ในdivที่มี GMAP


คุณแน่ใจหรือไม่ว่าคุณสามารถทริกเกอร์องค์ประกอบบนdivแทนที่จะเป็นวัตถุgoogle.map.Map
Salman A

@SalmanA - เพิ่งตรวจสอบสิ่งนี้ & มันใช้งานได้สำหรับฉัน (แม้ว่าแผนที่ดูเหมือนจะมีศูนย์ใหม่) จากการวิจัยก่อนหน้านี้ฉันไม่รู้ว่าสิ่งนี้เป็นไปได้เช่นกันดังนั้นการชื่นชม CSN
Hal

CS N ... สิ่งนี้ได้ผลสำหรับฉัน แต่มันทำให้ตำแหน่งตรงกลางอยู่ผิดจุด แผนที่ของฉันกำลังเริ่มต้นเหมือนภาพหน้าจอของ OP และมันก็เหมือนศูนย์กลาง: อยู่ตรงกลางที่มุมบนซ้ายของ map_canvas ของฉัน มีความคิดที่จะดึงให้อยู่กึ่งกลาง?
Kirk Ross

13

ฉันมีแผนที่ Google อยู่ในแท็บ Bootstrap ซึ่งแสดงไม่ถูกต้อง นี่คือการแก้ไขของฉัน

// 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
ฉันต้องแทนที่ 'แสดง' เป็น 'shown.bs.tab' เพื่อให้สิ่งนี้ใช้งานได้กับแผนที่ที่ซ่อนอยู่ในแท็บที่ไม่ใช้งาน ขอบคุณ
Nicola

ฉันใช้ SmartWizard 4 และนี่เป็นวิธีเดียวที่ใช้ได้ผลสำหรับฉันและมันก็ใช้ได้ดีมาก! ผมเปลี่ยน'a[href="#profileTab"]'ไปstep-2ซึ่งเป็นชื่อของ DIV DIV ที่มีแผนที่
GeospatialPython.com

7

วิธีรีเฟรชแผนที่เมื่อคุณปรับขนาด div

แค่โทรไปยังไม่พอgoogle.maps.event.trigger(map, 'resize');คุณควรรีเซ็ตจุดศูนย์กลางของแผนที่ด้วย

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);
    }
}

วิธีฟังเหตุการณ์การปรับขนาด

Angular (การยุบตัวของ ng-show หรือ ui-bootstrap)

เชื่อมโยงโดยตรงกับการมองเห็นขององค์ประกอบแทนที่จะเป็นค่าที่ผูกไว้กับ ng-show เนื่องจาก $ watch สามารถเริ่มทำงานได้ก่อนที่จะอัปเดต ng-show (ดังนั้น div จะยังคงมองไม่เห็น)

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

jQuery .show ()

ใช้การโทรกลับในตัว

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

Bootstrap 3 Modal

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

วิธีการปรับขนาดโมดอล bootstrap 3 ของคุณแก้ไขปัญหาของฉันได้อย่างสมบูรณ์แบบในขณะที่คำแนะนำอื่น ๆ ส่วนใหญ่ไม่ได้ ขอบคุณ!
BrianLegg

6

หากคุณมี Google Map แทรกโดยการคัดลอก / วางโค้ด iframe และคุณไม่ต้องการใช้ Google Maps APIนี่เป็นวิธีง่ายๆ เพียงดำเนินการตามบรรทัดจาวาสคริปต์ต่อไปนี้เมื่อคุณแสดงแผนที่ที่ซ่อนอยู่ เพียงแค่ใช้โค้ด HTML ของ iframe และแทรกลงในที่เดียวกันดังนั้นจึงแสดงผลอีกครั้ง:

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

jQuery เวอร์ชัน:

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

HTML:

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

ตัวอย่างต่อไปนี้ใช้ได้กับแผนที่ที่ซ่อนอยู่ในแท็บ Bootstrap 3:

<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 JS แต่ใช้ iframe กับ src urlhttps://www.google.com/maps/embed/v1/place?..
gsinha

6

นอกจากนี้ยังเป็นไปได้ที่จะทริกเกอร์เหตุการณ์ปรับขนาดหน้าต่างดั้งเดิม

Google Maps จะโหลดตัวเองใหม่โดยอัตโนมัติ:

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

5

ฉันมีปัญหาเดียวกันปัญหาgoogle.maps.event.trigger(map, 'resize')นี้ไม่ได้ผลสำหรับฉัน

สิ่งที่ฉันทำคือตั้งเวลาในการอัปเดตแผนที่หลังจากวาง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(....
    ....
}

ฉันไม่รู้ว่ามันเป็นวิธีที่สะดวกกว่าหรือเปล่า แต่ได้ผล!


ใช้ setTimeout เพื่อรอหนึ่งครั้ง
Joe Austin

4

ด้วย jQuery คุณสามารถทำสิ่งนี้ได้ สิ่งนี้ช่วยฉันโหลด Google Map ใน Umbraco CMS บนแท็บที่ไม่สามารถมองเห็นได้จากทันที

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

waitForVisibleMapElement();

นี่เป็นทางออกเดียวที่ใช้ได้ผลสำหรับฉันและปัญหาของฉัน ฉันมีแผนที่ Google อยู่ในแท็บ Materialize.CSS ที่ไม่แสดงแผนที่ แต่มีเพียงพื้นหลังสีเทาพร้อมเครื่องหมายและโลโก้ Google ที่มุมซ้ายเท่านั้น ฉันตั้งค่า div เนื้อหาแท็บเพื่อเริ่มต้นแผนที่เมื่อมองเห็นได้และทำงานได้อย่างสมบูรณ์ ตัวอย่าง
Gorgon_Union

3

โซลูชันของฉันง่ายและมีประสิทธิภาพมาก:

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

ฉันเดาว่าคำถามเดิมมาจากแผนที่ที่มีการระบุไว้ใน div ที่ซ่อนอยู่ของหน้า ฉันแก้ไขปัญหาที่คล้ายกันโดยการปรับขนาดแผนที่ใน div ที่ซ่อนอยู่เมื่อเอกสารพร้อมหลังจากเริ่มต้นแล้วโดยไม่คำนึงถึงสถานะการแสดงผล ในกรณีของฉันฉันมีแผนที่ 2 แผนที่แผนที่หนึ่งถูกแสดงและอีกแผนที่ถูกซ่อนไว้เมื่อเริ่มต้นและฉันไม่ต้องการเริ่มต้นแผนที่ทุกครั้งที่มีการแสดง เป็นโพสต์เก่า แต่ฉันหวังว่ามันจะช่วยทุกคนที่กำลังมองหา


2

ฉันพบว่าสิ่งนี้ใช้ได้ผลสำหรับฉัน:

เพื่อซ่อน:

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

เพื่อที่จะแสดง:

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

2

หากใช้ภายในแท็บ Bootstrap v3 สิ่งต่อไปนี้ควรใช้งานได้:

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

ที่tab-locationเป็นรหัสของแผนที่ที่มีแท็บ


2

เช่นเดียวกับที่ John Doppelmann และ HoffZ ระบุให้ใส่รหัสทั้งหมดเข้าด้วยกันดังนี้ในฟังก์ชันการแสดง div หรือเหตุการณ์ onclick:

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

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน


0

วิธีแก้ปัญหาของฉันคือ:

CSS:

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

jQuery:

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

0

ฉันไม่ชอบที่แผนที่จะโหลดหลังจากที่เห็น div ที่ซ่อนอยู่เท่านั้น ตัวอย่างเช่นในภาพหมุนนั้นใช้ไม่ได้จริง

นี่คือวิธีแก้ปัญหาของฉันคือการเพิ่มคลาสให้กับองค์ประกอบที่ซ่อนอยู่เพื่อยกเลิกการซ่อนและซ่อนด้วยตำแหน่งสัมบูรณ์แทนจากนั้นแสดงแผนที่และลบคลาสออกหลังจากโหลดแผนที่

ทดสอบใน Bootstrap Carousel

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

ใช้รหัสบรรทัดนี้เมื่อคุณต้องการแสดงแผนที่

               $("#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

โพสต์แรก googleMap div ของฉันอยู่ภายในคอนเทนเนอร์ div ที่มี {display: none} จนกระทั่งคลิกแท็บ มีปัญหาเดียวกันกับ OP. สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

ติดรหัสนี้ไว้ด้านในและท้ายโค้ดของคุณที่แท็บ div คอนเทนเนอร์ของคุณถูกคลิกและแสดง div ที่ซ่อนอยู่ สิ่งสำคัญคือต้องมองเห็นคอนเทนเนอร์ div ของคุณก่อนที่จะเรียกเริ่มต้น

ฉันลองใช้วิธีแก้ปัญหาหลายอย่างที่เสนอไว้ที่นี่และหน้าอื่น ๆ แต่ก็ไม่ได้ผลสำหรับฉัน โปรดแจ้งให้เราทราบหากวิธีนี้เหมาะกับคุณ ขอบคุณ


0

เพิ่มรหัสนี้ก่อน div หรือส่งต่อไปยังไฟล์ js:

<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>

เหตุการณ์นี้จะถูกทริกเกอร์หลังจากที่ div โหลดดังนั้นมันจะรีเฟรชเนื้อหาแผนที่โดยไม่ต้องกด F5


0

เมื่อแสดงแผนที่ฉันกำลังระบุตำแหน่งทางภูมิศาสตร์จากนั้นตั้งค่าศูนย์กลางแผนที่ google.maps.event.trigger(map, 'resize');ไม่ทำงานสำหรับฉัน

ฉันต้องใช้ไฟล์ map.setZoom(14);

รหัสด้านล่าง:

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.