Встретился с серьезной проблемой при размещении на сайте карт от Google Maps, а именно не отображение/не полное отображение карты после загрузки страницы, заметил что тем таких много, а ответов крайне мало, и то, если вы любитель поискать ответы где-то в глубинке форумов, ниже я приведу несколько вариантов решение данных проблем с кодом инициализаций, так что устройтесь поудобней с попкорном и приступайте к чтению
Весь секрет в function loadScript() а также в window.onload который нужно разместить именно ЗА $.mobile.changePage. new google.maps.LatLng — не забываем именно так написать, потому как по другому гугл не поймет что вы от него вообще хочете(изменения для работы с javascript google api v3). Как вы заметили я 2 раза написал window.onload, хотя функция должна выполнятся 1 раз, но при работе с гугл картами почему-то именно 2 раза window.onload спасли меня, не знаю в чем дело, но работает!
Еще один момент, не знаю почему, но при определении размеров div`а в % тоже идет не корректное отображение, решение данной проблемы очень тривиально и просто
Где map_canvas — контейнер в котором отображается наша карта.
Следующая проблема связана с геолокацией гугла, таже проблема, прорисовка карты, ниже привожу полный пример с решением
Решение данной проблемы в этих строках
и опять же нельзя задавать высоту div`а где будет отображаться ваша карта в %.
Это рекомендации которые помогли настроить одинаковое отображение как на планшетных/мобильных так и на стационарных устройствах. Хотя в офф. документации к Javascript google API 3 написаны все примеры с размерами в %, на деле же — головная боль.
Еще одна проблема решение которой я не нашел — отображение элементов управления, они на одних картах пропадают а на других отображаются нормально, вся разница в страницах, код одинаковый, в чем баг так пока и не нашел.
Начальник подсказал интересное решение, на практике помогло, код ниже
и блок карты с обязательным классом
Надеюсь данные советы помогут читателям быстро справится с проблемами отображения гугл карт на мобайл и на обычных устройствах.
//google maps Api $("#companyform_showonmap_page").click(function(){ var geocoder; var map; function initialize() { geocoder = new google.maps.Geocoder(); var latlng = new google.maps.LatLng(-34.397, 150.644); var myOptions = { zoom: 17, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP, timeout: 6000, maximumAge: 50000, enableHighAccuracy:true } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); } /* if ((company.getcompanygpslalo(gpslalo)!=0) && (company.getcompanygpslalo(gpslalo)!= null)){ map.setCenter(company.getcompanygpslalo(gpslalo)); // console.log(results[0].geometry.location.Ua); проверка данных через фаербаг // console.log(results[0].geometry.location.Va); var marker = new google.maps.Marker({ map: map, position: company.getcompanygpslalo(gpslalo) }); }else{*/ function codeAddress() { var address = document.getElementById("address").value; var gps = company.getgpslalo(); // мой обьект в который я передаю кооры с БД geocoder.geocode( { 'address': $("#companyform_gpscoords").val()}, function(results, status) { //тут я отдаю геокодеру все что записано в adress инпуте в формате JSON на поиск console.log(company.getgpslalo(gps)); console.log(gps.la); console.log(gps.lo); if ((gps.la)>0 &&(gps.la)>0) { map.setCenter(new google.maps.LatLng((gps.la),(gps.lo))); pos = new google.maps.LatLng((gps.la),(gps.lo)); // console.log(results[0].geometry.location.Ua); проверка данных с геодаты гугла // console.log(results[0].geometry.location.Va); var marker = new google.maps.Marker({ map: map, position: pos }); } else { //в этом месте я не найдя данных в БД перешел к поиску по input'у address if (status == google.maps.GeocoderStatus.OK) { map.setCenter(results[0].geometry.location); // console.log(results[0].geometry.location.Ua); проверка данных с геодаты гугла // console.log(results[0].geometry.location.Va); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { alert("Геокодирование не было успешным по следующим причинам: " + status); } //company.getcompanycoordinats(results[0].geometry.location.Ua,results[0].geometry.location.Va); ловит геокодированные координаты от гугля } }); } function loadScript() { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "http://maps.google.com/maps/api/js?sensor=true&callback;=initialize"; document.body.appendChild(script); } window.onload = loadScript; $.mobile.changePage("#companyform_showonmap_page"); window.onload = initialize(); window.onload = codeAddress(); });
Весь секрет в function loadScript() а также в window.onload который нужно разместить именно ЗА $.mobile.changePage. new google.maps.LatLng — не забываем именно так написать, потому как по другому гугл не поймет что вы от него вообще хочете(изменения для работы с javascript google api v3). Как вы заметили я 2 раза написал window.onload, хотя функция должна выполнятся 1 раз, но при работе с гугл картами почему-то именно 2 раза window.onload спасли меня, не знаю в чем дело, но работает!
Еще один момент, не знаю почему, но при определении размеров div`а в % тоже идет не корректное отображение, решение данной проблемы очень тривиально и просто
<div id="map_canvas" style="width: 100%; height: 500px; position:center;" ></div>
Где map_canvas — контейнер в котором отображается наша карта.
Следующая проблема связана с геолокацией гугла, таже проблема, прорисовка карты, ниже привожу полный пример с решением
$( "#map-page" ).live( "pageshow", function() var defaultLatLng = new google.maps.LatLng(37.530073, 15.112151); if ( navigator.geolocation ) { function success(pos) { // Location found, show coordinates on map drawMap(new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude)); } function fail() { drawMap(defaultLatLng); // Show default map } // Find users current position navigator.geolocation.getCurrentPosition(success, fail, {enableHighAccuracy:true, timeout: 6000, maximumAge: 50000 }); } else { drawMap(defaultLatLng); // No geolocation support } function drawMap(latlng) { var myOptions = { zoom: 17, center: latlng, zoomControl: true, scaleControl: true, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map( document.getElementById("map-canvas"), myOptions); // Add an overlay to the map of current lat/lng var marker = new google.maps.Marker({ position: latlng, map: map, title: "Вы находитесь тут!" }); } });
Решение данной проблемы в этих строках
{enableHighAccuracy:true, timeout: 6000, maximumAge: 50000 }
и опять же нельзя задавать высоту div`а где будет отображаться ваша карта в %.
Это рекомендации которые помогли настроить одинаковое отображение как на планшетных/мобильных так и на стационарных устройствах. Хотя в офф. документации к Javascript google API 3 написаны все примеры с размерами в %, на деле же — головная боль.
Еще одна проблема решение которой я не нашел — отображение элементов управления, они на одних картах пропадают а на других отображаются нормально, вся разница в страницах, код одинаковый, в чем баг так пока и не нашел.
Начальник подсказал интересное решение, на практике помогло, код ниже
//функция Jquery которая определяет высоту документа и окна, через алерт можно его проверить $.getDocHeight = function(){ return Math.max( $(document).height(), $(window).height(), /* For opera: */ document.documentElement.clientHeight ); }; //alert( $.getDocHeight() ); $(".googlemap").height($.getDocHeight()-10); //ищем классы googlemap и устанавливаем значение высоты карты $(".googlemap").width("98%");// тут мы просто проставляем googlemap`у ширину
и блок карты с обязательным классом
<div id="map_canvas" class="googlemap" style="position:center" ></div>
Надеюсь данные советы помогут читателям быстро справится с проблемами отображения гугл карт на мобайл и на обычных устройствах.
