Как я могу проверить, полностью ли загружены Карты Google?


293

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

Есть ли способ автоматического определения полной загрузки Карт Google, включая загрузку листов и все такое?

Существует tilesloaded()метод, который должен выполнять именно эту задачу, но он не работает .


2
Кажется, у меня работает событие "загружен". Он срабатывает, когда страница загружается и когда я перемещаю карту. На вашей карте это просто противоречиво или никогда не работает?
Крис Б

Нет, просто нет. «плитки загружены», как говорится, будут запускаться каждый раз при загрузке новых плиток, что означает, что он будет срабатывать не только при первой загрузке, но и каждый раз, когда вы перетаскиваете карту в место, где ваши плитки еще не загружены.
Aivus

Зависит от того, используете ли вы 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
});

Событие "idle" запускается, когда карта переходит в состояние ожидания - все загружено (или не удалось загрузить). Я обнаружил, что он более надежен, чем tileloaded / bounds_changed, и с помощью addListenerOnceметода код в замыкании выполняется при первом запуске «idle», а затем событие отсоединяется.

Смотрите также раздел событий в справочнике Google Maps.


15
Он запускается, когда карта переходит в состояние ожидания (больше ничего не загружается). Иногда могут быть некоторые тайлы, которые не загружались из-за плохого соединения, поэтому, даже если такие недостающие фрагменты есть, это в конечном итоге вызовет событие простоя. Если вам нужно убедиться, что карта заполнена, нет недостающих плиток и т. Д., Вам следует искать другой путь (например, событие «плитку загружено»).
Ддинчев

15
это не работает для меня .. срабатывает до того, как что-либо появляется на моей карте
zsitro

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

11
-1: для меня в chrome и firefox, он последовательно срабатывает, как только скрипт загрузится, но до того, как отобразится какая-либо плитка. Может быть, это не заметно при быстром соединении, но я благословлен очень медленным. «плитки загружены», кажется, работает, хотя.
Ксананакс

1
Спасибо за это решение - я думаю, что это именно то, что мне было нужно. То, что я просто не могу обернуть вокруг себя, это то, почему Google не вставил простой готовый крючок? : -O
Хэсс

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
если вы определяете обработчики событий внутри обработчиков событий, у вас будет плохое время. я настоятельно рекомендую вам не делать этого, вот немного менее хакерская альтернатива, которая достигает аналогичной цели
Кори Моухортер

15

Если вы используете Maps API v3, это изменилось.

В версии 3 вы по существу хотите настроить прослушиватель для bounds_changedсобытия, которое будет срабатывать при загрузке карты. Как только это сработает, удалите слушателя, так как вы не хотите получать информацию каждый раз, когда изменяются границы области просмотра.

Это может измениться в будущем, поскольку API V3 развивается :-)


2
Я не считаю, что это работает для меня так же надежно, как поиск tilesloadedмероприятия.
TMC


9

Если вы используете веб-компоненты , то они имеют это в качестве примера:

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

3
Страшный комментарий, это неправильно на многих уровнях, не знаю, с чего начать.
ночи

1
Почему вы говорите: «Страшный комментарий, это неправильно на многих уровнях, я не знаю, с чего начать»?
Филипп Сенн

3
Но зачем предлагать решение с использованием другой среды, отличной от Google Maps?
ночи

Потому что лучше может быть?
Филипп Сенн

Хахаха @nights
Хуан

5

GMap2::tilesloaded() будет событие, которое вы ищете.

Смотрите GMap2.tilesloaded для ссылок.


Я много читал о событии tileloaded (), и кажется, что оно крайне противоречиво при запуске. Есть еще варианты?

3

Где переменная mapявляется объектом типа GMap2:

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

0

В моем случае Tile Image загружается с удаленного 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.