Проблемы с Google Maps API v3 + вкладки jQuery UI - PullRequest
70 голосов
/ 15 сентября 2009

Существует ряд проблем, которые, как представляется, довольно хорошо известны при использовании API Карт Google для отображения карты на вкладке пользовательского интерфейса jQuery. Я видел так много вопросов о подобных проблемах (например, здесь и здесь ), но решения там, похоже, работают только для v2 API Карт. Другие ссылки, которые я проверил: здесь и здесь , а также почти все, что я мог найти в Google.

Я пытался вставить карту ( с использованием v3 API ) во вкладку jQuery со смешанными результатами. Я использую последние версии всего (в настоящее время jQuery 1.3.2, jQuery UI 1.7.2, не знаю о Картах).

Это разметка и javascript:

<body>
    <div id="dashtabs">
        <span class="logout">
            <a href="go away">Log out</a>
        </span>
        <!-- tabs -->
        <ul class="dashtabNavigation">
            <li><a href="#first_tab" >First</a></li>
            <li><a href="#second_tab" >Second</a></li>
            <li><a href="#map_tab" >Map</a></li>
        </ul>

        <!--  tab containers -->
        <div id="first_tab">This is my first tab</div>
        <div id="second_tab">This is my second tab</div>
        <div id="map_tab">
             <div id="map_canvas"></div>
        </div>
    </div>
</body>

и

$(document).ready(function() {
    var map = null;
    $('#dashtabs').tabs();
    $('#dashtabs').bind('tabsshow', function(event, ui) {
        if (ui.panel.id == 'map_tab' && !map)
        {
            map = initializeMap();
            google.maps.event.trigger(map, 'resize');
        }
    });
});

function initializeMap() {
    // Just some canned map for now
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
        zoom: 8,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    return new google.maps.Map($('#map_canvas')[0], myOptions);
}

И вот что я обнаружил, что работает / не работает ( для Maps API v3 ):

  • Использование техники off-left, как описано в документации по вкладкам пользовательского интерфейса jQuery (и в ответах на два связанных вопроса), вообще не работает. На самом деле, лучше функционирующий код использует CSS .ui-tabs .ui-tabs-hide { display: none; }.
  • Единственный способ заставить карту отображаться на вкладке - установить абсолютные значения ширины и высоты CSS #map_canvas. Изменение ширины и высоты на auto или 100% приводит к тому, что карта вообще не отображается, даже если она уже была успешно обработана (с использованием абсолютной ширины и высоты).
  • Я не смог найти его нигде, кроме API Карт, но map.checkResize() больше не будет работать. Вместо этого вам нужно запустить событие изменения размера, вызвав google.maps.event.trigger(map, 'resize').
  • Если карта не инициализируется внутри функции, связанной с событием tabsshow, сама карта отображается правильно, а элементы управления - нет - большинство просто отсутствует.

Итак, вот мои вопросы:

  • Есть ли у кого-нибудь еще опыт совершения этого же подвига? Если да, то как вы выяснили, что на самом деле будет работать, поскольку задокументированные приемы не работают для Maps API v3?
  • А как насчет загрузки содержимого вкладки с помощью Ajax согласно документам по пользовательскому интерфейсу jQuery ? У меня не было возможности поиграть с этим, но я предполагаю, что это сломает Карты еще больше. Каковы шансы заставить его работать (или не стоит пытаться)?
  • Как сделать так, чтобы карта занимала максимально возможную площадь? Мне бы хотелось, чтобы он заполнил вкладку и адаптировался к изменениям размера страницы, во многом так же, как это делается на maps.google.com. Но, как я уже сказал, я застрял с применением CSS абсолютной ширины и высоты к карте div.

Извините, если это было слишком скучно, но это может быть единственная документация для Карт API v3 + jQuery. Ура!

Ответы [ 17 ]

22 голосов
/ 16 октября 2010

Примечание: этот ответ получил недопустимое стороннее редактирование, которое по существу заменило его содержимое, чего не должен делать сторонний редактор Тем не менее, результат может быть более полезным, чем оригинал, поэтому обе версии теперь приведены ниже:


  • Оригинальная авторская версия Anon с 2010 года, после одного редактирования от Anon

    google.maps.event.trigger (map, 'resize'); map.setZoom (map.getZoom ());

предлагается http://code.google.com/p/gmaps-api-issues/issues/detail?id=1448 как v3 заменяет v2's checkResize ().

Blech - плохой гугл, без куки.


  • Полная форма переписывания пользователя Eugeniusz Fizdejko 2012:

У меня работает при добавлении маркера:

var marker = new google.maps.Marker({
    position: myLatlng,
    title:"Hello World!"
});

google.maps.event.addListener(map, "idle", function(){
    marker.setMap(map);
});
13 голосов
/ 18 июня 2010

На самом деле поцарапайте мой ответ выше. На сайте jQueryUI есть ответ, и вот он:

Почему ...

... мой слайдер, карта Google, sIFR и т. Д. не работает, когда находится в скрытом (неактивная) вкладка?

Любой компонент, который требует некоторых размерный расчет для его инициализация не будет работать в скрытом вкладка, потому что сама панель вкладок скрыто через дисплей: нет, так что любой элементы внутри не будут сообщать о своих фактическая ширина и высота (0 в большинстве браузеры).

Есть простой обходной путь. Использовать Левый метод для скрытия неактивных панели вкладок. Например. в вашей таблице стилей заменить правило для класса селектор ".ui-tabs .ui-tabs-hide" с

.ui-tabs .ui-tabs-hide {
    position: absolute;
    left: -10000px;
}

Для карт Google вы также можете изменить размер карта, как только вкладка отображается как это:

$('#example').bind('tabsshow', function(event, ui) {
    if (ui.panel.id == "map-tab") {
        resizeMap();
    }
});

resizeMap () вызовет функцию checkResize () Карт Google для конкретной карты.

12 голосов
/ 13 августа 2010

Просто переопределите класс css для скрытой вкладки:

.ui-tabs .ui-tabs-hide {
    position: absolute !important;
    left: -10000px !important;
    display:block !important;
}
9 голосов
/ 28 мая 2012

Это то, что вы можете сделать для Google Maps v3:

google.maps.event.addListenerOnce(map, 'idle', function() {
    google.maps.event.trigger(map, 'resize');
    map.setCenter(point); // be sure to reset the map center as well
});
4 голосов
/ 05 июня 2012

Это не отвечает на все ваши вопросы, но я заставил его работать, а во всех остальных ответах не хватает одного - когда вы перерисовываете карту с событием «изменить размер», вы потеряете место, где была карта сосредоточено на. Поэтому вам также необходимо обновить центр карты снова с помощью setCenter , если ваша карта центрирована на позиции.

Кроме того, вы не хотите инициализировать карту каждый раз, когда происходит изменение вкладки, поскольку это неэффективно и может привести к дополнительным геокодам. Во-первых, вам нужно сохранить свое центрированное местоположение, которое может быть статическим широтой / долготой или, если геокодирование, может выглядеть примерно так:

var address = "21 Jump St, New York, NY"; 
var geocoder = new google.maps.Geocoder();    
var myOptions = {
  zoom: 16,      
  mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

var center;

geocoder.geocode( { 'address': address}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {        
    center = results[0].geometry.location;
    map.setCenter(center);
    var marker = new google.maps.Marker({
        map: map, 
        position: results[0].geometry.location
    });
  } else {
    alert("Geocode was not successful for the following reason: " + status);
  }
});

Тогда

$("#tabs").tabs();

$('#tabs').bind('tabsshow', function(event, ui) {
    if (ui.panel.id == "mapTab") {
        google.maps.event.trigger(map, "resize");
        map.setCenter(center);   // Important to add this!      
    }
});

Где «mapTab» - это идентификатор вашего mapTab, а «map» - это имя переменной для вашего объекта карты.

4 голосов
/ 21 сентября 2010

Я загружаю карты после того, как вкладка была показана.

Это глупо, но у меня это сработало. Просто сохраните URL карты iframe внутри атрибута iframes rel следующим образом:

<iframe width="490" height="300" rel="http://maps.google.com/maps?f=q&amp;source=s..."></iframe>

Это событие установит атрибут iframe src в URL внутри rel.

        $("#tabs").tabs({
            show:function(event, ui) {
                var rel = $(ui.panel).find('iframe').attr('rel');
                $(ui.panel).find('iframe').attr('src',rel);
            }
        });
2 голосов
/ 24 марта 2010

Убедитесь, что код, который инициализирует вашу карту, называется ДО фрагмента, который инициализирует ваши вкладки.

Единственное, что меня раздражало, это то, что нажатие на вкладку карты заставило браузер перейти на карту и вырваться из границы по умолчанию, которую jQuery помещает вокруг контейнера основных вкладок. Я добавил обратный ложный вызов onclick для тега на вкладке карты, чтобы обработать первый, и просто с размером границы: 0 на главном элементе div для обработки второго.

Все это сработало для меня.

Удачи!

1 голос
/ 03 июля 2010

Эй, ребята, этот код исправляет ошибку, но в IE не работает. После поиска и поиска я обнаружил, что мы должны добавить следующую строку, и все работает до совершенства:

< !--[if IE]>
< style type="text/css">
.ui-tabs .ui-tabs-hide { position: relative; }
< /style>
< ![endif]-->
1 голос
/ 19 марта 2010

У меня тоже была эта проблема, я загружал карты через AJAX.

Кажется, что проблема с процентами была связана с тем, что панель не имеет заданного размера (той, что содержит загруженную разметку).

Использование следующего кода при создании вкладок мне очень помогло:

$("#mainTabs").tabs({'show': function(event, ui){
  $(ui.panel).attr('style', 'width:100%;height:100%;');
  return true;
 }});
1 голос
/ 01 декабря 2009

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

map.checkResize()</p> <p> решение .... ничего не работает ... тогда я ... почему бы не инициализировать вкладку, когда вкладка отображается, поэтому я использовал это

$("#servicesSlider ").tabs({        
                //event: 'mouseover'
            fx: { height: 'toggle', opacity: 'toggle'},
            show: function(event, ui) {
                  if (ui.panel.id == "service5") {
                      $(ui.panel).css("height","100%")
                    initialize()
                    }}
            });

"service5" - это идентификатор моей вкладки, в которой хранится моя карта Google v3.

Надеюсь, это работает для вас!

...