Як я можу перевірити, чи повністю завантажені Карти Google?


293

Я вкладаю Карти Google у свій веб-сайт. Після завантаження Карт Google мені потрібно розпочати кілька процесів JavaScript.

Чи є спосіб автоматично визначити, коли Карти Google повністю завантажені, включаючи завантаження плитки та все?

Існує tilesloaded()метод, який повинен виконати саме це завдання, але він не працює .


2
Здається, "подія, завантажена плиткою", працює на мене. Він запускається, коли сторінка завантажується і коли я переміщу карту. На вашій карті це просто непослідовно, чи це ніколи не працює?
Кріс Б

Ні, просто ні. "завантажений плиткою", як мовиться, буде вистрілюватися щоразу, коли нові плитки завантажуються, а це означає, що він не буде стріляти лише при першому завантаженні, але і кожного разу, коли ви перетягуєте карту до місця, де ваші плитки ще не завантажені.
Айв

Залежить, якщо ви використовуєте addListener () або addListenerOnce (). Ви маєте рацію щодо addListener () - ось чому я використовуюgoogle.maps.event.addListenerOnce(map, 'tilesloaded', function() {
vchrizz

Відповіді:


608

Це мене на деякий час турбувало з GMaps v3.

Я знайшов спосіб зробити це так:

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

Подія "в режимі очікування" запускається, коли карта переходить у режим очікування - все завантажено (або не вдалося завантажити). Я виявив, що це більш надійно, а потім завантажений / bounds_changed, і за допомогою addListenerOnceметоду код у закритті виконується перший раз, коли "неробочий" запускається, а потім подія від'єднується.

Дивіться також розділ подій у Довідці Карт Google.


15
Він запускається, коли карта переходить у режим очікування (більше нічого не завантажується). Іноді можуть бути якісь плитки, які не завантажуються через погане з'єднання, тому навіть якщо є такі відсутні частини, це в кінцевому підсумку спровокує неактивну подію. Якщо вам потрібно переконатися, що карта повна, немає відсутніх плиток тощо, слід шукати інший спосіб (наприклад, подія "tileloaded").
ддінчев

15
це не працює для мене .. спрацьовує, перш ніж щось з’явиться на моїй карті
zsitro

16
-1: Тригери швидше, ніж плитка завантажується / відображається.
zbr

11
-1: для мене в chrome та firefox він послідовно спрацьовує, як тільки сценарій завантажується, але перед тим, як з'явиться будь-яка плитка. Можливо, це не видно на швидкому зв’язку, але мене благословляє дуже повільний. Схоже, що "завантажений плиткою" працює.
Xananax

1
Дякую за таке рішення - я думаю, що це саме те, що мені було потрібно. Що я просто не можу обернути головою, чому на Землі Google не поставив простий готовий гачок? : -O
hasse

55

Я створюю html5 мобільні додатки , і я помітив , що idle, bounds_changedі tilesloadedподія , пожежа , коли об'єкт на мапі створюється і візуалізації (навіть якщо її не видно).

Щоб зробити свій код запуску карти, коли він відображається вперше, я зробив наступне:

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
Перша функція завантаженої плитки працює для мене добре, але друга функція завантаженої плиткою ніколи не працює для мене.
Гуска

Я отримую Uncaught ReferenceError: map is not defined. Я спробував запустити сценарій із запізненням і наприкінці інших сценаріїв, але, здається, нічого не працює.
Сем Вілліс

1
якщо ви визначаєте обробників подій всередині обробників подій, вам буде погано провести час. Я настійно пропоную вам цього не робити, ось дещо менш хитра альтернатива, яка досягає подібного: gist.github.com/cmawhorter/a1b0b6a6b73678b97920f748ebca244b
Cory Mawhorter

15

Якщо ви використовуєте API Maps v3, це змінилося.

У версії 3 ви, по суті, хочете налаштувати слухача bounds_changedподії, який запуститься при завантаженні карти. Після того, як це спрацьовує, видаліть слухача, оскільки ви не хочете, щоб його повідомляли щоразу, коли змінюються межі вікна перегляду.

Це може змінитися в майбутньому, оскільки API V3 розвивається :-)


2
Я не вважаю, що це працює для мене так надійно, як шукати tilesloadedподії.
TMC


9

Якщо ви використовуєте веб-компоненти , вони мають такий приклад:

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

3
Жахливий коментар, його помилка на стільки рівнях не знає, з чого почати.
ночі

1
Чому ви говорите "Страшний коментар, це неправильно на багатьох рівнях, я не знаю, з чого почати"?
Філіп Сенн

3
Але навіщо пропонувати рішення, використовуючи інший фреймворк, ніж просто карти Google?
ночі

Тому що, можливо, краще?
Філіп Сенн

HAHAHAHA @nights
Juan

5

GMap2::tilesloaded() буде подією, яку ви шукаєте.

Див. Посилання GMap2.tilesloaded для довідок.


Я багато читав про подію з завантаженою плиткою (), і здається, що вона надзвичайно непослідовна, коли вона спрацьовує. Будь-які інші варіанти?


0

У моєму випадку зображення плитки завантажується з віддаленого URL-адреси та tilesloaded подія була запущена до надання зображення.

Я вирішив наступним брудним способом.

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

Ви можете перевіряти GMap2.isLoaded()метод кожні nмілісекунди, щоб побачити, чи карта та всі її плитки завантажені ( window.setTimeout()чи window.setInterval()це ваші друзі).

Хоча це не дасть точну подію завершення завантаження, воно повинно бути досить гарним, щоб запустити Javascript.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.