Карты Google не работают на вкладках jQuery - PullRequest
8 голосов
/ 27 февраля 2012

Google карты не работают, когда они размещаются на вкладках jQuery - это вопрос, который есть во всем ИнтернетеВ моем исследовании пока что ни одно из решений не работает.Надеюсь, кто-то здесь может помочь ...

Это скриншот ошибки в Firefox 10, Chrome 17, Safari 5.1.2, Opera 11.61.http://www.flickr.com/photos/75523633@N04/6932970713/

Ошибка отсутствует в IE8 и является прерывистой в 9. В Firefox она исчезает при открытии FireBug.

Сайт находится в Wordpress 3.3.1 и на картегенерируется / извлекается с помощью плагина.Кажется, не имеет значения, какой плагин для карт я использую;ошибка остается прежней.Судя по моим исследованиям, это проблема js / jQuery между вкладками и JavaScript API Google Map, а не проблема Wordpress / плагина.

Вот мой код.Прямо сейчас я использую плагин wp-gmappity-easy-google-maps для карт, но я также попробовал всесторонний плагин-google-map-map.Оба прекрасно работают вне вкладок.

HTML:

// Header calls:
<script type='text/javascript' src='http://maps.google.com/maps/api/js?sensor=false'></script>
<script type='text/javascript' src='http://xxxxxxxxxx.com/wp-content/themes/zzzzzzzzzz/scripts/tabs.min.js'></script>
// HTML Body:
<div class="tabs_framed_container">
<ul class="tabs_framed">
    <li><a href="#">Tab 1</a></li>
    <li><a href="#">Tab 2</a></li>
    <li><a href="#">Tab 3</a></li>
    <li><a href="#">Map Tab</a></li>
    <li><a href="#">Tab 3</a></li>
</ul>
<div class="tabs_framed_content">
    <h2>Tab 1 Content</h2>
    <!-- Some Content -->
</div>
<div class="tabs_framed_content">
    <h2>Tab 2 Content</h2>
    <!-- Some Content -->
</div>
    <h2>Tab 3 Content</h2>
    <!-- Some Content -->
</div>
<div class="tabs_framed_content">
    <div class="map_container">
        <div style="width:900px;margin-left:auto;margin-right:auto;">
            <div class="wpgmappity_container" id="wpgmappity-map-1" style="width:900px;height:400px;margin-left:auto;margin-right:auto;"></div>
        </div>
        <script type="text/javascript">
            function wpgmappity_maps_loaded1() {
            var latlng = new google.maps.LatLng(42.4005322,-71.2750094);
            var options = {
                center: latlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                zoomControl : true,
                zoomControlOptions :
                {
                    style: google.maps.ZoomControlStyle.SMALL,
                    position: google.maps.ControlPosition.TOP_LEFT
                },
                mapTypeControl : true,
                mapTypeControlOptions :
                {
                    style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
                    position: google.maps.ControlPosition.TOP_RIGHT
                },
                scaleControl : true,
                scaleControlOptions :
                {
                    position: google.maps.ControlPosition.TOP_LEFT
                },
                streetViewControl : true,
                streetViewControlOptions :
                {
                    position: google.maps.ControlPosition.TOP_LEFT
                },
                panControl : false,  zoom : 14
            };
            var wpgmappitymap1 = new google.maps.Map(document.getElementById('wpgmappity-map-1'), options);
            var point0 = new google.maps.LatLng(42.4005322,-71.2750093);
            var marker1_0 = new google.maps.Marker({
                icon : 'http://xxxxxxxxxx.com/wp-content/themes/zzzzzzzzzz/images/mapmarker.png',
                position : point0,
                map : wpgmappitymap1
                });
            }
            jQuery(window).load(function() {
                wpgmappity_maps_loaded1();
            });
        </script>
    </div>
</div>
<div class="tabs_framed_content">
    <h2>Tab 2 Content</h2>
    <!-- Some Content -->
</div>

Вот соответствующий CSS:

.tabs_framed{padding:0;margin:0;list-style-type:none;clear:left;height:25px;border-bottom:1px solid #E5E5E5;}
.tabs_framed_container{margin-bottom:40px;}
.tabs_framed a{
    display:block; position:relative; background:#fafafa; border:1px solid #E5E5E5; padding:7px 30px; margin-right:2px;
    font-size:10px; text-decoration:none; text-transform:uppercase; letter-spacing:1px; line-height:10px; color:#777;
    opacity:1; -webkit-transition:all .5s ease; -moz-transition:all .5s ease; -o-transition:all .5s ease; transition:all .5s ease;
}
.tabs_framed a:hover{color:#20548B;text-decoration:none;background:#fff;}
.tabs_framed a.current{color:#000;cursor:default;border-bottom:1px solid #fff;background:#fff;}
.tabs_framed li,{padding:0;margin:0;list-style-type:none;float:left;}
.tabs_framed_content{display:none;background-color:#fff;border:1px solid #E5E5E5;border-width:0 1px 1px 1px;padding:30px 30px 15px 30px;}

div.wpgmappity_container img { 
    background-position: 0% 0%;
    background-color: none !important;
    max-width: none !important;
    background-image: none !important;
    background-repeat: repeat !important;
    background-attachment: scroll !important;
}

Вот ссылка нафайл, который управляет моими вкладками: http://themes.mysitemyway.com/awake/wp-content/themes/awake/lib/scripts/tabs.min.js

flowplayer.org / tools / forum / 25/79274 - это одно решение, которое я нашел (прокрутите вниз).Однако checkResize и resizeMap больше не работают (см. Ссылку на API на code.google.com/apis/maps/documentation/javascript/reference.html#Map, прокрутите немного вниз до «События» и найдите google.maps.event.триггер (map, 'resize'), который, по-видимому, является кодом замены).www.raymondcamden.com/index.cfm/2009/6/5/jQuery-Tabs-and-Google-Maps - это еще одна устаревшая запись.

Я видел это предложенное:

jQuery(document).ready(function(){
jQuery('.tabs_container').bind('tabsshow', function(event, ui) {
    if (ui.panel.id == "map-tab") {
        google.maps.event.trigger(map, 'resize');
    }
});
});

, но я понятия не имею, как его реализовать (пробовал несколько способов, но безуспешно), или если это вообще сработает.

Из всех моих исследований похоже, что вы должны вызвать событие изменения размера карты, когда выбрана вкладка, содержащая карту.Пока что мне не повезло адаптировать какое-либо из решений, особенно потому, что я немного знаком с js / jQuery.Кажется, что кто-то, знакомый с js или jQuery, может решить эту проблему.

Пожалуйста, помогите мне.

Ответы [ 13 ]

12 голосов
/ 26 сентября 2013

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

Когда я нажимаю на группу вкладок 2 (# tg2), отображается первая вкладка карты.Мне также нужно было запустить изменение размера, если кто-то нажал на вкладку второго уровня (# tab1) из группы вкладок 2.

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

// Create Map
var map;
function initialize() {
  var mapOptions = {
    zoom: 8,
    center: new google.maps.LatLng(48.8582, 2.2945), //I see Paris, I see France
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
 map = new google.maps.Map(document.getElementById('map-canvas'),
  mapOptions);
}

//Bind click handlers - Here's the important part
$('a[href=#tab1], a[href=#tg2]').on('click', function() {
    setTimeout(function(){
        google.maps.event.trigger(map, 'resize');
    }, 50);
});

Итак, мы говорим браузеру подождать 50 мс после нажатия, чтобы выполнить изменение размера.В моем тестировании 50 мс было достаточно для отображения вкладки, но достаточно коротким, чтобы это не было заметно для пользователя.На самом деле, мои тесты работали с задержкой всего 1 мс на 4-5 машинах, на которых я их тестировал - даже на медленном ноутбуке, который мы сидели на складе.50 мс просто безопасно.

Надеюсь, это поможет кому-то еще.

7 голосов
/ 16 апреля 2012

Я отказался от плагинов и пошел с шорткодом Google Maps, который был выпущен для темы, которую я использую.В то время как я теряю функциональность пользовательских маркеров, разработчики тем наконец смогли помочь заставить все это работать.Они добавили следующий код в PHP-файл шорткода.

jQuery('ul.tabs_framed').data('tabs').onClick(function(e,index) {
    resizeMap(" . 'map'.$map_id .") 
});
function resizeMap(m) {
    x = m.getZoom();
    c = m.getCenter();
    google.maps.event.trigger(m, 'resize');
    m.setZoom(x);
    m.setCenter(c);
};

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

1 голос
/ 06 февраля 2015

Это может не работать для всех!Одним из решений, которое мне помогло, было отображение скрытых вкладок, но где-то «невидимых» для пользователя.Это позволит карте отображаться, даже если она не находится на первой / активной вкладке.Найдите способ нацеливаться только на скрытые вкладки:

.tab-hidden{
    position: absolute !important;
    left: -10000px !important; /* maybe not that much */
    display:block !important;
    width:100% !important; /* I found this to be very important*/
}

Ширина карты 100%, а не фиксированная ширина.

1 голос
/ 20 октября 2014

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

Я добавил следующую внешнюю функцию initialize ():

jQuery('.nav-tabs a[href="#my-map"]').on('shown.bs.tab', function(){
         google.maps.event.trigger(map, 'resize');
         map.setZoom(15); //You need to reset zoom
         map.setCenter(myLatlng); //You need to reset the center
    });
1 голос
/ 07 апреля 2014

Раньше у меня была такая же проблема для реализации google-карты внутри вкладок, особенно когда карта не в первом выборе.Но я пробовал, и это работает с таким простым решением, как это:

Сделать простую функцию js:

<script type="text/javascript">

function ResetMap() {
google.maps.event.trigger(map, 'resize');
}

</script>


<li><a href="#tab1">Select Tab1</a></li>
<li onClick="ResetMap();"><a href="#tab2">Select Google Map</a></li>

<div class="tab1-content" id="tab1">Content tab1</div>
<div class="tab2-content" id="tab2"><?php include_once ('google-map.php') ?></div>
1 голос
/ 28 сентября 2013

Ни один из приведенных ответов не является полностью правильным.Проблема возникает потому, что холст карты установлен на ширину: 0;высота: 0 по умолчанию перед загрузкой, а затем ожидает, что вы либо пропустите измерение, либо получите измерения от родителя, так как это находится на вкладках jQuery, там нет измерений.

Как упоминалось выше, привязка к событию clickвкладку и установите измерение map_canvas, затем вызовите google.maps.event.trigger ()

 $(function(){

$('#maptab').bind('click',function() {
            var w = $('#map_view').width();
            var h = $('#map_view').height();
            $('#map_canvas').css({ width: w, height: h });
           google.maps.event.trigger(map, 'resize');

        });

});
1 голос
/ 29 августа 2012

Проблема (как указано выше и в других местах) заключается в том, что карта div должна быть видимой для работы. Так что загрузите карту во вкладке, которая видна. Затем, если хотите, перейдите на вкладку, которую хотите отобразить.

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

google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
     $("#Tabs").tabs('select',0);
});
1 голос
/ 03 марта 2012

При разработке сайта, который содержал вкладку карты, я столкнулся с той же проблемой.Сайт - http://samet.com.ar (на испанском языке, нажмите на значок карты или ссылку «ubicacion»).Та же самая ошибка, о которой вы упоминали, возникала всякий раз, когда вкладка div загружалась вместе с другими в его группе вкладок.Я обнаружил, что если бы мне удалось дать ему некоторое время для загрузки после того, как сделали другие вкладки, то не было бы никаких проблем.

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

Вкладка карты затем загружается как функция обратного вызова сразу после того, как это делает вся оболочка.Если вы просматриваете страницу, ищите id 'pane-container'.Внутри «панелей» вы найдете карту div, загруженную в конце.

Соответствующий код jQuery, который я использую на странице index.php, выглядит следующим образом:

<script type='text/javascript'>
   ( function( $ ) {
     // for SOF post --- previous code deleted ---
     $( "#wrapper" ).delay( 3500 ).fadeIn( "slow",function() {
     // Animation complete
     <?php $post_map = get_posts('name=map');?>
     $( "#map" ).delay( 1000 ).append( <?php echo "'".$post_map[0]->post_content."'"; ?> );
            } );
 } )( jQuery );
</script>

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

Приветствия!

0 голосов
/ 13 июня 2017

Попробуйте это в CSS:

.tab-content > .tab-pane:not(.active), 
.pill-content > .pill-pane:not(.active) {
 display: block;
 height: 0;
 overflow-y: hidden;
}
0 голосов
/ 24 марта 2014

Это работает для меня, соответствует моему требованию, и вы можете использовать его в качестве справки:

<script type="text/javascript">

function setCookie (name, value, expires, path, domain, secure) {
    document.cookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

function getCookie (name) {
    var cookie = " " + document.cookie;
    var search = " " + name + "=";
    var setStr = null;
    var offset = 0;
    var end = 0;
    if (cookie.length > 0) {
        offset = cookie.indexOf(search);
        if (offset != -1) {
            offset += search.length;
            end = cookie.indexOf(";", offset);
            if (end == -1) {
                end = cookie.length;
            }
            setStr = unescape(cookie.substring(offset, end));
        }
    }
    if (setStr == 'false') {
        setStr = false;
    } 
    if (setStr == 'true') {
        setStr = true;
    }
    if (setStr == 'null') {
        setStr = null;
    }
    return(setStr);
}

function hidePopup() {
    setCookie('popup_state', false); 
    document.getElementById('popup').style.display = 'none';
    document.getElementById('hiding').style.display = 'block';

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

function showPopup() {
    setCookie('popup_state', null);
    document.getElementById('popup').style.display = 'block';
    document.getElementById('hideup').style.display = 'none';

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

function checkPopup() {
    if (getCookie('popup_state') == null) { // if popup was not closed
        document.getElementById('popup').style.display = 'block';
        document.getElementById('hiding').style.display = 'block';

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

  }   
}

</script>


<body onload="checkPopup();">

    <div class="map-button" id="hiding"><a href="#" onclick="showPopup(); return false;"><img src="images/map_magnify.png" alt="" title="Show Google Map" ></a></div>

    <div class="map-button" id="popup" style="display:none"> <a href="#" onclick="hidePopup(); return false;"><img src="images/map_delete.png" alt="" title="Hide Google Map" ></a>
    <div id="gmap"></div>
    </div>
</body>

Примечание: Вы можете сделать CSS-класс map-button для позиционирования кнопки по мере необходимости.Поставь свой собственный имидж-кнопку.Замените id = "gmap" на ваш.Надеюсь, это поможет вам.

...