Googleマップが完全に読み込まれているかどうかを確認するにはどうすればよいですか?


293

Googleマップを自分のWebサイトに埋め込んでいます。Googleマップが読み込まれたら、いくつかのJavaScriptプロセスを開始する必要があります。

タイルのダウンロードなど、Googleマップが完全に読み込まれたときに自動検出する方法はありますか?

tilesloaded()この方法は、それがまさにこのタスクを達成することではなくなっている存在、それは動作しません


2
「タイルロード」イベントは私にはうまくいくようです。ページが読み込まれたときや、地図を移動したときに発生します。あなたの地図上で、それは単に矛盾していますか、それとも機能しませんか?
クリスB

いいえ、ただです。「tilesloaded」は、新しいタイルが読み込まれるたびに起動されます。つまり、最初の読み込み時だけでなく、タイルがまだ読み込まれていない場所にマップをドラッグするたびにも起動されます。
19

addListener()またはaddListenerOnce()を使用するかどうかによって異なります。あなたはaddListener()について正しいgoogle.maps.event.addListenerOnce(map, 'tilesloaded', function() {
それ

回答:


608

これは、しばらくの間、GMaps v3で私を悩ませていました。

私はそれをこのようにする方法を見つけました:

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

「アイドル」イベントは、マップがアイドル状態になるとトリガーされます-すべてがロードされました(またはロードに失敗しました)。私はそれがtilesloaded / bounds_changedより信頼性が高く、addListenerOnceメソッドを使用してクロージャ内のコードが最初に "アイドル"が発生したときに実行され、その後イベントがデタッチされることがわかりました。

Googleマップリファレンスのイベントセクションもご覧ください。


15
マップがアイドル状態になると発生します(これ以上何もロードされません)。接続不良のために読み込まれなかったタイルが存在する場合があるため、このような欠落しているピースがある場合でも、最終的にアイドルイベントをトリガーします。マップが完全であること、タイルが欠けていないことなどを確認する必要がある場合は、他の方法(たとえば、「tilesloaded」イベント)を探す必要があります。
ddinchev 2012年

15
それは私のために機能していません..マップに何かが表示される前にトリガーします
zsitro

16
-1:タイルがロード/表示されるよりも早くトリガーします。
zbr 2013

11
-1:chromeとfirefoxでは、スクリプトが読み込まれた直後、ただしタイルが表示される前に常に起動します。多分それは高速接続では明らかではありませんが、私は非常に遅い接続に恵まれています。「タイルロード」は機能するようです。
Xananax 2014年

1
その解決策をありがとう-私はこれがまさに私が必要としたものだと思います。私が頭を包むことはできませんが、なぜグーグルは単純なレディフックを入れていないのですか?:-O
hasse

55

私はhtml5モバイルアプリを作成していますが、マップオブジェクトが作成されてレンダリングされると(表示されていなくてもidlebounds_changedtilesloadedイベントが発生することに気付きました。

マップが初めて表示されたときにコードを実行するには、次のようにしました。

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
最初のtilesloaded関数は私にとってはうまく機能しますが、2番目のtilesloaded関数は私にとっては実行されません。
グース

私は取得していますUncaught ReferenceError: map is not defined。私は、他のスクリプトの最後に遅延してスクリプトを実行しようとしましたが、何も動作しないようです。
Sam Willis

1
イベントハンドラー内でイベントハンドラーを定義している場合は、時間がかかります。私はこれを行わないことを強くお勧めします。これは、同様のことを達成する少しハックの少ない代替案です。gist.github.com
Cory Mawhorter

15

Maps API v3を使用している場合、これは変更されています。

バージョン3では、bounds_changedマップのロード時にトリガーされるイベントのリスナーを設定する必要があります。それがトリガーされたら、ビューポートの境界が変更されるたびに通知を受けたくないので、リスナーを削除します。

V3 APIが進化しているため、これは将来変更される可能性があります:-)


2
私はこれがtilesloadedイベントを探すほど確実に機能しているとは思いません。
TMCは2012


9

Webコンポーネントを使用している場合、例として次のようになります。

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

3
ひどいコメント、どこから始めればよいかわからないほど多くのレベルで間違っています。

1
「ひどいコメント、どこから始めればいいのかわからないほど多くのレベルで間違っている」と言うのはなぜですか。
Phillip Senn 2017年

3
しかし、なぜGoogleマップとは異なるフレームワークを使用してソリューションを提供するのですか?
2017年

多分それが良いので?
Phillip Senn 2017年

HAHAHAHA @nights
Juan

5

GMap2::tilesloaded() あなたが探しているイベントになります。

参照については、GMap2.tilesloadedを参照してください。


tilesloaded()イベントについてたくさん読んだのですが、いつ発火するかは非常に一貫していないようです。他のオプションはありますか?

3

変数mapがGMap2タイプのオブジェクトである場合:

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

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をトリガーするのに十分なはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.