0

一度に1つずつ追加するようにコーディングすると、Googleマップ(V3)に追加したポリラインのクリックイベントにハンドラーを正常に追加できましたが、forループを作成してデータを単純に反復処理すると、失敗します。

作業デモ:

http://www.ikfoundation.org/demo/works.html

http://www.ikfoundation.org/demo/fails.html

線を引くビットを除いて、コードはそれぞれ同じです。

作品:

var linePts = [[
new google.maps.LatLng(59.454924068851290, 17.094726562500000),
    new google.maps.LatLng(55.984639327677950, 17.270507812500000),
      ],[
new google.maps.LatLng(51.081191044453350, 26.938476562500000),
new google.maps.LatLng(62.112946929861720, 26.586914062500000)
      ]];

// Draw the lines...  

elines[0] = new google.maps.Polyline({
        path: linePts[0],
        strokeColor: "#0000ff",
        strokeOpacity: 1.00,
        strokeWeight: 7,
        clickable: true,
        editable: true,
        geodesic: true,
        zIndex: 1,
        map: map,
        myID: 0
    });



google.maps.event.addListener(elines[0], 'click', function()
{
    lineClick(elines[0]);
});

elines[1] = new google.maps.Polyline({
        path: linePts[1],
        strokeColor: "#0000ff",
        strokeOpacity: 1.00,
        strokeWeight: 7,
        clickable: true,
        editable: true,
        geodesic: true,
        zIndex: 1,
        map: map,
        myID: 1
    });

google.maps.event.addListener(elines[1], 'click', function()
    {
        lineClick(elines[1]);
    });

function lineClick(line)
{
    alert("Line clicked with myID=" + line.myID);
}

失敗します(上記と同じラインポイント定義配列と、両方で同じlineClick関数を除外しました):

for (var i=0; i<=1; i++)
{       
elines[i] = new google.maps.Polyline({
            path: linePts[i],
            strokeColor: "#0000ff",
            strokeOpacity: 1.00,
            strokeWeight: 7,
            clickable: true,
            editable: true,
            geodesic: true,
            zIndex: 1,
            map: map,
            myID: i 
        });

google.maps.event.addListener(elines[i], 'click', function()
        {
            lineClick(elines[i]);
        });
}

私は何を間違えましたか?どちらも、これらの変数でまったく同じ変数名とインデックスを使用しています。そして、クリックリスナーを除いて、私の例のリンクで見ることができるように、すべてが完全に機能します。後者の「失敗」バージョンでは、ポリラインがlineClick関数にまったく渡されていないように見えるため失敗します(エラーを確認するには、Javaデバッガーを実行する必要があります)。

ありがとうございました!

4

2 に答える 2

3

整理しました。理由はわかりませんが(誰もが啓蒙したいと思いますか?)、addListenerコードを次のように置き換えると機能します。

        google.maps.event.addListener(elines[i], 'click', function()
        {
            lineClick(this);
        });
于 2012-06-17T08:41:47.203 に答える
0

これは可変スコープの問題です。var elines = [];コードの先頭(下)で新しい変数を宣言するだけです。

var elines = [];
var myLine;

次に、forループでポリラインをインスタンス化した後、次のようにmyLine =elines[i]を設定します。

myLine = elines[i];

google.maps.event.addListener(elines[i], 'click', function()
  {
    lineClick(myLine);
  });
于 2012-06-15T21:57:51.507 に答える