2016-12-19 5 views
0

私はGoogleマップを試していて、その場でポリラインを作成しようとしています。基本的には、文書の本文内には、一定の時間、定期的に行を配置し、経過時間後にそれらを消去するsetInterval関数があります。問題はさまざまなマップ変数にアクセスすることで発生しますが、テストプログラム(下記)を呼び出すと、 "marker1 not defined"のようなエラーが発生します。マップの初期化ルーチンの外からマップ変数にアクセスすることは可能ですか?ここでGoogleマップの変数と機能の範囲

は、Javascriptのコードである - これは私がyouveはレースの問題を得たと思う、すべての頭の中に

var commsLine = []; 
var marker1, marker2, marker3, map, Comms; 

function initMap() { 
    latLng = new google.maps.LatLng(50.8917,-1.3989); 

    map = new google.maps.Map(document.getElementById('map_canvas'), { 
    zoom: 7, 
    center: latLng, 
    mapTypeId: google.maps.MapTypeId.HYBRID, 
    scaleControl: true 
    }); 

    marker1 = new google.maps.Marker({ 
    position: new google.maps.LatLng(50.8917, 0), 
    map: map 
    }); 

    marker2 = new google.maps.Marker({ 
    position: new google.maps.LatLng(50.8917, -1.5), 
    map: map 
    }); 

    marker3 = new google.maps.Marker({ 
    position: new google.maps.LatLng(51.5, 0), 
    map: map 
    }); 

// DrawLine(); works when placed here but I want to call it from the 
// setInterval function in the body 
} 

function DrawLine() 
{ 

    commsLine.push(marker1.getPosition()); 
    commsLine.push(marker2.getPosition()); 

     Comms = new google.maps.Polyline({ 
     path: commsLine, 
     geodesic: true, 
     strokeColor: '#FF0000', 
     strokeOpacity: 1.0, 
     strokeWeight: 2 
    }); 

    Comms.setMap(map); 
    } 

google.maps.event.addDomListener(window, 'load', initMap); 
+0

DrawLineが呼び出されたとき?コールバックを登録するために良いとされるよりも (initMapsはまだ呼び出されていないかもしれません...) –

+0

ボディ内のjavascriptブロックで呼び出される必要があります。 – user3713442

+0

'drawLine()'を起動するものは、 'initMap()'が呼び出されるまで発生してはなりません。あなたの他のjavascriptブロックはどのように見えますか? –

答えて

0

です:

var marker 1;//var init 
drawLine();//draw line called, marker isnt set yet 
initMap(); //map ready 

解決方法1: ロックdrawLine()initMapが終了するまで

var mapready=false; 
function initMap(){ 
//your code 
mapready=true; 
} 
function drawLine(){ 
if(!mapready){return false;} 
//your code 
} 

drawLineは、私たちが原因で発生することができ場合、これは良い解決策ですエル。

解決策2A:マップがinitedさ コールdrawLine:

function initMap(){ 
//your code 
drawLine(); 
} 

ソリューション2B: ソリューションあなたは(時々、時々ではない)を動的drawLineを呼び出したい場合はイマイチ良いです。

mapready=[]; 
function initMap(){ 
//your init code 




//map is ready so call callbacks 
for(i=0;i<mapready.length;i++){ 
mapready[i](); 
} 
//if an callback is added now, fire it directly 
mapready={}; 
mapready.push=function(func){func();}; 
} 

コールバックを追加するには:

mapready.push(drawLine); 
+0

ありがとうございます - それは競争状態であることが判明しました。ページのロードが完了してマップの初期化が完了し、線が描画されるようにするために、3秒後にDrawLine()にテストsetTimeoutを呼び出しました。 これはまた私が持っている他の問題を解決しますが、私が持っているものをリファクタリングする必要があるように見えます。 地図の初期化が完了するとすぐにソリューション2のファイアコールバック関数が呼び出されますか?私の必要なものと同じように聞こえるが、私はコールバックに慣れていない。 – user3713442

+0

それはあなたの考え方を振る舞います。 mapinitが完了したとき、または後で追加されたときにコールバックが発生する(この例ではdrawLine) –