2009-08-19 4 views
0
var num = rez.data.length; 

for(var key=0;key<num;key++) 
{ 
    var marker = []; 
    var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude); 
    marker[key] = new GMarker(point, {icon: iconS}); 
    GEvent.addListener(marker[key], "click", function() 
    { 
    marker[key].openInfoWindowHtml('xxxxxx'); 
    }); 
    map.getMap().addOverlay(marker[key]); 
} 

私はライン未定義marker[key].openInfoWindowHtml('xxxxxx');marker[key]である理由誰も私を伝えることができ、ここに助けが必要?私はそれをここで定義された:marker[key] = new GMarker(point, {icon: iconS});Javascriptの変数問題、簡単な質問

答えて

1

あなたは...そのループに入る前

var num = rez.data.length; 
var marker = []; 

for(var key=0;key<num;key++) 
{ 
    var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude); 
    marker[key] = new GMarker(point, {icon: iconS}); 
    GEvent.addListener(marker[key], "click", function() 
    { 
     marker[key].openInfoWindowHtml('xxxxxx'); 
    }); 
    map.getMap().addOverlay(marker[key]); 
} 

をマーカー配列を定義する必要があります...それ以外の場合は、ループが実行されるたびにresetedされ、そこになります配列内のインデックスnum-1のマーカーで1つだけです。

-1

1新しいGMarker(ポイント、{icon:iconS})が有効な結果を返しましたか?有効性をチェックしていないようです

2:マーカー[キー]はベースループでのみ定義されています。 GEvent.addListenerを呼び出すと、基本的に無名関数が作成されます。マーカー変数は、そのスコープ内で定義されていない可能性があります。 bind()を使うか、それをグローバルに宣言してください。

+0

をはい、私は[] = /ペーストするvarマーカーをコピーするのを忘れ。宣言、私はそれをやった、bind()またはグローバル宣言の原因を使用する方法を説明することができます問題があるようです。 –

3

他の回答から離れて、別の問題があります。

key変数は、内部イベントハンドラ関数の外部にスコープされています。何が起こるかは、keyをインクリメントするたびに、イベントハンドラで使用される値を変更することです。これはスコープに別の関数内のループの内容で修正し、すぐにそれを呼び出すため

function() { 
    marker[10].openInfoWindowHtml('xxxxxx'); 
} 

一つの方法:効果的

、の numは、次のコードを呼び出すことになります10.すべてのクリックイベントハンドラを等しいとしましょう:

var num = rez.data.length; 
var marker = []; 
for(var key=0;key<num;key++) 
{ 
    var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude); 
    marker[key] = new GMarker(point, {icon: iconS}); 
    function(key) { 
    GEvent.addListener(marker[key], "click", function() { 
     marker[key].openInfoWindowHtml('xxxxxx'); 
    }); 
    }(key); 
    map.getMap().addOverlay(marker[key]); 
} 

編集:明確にする。私がやることは、私が直ちに呼び出す無名関数を宣言することです。もう一つの方法は、

function(key) { 
    GEvent.addListener(marker[key], "click", function() { 
    marker[key].openInfoWindowHtml('xxxxxx'); 
    }); 
}(key); 

を置き換えることができ、より明確に何が起こっているかを確認してください:

function temp(key) { 
    GEvent.addListener(marker[key], "click", function() { 
    marker[key].openInfoWindowHtml('xxxxxx'); 
    }); 
}; 

temp(key); 

すなわち、最初tempと呼ばれる一時的な関数を宣言し、後にそれに行を呼び出します。

+0

ありがとうございます、この機能(キー){}(キー)を説明できますか?私は関数の最後にこの(キー)を取得していない、それについての良い文書はありますか? –

+0

最後の(キー)は単なる関数呼び出しです。上記の私の更新を参照してください、私はそれが少し明確にできることを願っています。 – waxwing

+0

Tnx、私は今それを考え出した。魅力的な作品...ありがとう –

1

keyは、クロージャからアクセスされます。すべてのリスナー関数は、同じkeyを共有します。 forループが終了した後、keynumに等しく、明らかにmarker[num]undefinedになります。これは、ハンドラ内のalert(key)で確認できます。

リスナー機能が定義されている場合に使用する特定のキーが必要です。あなたはこのように、たとえば、入力が安定している状況にリスナー関数を作成することによって、それを行うことができます。

function createListener(marker) { 
    return function() { 
    marker.openInfoWindowHtml('xxxxxx'); 
    }; 
} 

var num = rez.data.length; 

var markers = []; 
for(var key=0;key<num;key++) 
{ 
    var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude); 
    var marker = new GMarker(point, {icon: iconS}); 
    markers[key] = marker; 
    GEvent.addListener(marker, "click", createListener(marker)); 
    map.getMap().addOverlay(marker); 
}