Comment vérifier si L'API GoogleMaps est chargée?

Comment vérifier si L'API GoogleMaps (v3) est chargée?

Je ne veux pas exécuter de scripts de mapping si L'API ne s'est pas chargée en raison de problèmes de connectivité internet (la page web est hébergée localement).

50
demandé sur user1251007 2012-02-10 18:04:38

10 réponses

if (google.maps) {...} vous donnera une erreur de référence si google n'est pas défini (i.e. si l'API ne s'est pas chargée).

à la place, utilisez if (typeof google === 'object' && typeof google.maps === 'object') {...} pour vérifier s'il a été chargé avec succès.

101
répondu DaveS 2012-02-10 15:28:28

aucune des réponses actuelles ne fonctionne avec une cohérence de 100% pour moi (à l'exclusion de Google Loader, que je n'ai pas essayé). Je ne pense pas que vérifier l'existence de google.maps soit suffisant pour s'assurer que la bibliothèque a terminé le chargement. Voici les requêtes réseau que je vois lorsque L'API Maps et la bibliothèque de lieux optionnels sont demandées:

maps api network requests

ce tout premier script définit google.maps , mais le code dont vous avez probablement besoin ( google.maps.Map , google.maps.places ) ne sera pas présent tant que certains des autres scripts ne seront pas chargés.

il est beaucoup plus sûr de définir un callback lors du chargement de L'API Maps. la réponse de @verti est presque correcte, mais s'appuie toujours sur la vérification google.maps de manière peu sûre.

au lieu de cela, faites ceci:

HTML:

<!-- "async" and "defer" are optional, but help the page load faster. -->
<script async defer
  src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=mapsCallback">
</script>

JS:

var isMapsApiLoaded = false;
window.mapsCallback = function () {
  isMapsApiLoaded = true;
  // initialize map, etc.
};
21
répondu Don McCurdy 2015-08-20 18:23:08

en chargement asynchrone celui-ci fonctionne pour moi (Merci à DaveS) :

   function appendBootstrap() {
    if (typeof google === 'object' && typeof google.maps === 'object') {
        handleApiReady();
    } else {
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=handleApiReady";
        document.body.appendChild(script);
    }
}

function handleApiReady() {
    var myLatlng = new google.maps.LatLng(39.51728, 34.765211);
    var myOptions = {
      zoom: 6,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
}
14
répondu verti 2013-07-17 14:39:23

vous pourriez envisager d'utiliser le Google Loader

google.load("maps", "3", {callback: myFn});

il chargera votre fichier javascript désigné, puis exécutera le rappel, spécifié dans l'argument optionalSettings .

4
répondu Razvan Caliman 2012-02-10 14:12:06

EDIT: Si vous n'avez pas peur d'être "non explicite" alors vous pouvez utiliser la réponse suivante, sinon si vous n'êtes pas sûr qu'il n'y aura qu'une seule instance de la variable google alors utilisez la réponse DaveS.

vérifier si google maps v3 api chargé:

if(google && google.maps){
    console.log('Google maps loaded');
}

dans cette variable de condition google utilisera vérité javascript donc si elle sera fonction ou objet ou chaîne de caractères, il deviendra vrai et ensuite essaiera d'accéder maps à l'intérieur de l'objet en question.

et inverse:

if(!google || !google.maps){
    console.log('Not loaded yet');
}
2
répondu Aivaras Prudnikovas 2014-01-09 18:37:54

un simple if(google && google.maps) check n'a pas fonctionné pour moi; j'obtiens toujours une erreur quand j'essaie d'accéder à L'API:

TypeError: google.cartographie.LatLng n'est pas un constructeur

dans mon cas, cela est probablement dû au fait que les gestionnaires d'événements de ma souris sont déclenchés avant même que l'API maps n'ait fini de télécharger. Dans ce cas, pour vérifier de manière fiable si maps est chargé, je crée un alias" gmaps " et je l'initialise sur dom ready (en utilisant JQuery):

var gmaps;
$(function () {
    gmaps = google.maps;
});

puis dans mon event handlers je peux simplement utiliser:

if(gmaps) {
    // do stuff with maps
}
1
répondu Nathan 2014-02-27 01:48:17

essayer

(google && 'maps' in google)?true:false

ou

if(google && 'maps' in google){
    //true
}
else{
    //false
}

depuis j'ai eu un problème avec ce qui suit sur mobile:

if (typeof google === 'object' && typeof google.maps === 'object') {...}
1
répondu Nasser Al-Wohaibi 2015-05-24 13:30:35

juste pour que vous sachiez, il y a un problème avec la réponse acceptée. Il retournera true si le script a chargé autrement 'typeof google' peut retourner Non défini et jeter une erreur . La solution est la suivante:

if ('google' in window && typeof google === 'object' && typeof google.maps === 'object') {...}

cela garantit qu'une valeur booléenne est toujours retournée.

1
répondu Ric Flair 2018-08-19 03:47:12

je crois que vous pouvez le faire avec un if(google && google.maps){ … } , sauf si vous voulez dire ce qui est dans ce post , qui est à propos des cartes API V2, mais quelqu'un l'a mis à jour pour v3 ici .

0
répondu Bobby Azarbayejani 2017-05-23 11:54:51

Si vous utilisez jQuery , j'ai de bonnes nouvelles pour vous:

if (typeof google === 'object' && typeof google.maps === 'object') {
     gmapInit();
} else {
     $.getScript('https://maps.googleapis.com/maps/api/js?key='+gApiKey+'&language=en', function(){
         gmapInit();
     });
 }

c'est similaire à réponse-17702802

0
répondu Tusko Trush 2018-02-13 12:10:01