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

ddinchev
источник
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
    });
});
Pyry Liukas
источник
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");
    });
devlord
источник
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
});
Bala
источник
-4

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

Хотя это не даст вам точного события завершения загрузки, оно должно быть достаточно для запуска вашего Javascript.

fbuchinger
источник