Come posso verificare se Google Maps è completamente caricato?


293

Sto incorporando Google Maps nel mio sito web. Una volta caricato Google Maps, devo avviare alcuni processi JavaScript.

C'è un modo per rilevare automaticamente quando Google Maps è stato caricato completamente, compresi i download di riquadri e tutto il resto?

tilesloaded()Esiste un metodo che dovrebbe svolgere esattamente questo compito ma non funziona .


2
L'evento "tilesloaded" sembra funzionare per me. Si attiva quando la pagina viene caricata e quando sposto la mappa. Sulla tua mappa, è solo incoerente o non funziona mai?
Chris B,

No semplicemente no. "tileloaded", come si dice, verrà lanciato ogni volta che vengono caricate nuove tessere, il che significa che non si attiverà solo al primo caricamento, ma anche ogni volta che trascini la mappa nella posizione in cui le tessere non sono ancora state caricate.
Aivus

Dipende se si utilizza addListener () o addListenerOnce (). Hai ragione su addListener () - ecco perché io usogoogle.maps.event.addListenerOnce(map, 'tilesloaded', function() {
vchrizz il

Risposte:


608

Questo mi ha infastidito per un po 'con GMaps v3.

Ho trovato un modo per farlo in questo modo:

google.maps.event.addListenerOnce(map, 'idle', function(){
    // do something only the first time the map is loaded
});

L'evento "inattivo" viene attivato quando la mappa passa allo stato inattivo: tutto viene caricato (o non è stato caricato). Ho trovato più affidabile di tilesloaded / bounds_changed e usando il addListenerOncemetodo il codice nella chiusura viene eseguito la prima volta che viene attivato "inattivo" e quindi l'evento viene rimosso.

Vedi anche la sezione eventi nella Guida di riferimento di Google Maps.


15
Viene attivato quando la mappa passa allo stato inattivo (non verrà caricato più nulla). A volte potrebbero esserci delle tessere che non sono state caricate a causa di una cattiva connessione, quindi anche se ci sono pezzi mancanti, alla fine si innescherà l'evento inattivo. Se devi assicurarti che la mappa sia completa, nessuna tessera mancante, ecc., Dovresti cercare in un altro modo (ad esempio evento "tessere caricate").
ddinchev,

15
non funziona per me .. si innesca prima che qualcosa
venga

16
-1: si innesca prima che le tessere vengano caricate / visualizzate.
zbr,

11
-1: per me in Chrome e Firefox, si attiva costantemente non appena lo script è stato caricato, ma prima che venga mostrato qualsiasi riquadro. Forse non è evidente su una connessione veloce, ma sono benedetto con una connessione molto lenta. "tilesloaded" sembra funzionare però.
Xananax,

1
Grazie per quella soluzione - penso che sia esattamente quello di cui avevo bisogno. Quello che semplicemente non posso avvolgere la testa, è perché mai Google non ha messo un semplice gancio pronto? : -O
hasse il

55

Sto creando HTML5 applicazioni mobili e ho notato che il idle, bounds_changede tilesloadedgli eventi fuoco quando l'oggetto viene creato e reso mappa (anche se non è visibile).

Per fare in modo che la mia mappa esegua il codice quando viene mostrato per la prima volta, ho fatto quanto segue:

google.maps.event.addListenerOnce(map, 'tilesloaded', function(){
    //this part runs when the mapobject is created and rendered
    google.maps.event.addListenerOnce(map, 'tilesloaded', function(){
        //this part runs when the mapobject shown for the first time
    });
});

4
La prima funzione di tileloaded funziona bene per me, ma la seconda funzione di tileloaded non funziona mai per me.
Oca,

Sto ottenendo Uncaught ReferenceError: map is not defined. Ho provato a eseguire lo script con un ritardo e alla fine degli altri miei script, ma nulla sembra funzionare.
Sam Willis,

1
se stai definendo gestori di eventi all'interno di gestori di eventi, avrai dei brutti momenti. ti consiglio vivamente di non farlo, ecco un'alternativa un po 'meno caotica che ottiene una cosa simile: gist.github.com/cmawhorter/a1b0b6a6b73678b97920f748ebca244b
Cory Mawhorter

15

Se stai utilizzando l'API di Maps v3, questo è cambiato.

Nella versione 3, devi essenzialmente impostare un listener per l' bounds_changedevento, che si attiverà al caricamento della mappa. Una volta attivato, rimuovere l'ascoltatore poiché non si desidera essere informati ogni volta che cambiano i limiti del viewport.

Questo potrebbe cambiare in futuro mentre l'API V3 si sta evolvendo :-)


2
Non trovo che funzioni per me in modo affidabile come cercare l' tilesloadedevento.
TMC,


9

Se stai utilizzando componenti Web , hanno questo come esempio:

map.addEventListener('google-map-ready', function(e) {
   alert('Map loaded!');
});

3
Commento terribile, è sbagliato su così tanti livelli non so da dove cominciare.
notti

1
Perché dici "Commento terribile, è sbagliato su così tanti livelli che non so da dove cominciare"?
Phillip Senn,

3
Ma perché fornire una soluzione utilizzando un framework diverso rispetto a Google Maps?
notti

Perché forse è meglio?
Phillip Senn,

HAHAHAHA @nights
Juan

5

GMap2::tilesloaded() sarebbe l'evento che stai cercando.

Vedi GMap2.tilesloaded per i riferimenti.


Ho letto molto sull'evento tilesloaded () e sembra che sia estremamente incoerente quando si attiva. Altre opzioni?

3

Dove la variabile mapè un oggetto di tipo GMap2:

    GEvent.addListener(map, "tilesloaded", function() {
      console.log("Map is fully loaded");
    });

0

Nel mio caso, l'immagine della piastrella caricata dall'URL remoto e l' tilesloadedevento è stata attivata prima del rendering dell'immagine.

Ho risolto seguendo il modo sporco.

var tileCount = 0;
var options = {
    getTileUrl: function(coord, zoom) {
        tileCount++;
        return "http://posnic.com/tiles/?param"+coord;
    },
    tileSize: new google.maps.Size(256, 256),
    opacity: 0.5,
    isPng: true
};
var MT = new google.maps.ImageMapType(options);
map.overlayMapTypes.setAt(0, MT);
google.maps.event.addListenerOnce(map, 'tilesloaded', function(){
    var checkExist = setInterval(function() {
        if ($('#map_canvas > div > div > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div > div').length === tileCount) {
            callyourmethod();
            clearInterval(checkExist);
        }
    }, 100); // check every 100ms
});

-4

Puoi controllare il GMap2.isLoaded()metodo ogni nmillisecondi per vedere se la mappa e tutte le sue tessere sono state caricate ( window.setTimeout()o window.setInterval()sono tuoi amici).

Anche se questo non ti darà l'evento esatto del completamento del caricamento, dovrebbe essere abbastanza buono da attivare il tuo Javascript.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.