自己呼び出し関数のトリックはうまく機能します。それは新しいスコープ(おそらく「関数javascriptのスコープ」のグーグル)を作成し、したがってi
別の変数として処理し、イベントリスナーのコールバック関数に正しい値を提供します。
ただし、実際には、jQueryを使用して要素を再度見つける必要はありません。これは、既にイベントリスナーを割り当てており、関数内に。を使用して要素への参照があるためthis
です。
そして、とにかくjQueryを使用しているので、要素のIDと配列を渡すことでの正しいインデックス(your i
)を簡単に見つけることができます(一意のIDを扱っていると仮定します。そうでない場合も失敗します。最初に見つけたものを取ります)。statesPolyObjects
$.inArray()
statesPolyStrings
$("#"+statesPolyStrings[i])
var el;
for (var i = 0, len = statesPolyStrings.length; i < len; i++) {
el = document.getElementById(statesPolyStrings[i]);
google.maps.event.addDomListener(el, 'mouseover', function(event) {
$(this).addClass("highlight");
statesPolyObjects[$.inArray(this.id, statesPolyStrings)].
setOptions({ strokeWeight: '2' });
});
}
それでも自己呼び出し機能を使い続けたい場合は、とにかく次の行を変更する必要があります。
("#"+statesPolyStrings[i]).addClass("highlight");
に
$(this).addClass("highlight");
イベントに精通していない場合はthis
、次の記事を読むことをお勧めします:
http ://www.sitepoint.com/javascript-this-event-handlers/
event
匿名のコールバック関数内にも引数を書いたことにお気づきかもしれません。console.log
イベントリスナーのコールバック関数を使用して無料で配信されるこのイベントを試して、アクセスできる他のすべてのものを調べてください。たとえば、クリックした実際の要素を見つけることができますevent.target
(実際のマウスオーバーは要素の子に発生した可能性があるため)。それで:
google.maps.event.addDomListener(el, 'mouseover', function(event) {
console.log(event);
...
ブラウザのコンソールを開いて、どのイベントが配信されるかを確認してください...
google.maps.event.addDomListener
ただし、それは別のことを通過しdocument.body.addEventListener
、ブラウザ間にも違いがあることに注意してください。たとえば、jQuery.on()は、イベントオブジェクトでいくつかの異なるものを提供しますが、少なくともすべてのブラウザーで同じデータを信頼できます。