70 votes

Problèmes avec Google Maps API v3 + jQuery UI Tabs

Il existe un certain nombre de problèmes, qui semblent être assez bien connus, lorsque l'on utilise l'API Google Maps pour rendre une carte dans un onglet jQuery UI. J'ai vu des questions de SO postées sur des problèmes similaires ( aquí y aquí par exemple), mais les solutions proposées ne semblent fonctionner que pour la version 2 de l'API Maps. Voici d'autres références que j'ai consultées aquí y aquí ainsi que tout ce que j'ai pu trouver en cherchant sur Google.

J'ai essayé de remplir une carte ( en utilisant la v3 de l'API ) dans un onglet jQuery avec des résultats mitigés. J'utilise les dernières versions de tout (actuellement jQuery 1.3.2, jQuery UI 1.7.2, je ne sais pas pour Maps).

C'est le balisage et le 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>

y

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

Et voici ce que j'ai trouvé qui fonctionne/ne fonctionne pas ( pour Maps API v3 ) :

  • L'utilisation de la technique de décalage vers la gauche décrite dans la documentation de jQuery UI Tabs (et dans les réponses aux deux questions que j'ai liées) ne fonctionne pas du tout. En fait, le code qui fonctionne le mieux utilise le code CSS .ui-tabs .ui-tabs-hide { display: none; } à la place.
  • La seule façon de faire en sorte qu'une carte s'affiche dans un onglet est de définir la largeur et la hauteur CSS de la carte. #map_canvas pour être des valeurs absolues. En changeant la largeur et la hauteur en auto o 100% fait en sorte que la carte ne s'affiche pas du tout, même si elle a déjà été rendue avec succès (en utilisant la largeur et la hauteur absolues).
  • Je n'ai pas trouvé de documentation à ce sujet en dehors de l'API de Maps, mais map.checkResize() ne fonctionne plus. Au lieu de cela, vous devez déclencher un événement de redimensionnement en appelant google.maps.event.trigger(map, 'resize') .
  • Si la carte n'est pas initialisée à l'intérieur d'une fonction liée à un fichier de type tabsshow la carte elle-même est rendue correctement, mais les contrôles ne le sont pas - la plupart sont tout simplement absents.

Alors, voici mes questions :

  • Quelqu'un d'autre a-t-il l'expérience d'accomplir ce même exploit ? Si c'est le cas, comment avez-vous trouvé ce qui fonctionne réellement, puisque les astuces documentées ne fonctionnent pas pour Maps API v3 ?
  • Qu'en est-il du chargement du contenu de l'onglet à l'aide d'Ajax, conformément à l'instruction de l'UE ? Documentation sur jQuery UI ? Je n'ai pas eu l'occasion de jouer avec, mais je pense que cela va casser encore plus les cartes. Quelles sont les chances de le faire fonctionner (ou est-ce que cela ne vaut pas la peine d'essayer) ?
  • Comment faire pour que la carte remplisse la plus grande surface possible ? J'aimerais qu'elle remplisse l'onglet et s'adapte à la taille des pages, comme c'est le cas sur maps.google.com. Mais, comme je l'ai dit, il semble que je doive me contenter d'appliquer des feuilles de style CSS de largeur et de hauteur absolues à la division de la carte.

Désolé si c'est long, mais il s'agit peut-être de la seule documentation sur les onglets Maps API v3 + jQuery. Merci !

22voto

Anon Points 171

Note : cette réponse a reçu une modification invalide d'un tiers qui a essentiellement remplacé son contenu, ce qu'un éditeur tiers ne devrait pas faire. Cependant, le résultat peut être plus utile que l'original, donc les deux versions sont maintenant données ci-dessous :


  • Version originale de l'auteur Anon de 2010, après une modification par Anon

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

est suggéré par http://code.google.com/p/gmaps-api-issues/issues/detail?id=1448 comme un v3 pour remplacer la fonction checkResize() de la v2.

Blech - mauvais google, pas de cookie.


  • Formulaire de réécriture complète de l'utilisateur Eugeniusz Fizdejko 2012 :

Pour moi, ça marche quand on ajoute un marqueur :

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

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

13voto

jeffkee Points 1005

En fait, rayez ma réponse ci-dessus. Le site web de jQueryUI a la réponse et la voici :

Pourquoi est-ce que...

...mon curseur, Google Map, sIFR etc. ne fonctionnent pas lorsqu'ils sont placés dans un (inactif) ?

Tout composant qui nécessite un certain calcul dimensionnel pour son initialisation pour son initialisation ne fonctionnera pas dans un caché, car le panneau d'onglets lui-même est caché via display : none, de sorte que les éléments à l'intérieur n'indiqueront pas leur leur largeur et leur hauteur réelles (0 dans la plupart navigateurs).

Il y a une solution de contournement facile. Utilisez la technique technique de masquage des panneaux à onglets inactifs panneaux d'onglets inactifs. Par exemple, dans votre feuille de style remplacez la règle pour la classe ".ui-tabs .ui-tabs-hide" par la règle suivante

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

Pour les cartes Google, vous pouvez également redimensionner la carte une fois l'onglet affiché, comme comme ceci :

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

resizeMap() appelle la fonction checkResize() de Google Maps sur la carte en question.

12voto

memberyh Points 117

Il suffit de redéfinir la classe css pour l'onglet caché :

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

9voto

jayarjo Points 2858

Voici ce que vous pouvez faire pour 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
});

4voto

Keyo Points 4138

Je charge les cartes après l'affichage de l'onglet.

C'est un peu compliqué mais ça a marché pour moi. Il suffit de stocker l'url de l'iframe de la carte dans l'attribut rel de l'iframe comme ceci :

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

Cet événement va définir l'attribut src de l'iframe à l'url contenue dans le rel.

        $("#tabs").tabs({
            show:function(event, ui) {
                var rel = $(ui.panel).find('iframe').attr('rel');
                $(ui.panel).find('iframe').attr('src',rel);
            }
        });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X