Проблемы с API-интерфейсами API Google Maps v3 + jQuery

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

Я пытаюсь нанести карту (с помощью 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 UI Tabs (и в ответах на два связанных мной вопроса), не работает вообще. Фактически, наиболее эффективный код использует 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 UI docs? У меня не было возможности поиграть с ним, но я предполагаю, что он еще больше сломает Карты. Каковы шансы заставить его работать (или это не стоит пытаться)?
  • Как сделать карту заполнять максимально возможную область? Я бы хотел, чтобы он заполнил вкладку и адаптировался к изменению размера страницы, в основном так, как это было сделано на maps.google.com. Но, как я уже сказал, я, кажется, застрял в применении только абсолютной ширины и высоты CSS к карте div.

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

Ответ 1

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


  • Оригинальная авторская версия 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 checkResize().

Blech - плохой Google, не cookie.


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

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

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

google.maps.event.addListener(map, "idle", function(){
    marker.setMap(map);
});

Ответ 2

Собери свой ответ выше. На веб-сайте 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 Maps на конкретной карте.

Ответ 3

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

.ui-tabs .ui-tabs-hide {
    position: absolute !important;
    left: -10000px !important;
    display:block !important;
}

Ответ 4

Это то, что вы можете сделать для 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
});

Ответ 5

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

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

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

Ответ 6

Это не отвечает на все ваши вопросы, но я получил его работу, и все остальные ответы пропускают одно: когда вы перерисовываете карту с событием "изменение размера", вы потеряете место, на котором была карта в центре. Поэтому вам также необходимо обновить центр карты с помощью 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" - это имя var для вашего объекта карты.

Ответ 7

Убедитесь, что код, который инициализирует вашу карту, называется ПЕРЕД ФРИФПЕТОМ, который инициализирует ваши вкладки.

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

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

Удачи!

Ответ 8

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

map.checkResize()

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

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

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

Ответ 9

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

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

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

$("#mainTabs").tabs({'show': function(event, ui){
  $(ui.panel).attr('style', 'width:100%;height:100%;');
  return true;
 }});

Ответ 10

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

< !--[if IE]>
< style type="text/css">
.ui-tabs .ui-tabs-hide { position: relative; }
< /style>
< ![endif]-->

Ответ 11

Вы можете позвонить

map.fitBounds(границы)

который сделает обновление

Ответ 12

Очень раздражающая проблема, но с небольшим взломом она исправляется. Ключ состоит в том, чтобы относительная позиция #tabs была отрегулирована к внешнему краю каждой из вкладок при выборе нового. Вот как я это сделал:

$('#tabs').tabs({
   selected:0,
   'select': function(event, ui) {
    //this is the href of the tab you're selecting
    var currentTab = $(ui.tab).attr('href');
    //this is the height of the related tab plus a figure on the end to account for padding...
    var currentInner = $(currentTab + '.detail-tab').outerHeight() + 40;
    //now just apply the height of the current tab you're selecting to the entire position:relative #tabs ID
    $('#tabs').css('height', currentInner);
   }
  });

здесь используется css i:

#tabs { position: relative; }
/*set the width here to whatever your column width is*/
.ui-tabs-panel{ position:absolute;top:0px; left:0; width:575px;}
.ui-tabs-panel.ui-tabs-hide { display:block !important; position:absolute;  left:-99999em; top:-9999em}

Ответ 13

Я легко справился с этой задачей Асинхронно загружая API, а затем просто вызывая loadScript из тега <a>, связанного с соответствующей вкладкой из события onclick:

<li><a href="#tab3" onclick="loadScript();">Maps</a></li>

Ответ 14

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

jQuery(document).ready(function($) {
$( '#tabs' ).tabs();
var href = $('#tabs').find('a[href="#tabs-4"]');
(href).on('click',function(){
    initialize();
})});
var map;
function initialize() {
  var mapOptions = {
    zoom: 8,
    center: new google.maps.LatLng(-34.397, 150.644),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  map = new google.maps.Map(document.getElementById('map'),
      mapOptions);
}

<div id="tabs-4">
    <div id="map" style="width:580px;height:380px;">
    </div>
</div>

Ответ 15

Другое решение для Maps API v3 (exp) и jQuery UI 1.10:

var pano = new google.maps.StreetViewPanorama(...);

$('#tabs').tabs({
  'activate': function(event, ui) {
    if (ui.newPanel[0].id == "maps-tabs-id") {
      pano.setVisible(true);
    }
  }
});

Ответ 16

Я сделал то, что говорит Кейт, и это работает для меня, в моем случае я использую путевые точки jQuery для моей навигации с вкладками, чтобы лучше понять здесь код, который я использовал:

В HEAD

<head>

<!-- Google Maps -->
<script>
function initialize() {
  var mapOptions = {
    zoom: 8,
    center: new google.maps.LatLng(-34.397, 150.644)
  };

  var map = new google.maps.Map(document.getElementById('map_canvas'),
      mapOptions);
}

function loadScript() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp' + '&signed_in=true&callback=initialize';
  document.body.appendChild(script);
}
window.onload = loadScript;
</script>

</head>

Внутри моих вкладок:

<li><a href="#MyMap" onclick="loadScript();">My Map</a></li>

Тогда в DIV

<div id="map_canvas"></div>

Надеюсь, это поможет кому-то, спасибо всем!

Ответ 17

Я столкнулся с той же проблемой в Semantic UI, проблема была исправлена ​​при вызове функции init(); при загрузке вкладки или вы также можете связать ее.