2009-05-31 16 views
2

複数のマーカーがあるGoogleマップを作成しようとしています。マーカーをクリックすると警告が表示されます。作業例ではGoogleマップ - マーカーをクリックするとウィンドウが表示されます

var map = null; 
function setupMap() { 

    map = new GMap2(document.getElementById("map")); 
    map.setUIToDefault(); 
    map.setCenter(new GLatLng(0, 0), 1); 
    map.enableDoubleClickZoom(); 

    // Create the marker icon - will be repeated for each icon but 
    // truncated for brevity in example 
    var icon1 = new GIcon(G_DEFAULT_ICON); 
    icon1.image = "uploads/1.jpg"; 
    icon1.shadow = ""; 
    icon1.iconSize = new GSize(50, 50); 

    var latlng = new GLatLng(0, 0); 
    markerOptions = { icon:icon1 };  
     marker1 = new GMarker(latlng, markerOptions); 
    map.addOverlay(marker1); 
    GEvent.addListener(marker1, "click", loadInfo(1));  

} 

function loadInfo(a) { 
    alert(a); 
} 

window.onload = setupMap; 

、私は(loadInfoにマーカーオブジェクトを渡します)、その後、情報ウィンドウをロードしますが、今のところ、私はちょうどマーカーがクリックされたときにアクションが起こることを取得しようとしています。実際に起こっているのは、地図がロードされたときに警告ボックスがロードされていることです(予想通りに '1'が表示されます)。複数のマーカーで複数の警告ボックスが読み込まれることはなく、最初の警告ボックスが読み込まれた後(私が望まない)マーカーをクリックしても何も起こりません。

ご協力いただきありがとうございます!

答えて

5

は、あなたが実際にloadInfoを呼び出す代わりに、それへの参照を渡しています。代わりに以下のことを試してみてください。

GEvent.addListener(marker1, "click", function() { 
    loadInfo(1); 
});  

これは、匿名関数が実行されたときにメソッドを呼び出して、あなたのloadInfoメソッドをラップ匿名関数を作成します。あなたがloadInfo内の任意のパラメータを使用していない場合

あるいは、単に括弧を削除すると、あまりにも動作します:そのような関数のリファレンスを使用する際に念頭に置いておく価値

GEvent.addListener(marker1, "click", loadInfo);  

何かを、それがされるであろう範囲がされと呼ばれる。 'this'リファレンスを使用する場合は、コールバック関数内の'this'が、実際に作成されたスコープを参照するのではなく、実行されているスコープを参照することになります呼び出したいフィールドまたはメソッドが含まれているため、代わりにUndefinedというエラーが表示されます。 Jonathanは、call()apply()のメソッドを明示的にバインドして関数が正しいスコープ内で実行されるようにする必要があることを指摘しています。

1

.addListenerでloadInfoを呼び出し、参照を与えません。

GEvent.addListener(marker1, "click", loadInfo(1)); 

試してみてください。

function wrap(method) { 
    var args = Array.prototype.slice.apply(arguments,1); 
    return function() { 
     return method.apply(this,args); 
    } 
} 


GEvent.addListener(marker1, "click", wrap(loadInfo,1)); 

は、関数に引数をバインドする方法の詳細についてはhttp://www.alistapart.com/articles/getoutbindingsituationsを参照してください。 も()適用に非常に便利な方法の詳細についてはhttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/applyを参照してください(また、あなたが呼び出しを見てお勧めします()だけでなく)自分のaddListener呼び出しで

1

loadInfo(1)は、この関数をすぐに実行することを意味しますが、コールバック関数をGEvent.addListener()メソッドに渡す必要があります。そのためには、無名関数を使用することができます。

GEvent.addListener(marker1, "click", function() { loadInfo(1) }); 
0

にもかかわらずGEvent.addListener(MARKER1、機能を "クリック"(){ loadInfo(1); }); が使用されましたが、次に移動するマーカーへのリンクが得られません

関連する問題