2012-01-03 22 views
8

これは私を夢中にしています...私はイベントリスナーをSVGオブジェクトに追加するループを持っています。オブジェクトは引数のために小さな円です.10個の円ごとにマウスオーバーイベントとマウスアウトイベントを追加する必要があります。addEventListenerにイベントを渡すことができません:closure issue

最初の問題は、すべてのリスナーが同じループに追加されているため、ループ変数の同じ無効な値がすべて表示されるためです。私はこれを修正することができますが、第2の問題は、リスナーに「イベント」を渡す必要があることです。これらの問題を同時に解決する方法はありません。

私はこれのさまざまなバージョンを試してみた:

for(month = 0; month < nMonths; month++) { 
    ... 
    shape.addEventListener(
    "mouseover", 
    (function(event, index) { popup_on(event, foo, index); })(event, month), 
    false); 
    group.appendChild(shape); 
} 

この特定のバージョンは、「イベントが定義されていない」私を与えます。 popup_onは実際のハンドラであり、eventと現在の値monthを取得する必要があります。どのように私はこれを行う必要がありますか?ありがとう。

答えて

15

イベントはあなたの関数に自動的に渡されます- addEventListenerに渡す関数の最初の引数にします。また、falseはキャプチャパラメータのデフォルト値です。

(function() { 
    var i = month; 
    shape.addEventListener("mouseover", function(e) { popup_on(e, foo, i); }); 
})(); 

また、イベントコールバックでfooが閉じられても問題ありませんか?そうでない場合、あなたはそれ

(function() { 
    var i = month; 
    var f = foo; 
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); }); 
})(); 

と同じことを行う可能性があり、これらすべてのローカル変数は迷惑になっている場合、あなたは彼らにおそらくあることが

(function(i, f) { 
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); }); 
})(month, foo); 
+0

申し訳ありませんが、もう少しきちんと物事を行うためのパラメータを行うことができますだから、私は実際にこの機能を置くのですか? 'shape'はループで作成されます(おそらく10倍から20倍)。新しい 'shape'インスタンス( 'createElementNS'から)にはハンドラが追加されていなければなりません。したがって、現在の「形」がコンテキストにあるこの無名関数を置くことができる場所はどこにもないようです。これを考えると、私はすべてを 'addEventListener'呼び出し自体に入れる必要はありませんか?どのように私が「e」と「月」の両方をparamsとして得ることができるかという問題を残していると思いますか? – EML

+0

@ user785194私が上に書いたコードはうまくいくと思います。シェイプが再作成されるたびに、その特定のインスタンスにイベントリスナーを追加するために上のコードを上に置くだけです。 –

+0

華麗な - それはそれをしました。ありがとう。 – EML

関連する問題