як поводитися з картою google всередині прихованого дива (оновлена ​​картинка)


127

У мене є сторінка, і карта Google спочатку знаходиться всередині прихованого дива. Потім я показую div після того, як я натискаю посилання, але відображається лише вгорі зліва від карти.

я спробував запустити цей код після натискання:

    map0.onResize();

або:

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

будь-які ідеї. ось зображення того, що я бачу після показу діва з прихованою картою в ньому.alt текст


З цього питання вже є низка запитань, зокрема показ карти Google із прихованого місця
Метт Балл

@Matt Ball - оновлено, я спробував там додати подію зміни розміру, але все ще не працює
leora

@Matt Ball - у мене це вийшло на роботу. після того, як я створю об’єкт google map, я зберігаю його у глобальній змінній, щоб я міг знову посилатись на нього пізніше, а виклик зміни розміру зараз, здається, працює. Я намагаюся не створювати об’єкт карти кожен раз, коли я показую його, тому що я дозволяю людям переключатися туди-сюди.
leora

@ooo, що дуже просто з наведеним нижче кодом. Все, що вам потрібно додати, - це умова if, щоб перевірити, чи об’єкт карти ініціалізований чи ні. Це був код без манжети, написаний для вирішення вашої початкової проблеми, що полягає в правильному завантаженні карти.
Філар

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

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>

Отже, в основному ви створюєте інстанціалізацію карти лише тоді, коли показано div? Чи можна це зробити так, щоб об’єкт карти був лише миттєво розміщений (на завантаженні сторінки)?
Лукас

1
Я також можу запропонувати затримку setTimeout для виклику другої функції, якщо ви викликаєте show (), щоб забезпечити час для зміни розміру.
Ерік.18

126

У мене була та сама проблема, і я виявив, що коли показують div, дзвони, google.maps.event.trigger(map, 'resize');і, здається, вирішує проблему для мене.


64
Щоб зберегти початковий центр карти відразу після зміни розміру, розгляньте можливість розширення оператора зміни розміру таким чином: var center = map.getCenter (); google.maps.event.trigger (карта, 'розмір'); map.setCenter (центр);
Джон Доппельман

10
Не знаю чому, але мені потрібно загорнути рішення в невеликий setTimeout, щоб він працював: setTimeout (function () {google.maps.event.trigger (map, 'resize')}, 100);
HoffZ

@JohnDoppelmann Дякую за пораду! Не було інтуїтивно зрозуміло, чому він не підтримує центр, а також як його відбити.
Ной Дункан

Після встановлення події "зміни розміру" знову встановіть центр карти та рівень масштабування. Для отримання додаткової інформації дивіться: code.google.com/p/gmaps-api-isissue/isissue/detail?id=1448
ruhong

@HoffZ це, мабуть, пов’язано з тим, що ваш розмір коду запускається перед показовим ефектом, час очікування затримує його, поки показ не буде виконаний, тоді зміна може зробити його спрацьованим. Ви, мабуть, можете досягти того ж ефекту, змінивши порядок виконання коду, щоб переконатися, що під час запуску події, показ дзвінків виконується перед зміною розміру карти.
Бардо

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

Якщо у вас немає змінної карти, вона повинна бути першим елементом (якщо ви не зробили щось дурне) у тому, divщо містить GMAP.


Ви впевнені, що можете запустити елемент на div замість об’єкта google.map.Map ?
Салман А

@SalmanA - Просто перевірив це, і він працював на мене (хоча, мабуть, на карті є новий Центр). З попередніх досліджень я не знав, що це було можливо так кудос до CSN
Hal

CS N ... Це працює для мене, але він залишає центральне положення в неправильному місці. Моя карта ініціалізується як знімок екрана OP, і це як центр: це центрування у верхньому лівому куті моєї map_canvas. Думки про те, як змусити його малювати по центру?
Кірк Росс

13

На вкладці Bootstrap у мене була карта Google, яка відображалася неправильно. Це було моє виправлення.

// 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
Мені довелося замінити "показано" на "показано.bs.tab", щоб це працювало для карти, яка була прихована в неактивній вкладці. Спасибі
Нікола

Я використовую 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);
    }
}

Як слухати подію зміни розміру

Кутова (ng-show або крах u-bootstrap)

Прив’язуйте безпосередньо до видимості елемента, а не до значення, пов'язаного з ng-show, тому що $ watch може запускатись до оновлення ng-show (тому div все ще буде невидимим).

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

jQuery .show ()

Використовуйте вбудований зворотний дзвінок

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

Запуск завантажувального пристрою 3

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

ваш метод модального зміни розміру bootstrap 3 виправив мою проблему чудово, тоді як більшість інших пропозицій не стали. Дякую!
BrianLegg

6

Якщо у вас вставлена ​​карта Google, скопійована / вставивши код iframe, і ви не хочете використовувати API Карт Google , це просте рішення. Просто виконайте наступний рядок javascript, коли ви показуєте приховану карту. Він просто бере 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 з URL-адресою srchttps://www.google.com/maps/embed/v1/place?..
gsinha

6

Можливо також просто запустити подію зміни розміру рідного вікна.

Карти Google завантажуватимуться автоматично:

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, щоб почекати один раз.
Джо Остін

4

З jQuery ви можете зробити щось подібне. Це допомогло мені завантажити карту Google в CMS Umbraco на вкладку, яку не було б видно відразу.

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

waitForVisibleMapElement();

Це єдине рішення, яке працювало на мене і на мою проблему. На вкладці Materialize.CSS у мене була карта google, яка не показувала карту, але показала лише сірий фон із лише логотипом Marker та Google у лівому куті. Я встановлюю розділ вмісту вкладки, щоб ініціалізувати карту, коли вона видима, і вона працює бездоганно. Приклад
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

Я здогадуюсь, що оригінальне запитання пов'язане з картою, яка ініталізована у прихованому розділі сторінки. Я вирішив подібну проблему, змінивши розмір карти в прихованому розділі на документ, готовий після його ініціалізації, незалежно від його статусу відображення. У моєму випадку у мене є 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

Так само, як вказали Джон Доппельман і HoffZ, складіть увесь код так само, як зазначено у вашій функції показу діва або події 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.

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 знаходився в розділі контейнера з {display: none}, поки не натискали вкладку. Мав ту ж проблему, що і ОП. Це працювало для мене:

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

Вставте цей код всередину та в кінці коду, де клацніть вкладку «div div» контейнера, і виявиться ваш прихований div. Важливим є те, що div-контейнер повинен бути видимим, перш ніж ініціалізація може бути викликана.

Я спробував ряд запропонованих тут рішень та інших сторінок, і вони не працювали для мене. Повідомте мене, чи працює це для вас. Дякую.


0

Додайте цей код перед ділом або передайте його у 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

Після показу карти я геокодую адресу та встановлюю центр карт. Thegoogle.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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.