Неверная позиция карты Google при загрузке

У меня проблема с iframed картой Google. В принципе, позиция неверна, но не всегда. Я думаю, что проблема может иметь какое-то отношение к тому, что карта находится в скрытом div, который отображается позже.

Может ли кто-нибудь проверить, что это действительно проблема, или предложить решение для этого? У меня нет большого контроля над картой, так как она iframed откуда-то еще.

Я попытался предоставить iframe идентификатор, который затем нацелен на google.maps.event.trigger(map, "resize"); на функцию, которая показывает родительский контейнер, но безрезультатно.

РЕДАКТИРОВАТЬ
В соответствии с запросом здесь карта:

<iframe width="450" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/?ie=UTF8&amp;t=m&amp;ll=56.084298,11.074219&amp;z=6&amp;output=embed"></iframe>

Как вы можете видеть, ничего особенного в этом нет. Он должен был показать Данию, но это несколько раз показывает Германию и Польшу. Я уверен, что это хорошие места, но клиент видит малое использование.

Ответ 1

Я также могу подтвердить эту проблему. Я не думаю, что это связано с вашим скрытым div, поскольку у меня есть проблема с фиксированными элементами.

Проблема заключается в том, что место, по которому вы хотите, чтобы карта была сосредоточена, по какой-то причине заканчивается в верхнем левом углу iframe. Я думаю, это потому, что на стороне Google событие изменения размера карты запускается слишком рано, прежде чем он узнает полный размер iFrame.

Попробуйте это, пока это работает для меня:

  • Удалите тег iframe src.

  • Вставьте ниже код javascript где-то ниже iframe:

    <script type='text/javascript'>
        jQuery("iframe#headerMap").attr("src", "http://maps.google.com/maps/ms?etc etc....");
    </script>
    

Потому что он загружает карту после iframe. Если у меня все еще будут проблемы в будущем, я попытаюсь добавить короткую задержку к вышеуказанному коду, заставив его работать после загрузки документа.

Ответ 2

Простое решение:

  • Поместите iframe внутри div с id = "map".
  • Не скрывайте div, потому что карта будет сгенерирована неправильно.
  • Поместите абсолютный div, 10.000 пикселей слева. В этом случае карта не будет отображаться на экране, но будет загружена.

    jQuery ('# map'). css ({ "position": "absolute", "left": "- 10000px" });

  • Когда вы нажимаете кнопку, чтобы отобразить карту, добавьте:

    jQuery('#map').show(); jQuery('#map').css({"position":"static"});
    
  • Чтобы скрыть div, добавьте:

    JQuery ( '# карта') скрыть();.

Ответ 3

Событие "resize" принимает объект карты как аргумент, а не идентификатор. Поскольку вы используете maps.google.com в iframe, я не считаю возможным доступ к фактическому объекту карты.

К сожалению, я считаю, что лучшим ответом является переход на использование простой реализации API Google Maps v3 вместо внедрения maps.google.com в iframe. Это позволит вам правильно "изменить размер" при необходимости, так как у вас будет доступ к объекту карты.

Здесь документация: http://code.google.com/apis/maps/documentation/javascript/tutorial.html

Настройте простую реализацию, например, этот пример: http://code.google.com/apis/maps/documentation/javascript/examples/map-simple.html

Затем оставьте свой вызов google.maps.event.trigger(карта, "изменить размер" ); когда вы показываете скрытый контейнер.

Ответ 4

Можно подтвердить, что я столкнулся с этой проблемой при отображении двух карт в div с вкладками. То есть один div загружает скрытый.

Самый простой способ, с которым я столкнулся, состоит в том, чтобы просто использовать бит проб и ошибок и смещать карту перед копированием и вставлять код вставки, чтобы компенсировать ошибочное смещение карты. Но просто не забудьте оставить внешнюю ссылку (ссылку внизу на внешнюю карту google) в качестве исходного href, иначе эта карта будет также смещена.

Ответ 5

Я предлагаю загрузить карту с некоторой временной задержкой после проверки того, что div виден или нет, что будет удерживать карту. Работал для меня

  $(document).ready(function () {
        $('.togglebtn').click(function () {

 if(!$('#map_canvas').is(':visible')){
                setTimeout(function(){initialize()}, 500);
                }
    });
});


   //your function
 function initialize() {


        var mapOptions = {
            zoom: 3,
          center :  new google.map.LatLng(31.510474,80.352287),
            center: new google.maps.LatLng(44.510474, 50.352287),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

        var contentSC_PAK = "SoftCircles Pakistan";
        .....
        ..... 

        and rest of your map code to initialize map



        });

    }

Ответ 6

Я предлагаю загрузить карту с некоторой временной задержкой после проверки того, что div виден или нет, что будет удерживать карту. Попробуйте!

  $(document).ready(function () {
        $('.togglebtn').click(function () {

 if(!$('#map_canvas').is(':visible')){
                setTimeout(function(){initialize()}, 500);
                }
    });
});


   //your function
 function initialize() {


        var mapOptions = {
            zoom: 3,
          center :  new google.map.LatLng(31.510474,80.352287),
            center: new google.maps.LatLng(44.510474, 50.352287),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

        var contentSC_PAK = "SoftCircles Pakistan";
        .....
        ..... 

        and rest of your map code to initialize map



        });

    }

Ответ 7

Этот не работал у меня:

jQuery("iframe#headerMap").attr("src", "http://maps.google.com/maps/ms?etc etc....");

... поэтому мне пришлось найти другой способ решить эту проблему.

Моя проблема заключалась в том, что у меня был <div>, который был display: none, и стал видимым таким образом через 2,5 секунды, как это:

setTimeout(function() {
    $("#contents")
    .css({opacity: 0}).fadeIn()
    .animate({opacity:1}, 1000, function() {
    });
}, 2500);

И я хотел, чтобы карта Google отображалась в #contents, и у меня была та же проблема, что красный маркер находился в верхнем левом углу.

Итак, я добавил на страницу <div id="map"></div>.

Затем я добавил материал iframe в php файл под названием map.php, и я добавил эту строку jquery ниже:

setTimeout(function() {
    $("#map").load('map.php');
}, 2500);

Итак, он загрузил map.php с iframe в div с map id. Он отлично работал.