Як я можу перевірити, чи повністю завантажені Карти 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.