Jak mogę sprawdzić, czy Mapy Google są w pełni załadowane?

293

Osadzam Mapy Google na mojej stronie internetowej. Po załadowaniu Map Google muszę uruchomić kilka procesów JavaScript.

Czy istnieje sposób automatycznego wykrywania, gdy Mapy Google są w pełni załadowane, w tym pliki do pobrania i inne?

Istnieje tilesloaded()metoda, która ma wykonać dokładnie to zadanie, ale nie działa .

Wymuskany
źródło
2
Wydarzenie „załadowane kafelki” wydaje mi się działać. Uruchamia się, gdy strona się ładuje i kiedy przesuwam mapę. Czy na twojej mapie jest to niespójne, czy też nigdy nie działa?
Chris B,
Nie, po prostu nie. „ładowane kafelki”, jak głosi komunikat, będą wystrzeliwane za każdym razem, gdy zostaną załadowane nowe kafelki, co oznacza, że ​​nie tylko będzie strzelać przy pierwszym ładowaniu, ale także za każdym razem, gdy przeciągniesz mapę do miejsca, w którym kafelki nie zostały jeszcze załadowane.
Aivus
Zależy, jeśli użyjesz addListener () lub addListenerOnce (). Masz rację co do addListener () - dlatego używamgoogle.maps.event.addListenerOnce(map, 'tilesloaded', function() {
vchrizz

Odpowiedzi:

608

Trochę mnie to martwiło przez GMaps v3.

Znalazłem sposób na zrobienie tego w ten sposób:

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

Zdarzenie „bezczynności” jest uruchamiane, gdy mapa przechodzi w stan bezczynności - wszystko zostało załadowane (lub nie udało się załadować). Stwierdziłem, że jest bardziej niezawodny niż tileloaded / bounds_changed i przy użyciu addListenerOncemetody kod w zamknięciu jest wykonywany przy pierwszym uruchomieniu „bezczynności”, a następnie zdarzeniu jest odłączone.

Zobacz także sekcję wydarzeń w Odwołaniu do Map Google.

ddinchev
źródło
15
Jest uruchamiany, gdy mapa przechodzi w stan bezczynności (nic więcej się nie ładuje). Czasami mogą istnieć kafelki, które nie zostały załadowane z powodu złego połączenia, więc nawet jeśli brakuje takich elementów, spowoduje to koniec bezczynności. Jeśli musisz upewnić się, że mapa jest kompletna, brak brakujących kafelków itp., Powinieneś poszukać innego sposobu (na przykład zdarzenie „załadowane kafelki”).
ddinchev
15
to nie działa dla mnie .. uruchamia się, zanim cokolwiek pojawi się na mojej mapie
zsitro
16
-1: wyzwalacze wcześniej niż płytki są ładowane / wyświetlane.
zbr
11
-1: dla mnie w chrome i firefox, konsekwentnie odpala, jak tylko skrypt się załaduje, ale zanim pokażą się kafelki. Może nie jest to widoczne w szybkim połączeniu, ale jestem pobłogosławiony bardzo wolnym. Wydaje się jednak, że „ładowane kafelki” działają.
Xananax
1
Dzięki za to rozwiązanie - myślę, że właśnie tego potrzebowałem. To, czego po prostu nie mogę owinąć głową, to dlaczego Google nie umieścił prostego, gotowego haka? : -O
hasse
55

Tworzę aplikacje mobilne HTML5 i zauważyłem, że idle, bounds_changedi tilesloadedogień zdarzenia, gdy obiekt jest tworzony i mapa renderowane (nawet jeśli nie jest widoczny).

Aby mój kod działał na mapie, gdy jest wyświetlany po raz pierwszy, wykonałem następujące czynności:

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
    });
});
Pyry Liukas
źródło
4
Pierwsza funkcja ładowana kafelkami działa dla mnie dobrze, ale druga funkcja ładowana kafelkami nigdy dla mnie nie działa.
Goose
Dostaję Uncaught ReferenceError: map is not defined. Próbowałem uruchomić skrypt z opóźnieniem i na końcu innych moich skryptów, ale wydaje się, że nic nie działa.
Sam Willis
1
jeśli definiujesz procedury obsługi zdarzeń w ramach procedur obsługi zdarzeń, będziesz miał zły czas. zdecydowanie sugeruję, aby tego nie robić, oto nieco mniej zuchwała alternatywa, która osiąga podobną rzecz: gist.github.com/cmawhorter/a1b0b6a6b73678b97920f748ebca244b
Cory Mawhorter
15

Jeśli korzystasz z Maps API v3, to się zmieniło.

W wersji 3 zasadniczo chcesz skonfigurować detektor bounds_changedzdarzenia, który zostanie uruchomiony po załadowaniu mapy. Gdy to się uruchomi, usuń nasłuchiwanie, ponieważ nie chcesz być informowany za każdym razem, gdy zmieniają się granice okienka ekranu.

Może się to zmienić w przyszłości wraz z rozwojem API V3 :-)

timbo
źródło
2
Nie uważam, że to działa dla mnie tak niezawodnie, jak szukanie tego tilesloadedwydarzenia.
TMC
9

Jeśli używasz komponentów internetowych , mają one jako przykład:

map.addEventListener('google-map-ready', function(e) {
   alert('Map loaded!');
});
Phillip Senn
źródło
3
Okropny komentarz, jest zły na wielu poziomach, nie wiem od czego zacząć.
noce
1
Dlaczego mówisz „Okropny komentarz, jest błędny na tak wielu poziomach, że nie wiem od czego zacząć”?
Phillip Senn
3
Ale po co dostarczać rozwiązanie przy użyciu innej struktury niż tylko mapy Google?
noce
Bo może lepiej?
Phillip Senn
HAHAHAHA @nights
Juan
5

GMap2::tilesloaded() będzie to wydarzenie, którego szukasz.

Zobacz GMap2.tilesloaded o referencje.

Adam Markowitz
źródło
Dużo przeczytałem o zdarzeniu tileloaded () i wygląda na to, że jest on wyjątkowo niespójny w przypadku jego uruchomienia. Jakieś inne opcje?
3

Jeżeli zmienna mapjest obiektem typu GMap2:

    GEvent.addListener(map, "tilesloaded", function() {
      console.log("Map is fully loaded");
    });
władca
źródło
0

W moim przypadku obraz płytki jest ładowany ze zdalnego adresu URL i tilesloaded zdarzenie zostały uruchomione przed renderowaniem obrazu.

Rozwiązałem z podążaniem brudną drogą.

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
});
Bala
źródło
-4

Możesz sprawdzać GMap2.isLoaded()metodę co nmilisekundę, aby sprawdzić, czy mapa i wszystkie jej kafelki zostały załadowane ( window.setTimeout()lub czy window.setInterval()są Twoimi przyjaciółmi).

Chociaż nie da to dokładnego zdarzenia zakończenia ładowania, powinno wystarczyć do uruchomienia Javascript.

fbuchinger
źródło