私はいくつかの動作を要素に追加するためにonloadを実行するセットアップ関数を持っています。 setup関数はmouseoverイベントに引数を渡しますが、それらの引数はローカル参照であるためforループ中に変更されています。匿名関数を使用してマウスオーバーを割り当てる際にローカル変数を渡す方法は?
function setupAreas(image, map, lots) {
// obj is a simple wrapper for doc.getElementById
var image = obj(image); // image for imagemap
var map = obj(map); // imagemap element
var areas = map.getElementsByTagName('area');
for (var i in areas) {
var area = areas[i]; // imagemap area element
area.id = area.alt;
}
for (var lot_id in lots) {
if (lot_id != 'Lot No' && lot_id != '') {
var area = document.getElementById(lot_id);
if (!area || !area.coords) {
alert('no map coords for lot '+lot_id);
} else {
var coords = area.coords.split(",");
//alert('tag: '+area.tagName+' id: '+lot_id+' area: '+area);
var details = lots[lot_id];
if (details) {
// setup mouseover call with complete details of area
area.onmouseover = function(){ showLot(lot_id, area, coords, details, image, map, areas, lots) };
... snip ...
問題は、参照forループのlot_id
とarea
が各反復で変更されることです。結果は、任意の要素のmouseoverイベントは、lot_id
と最後の領域の領域にのみを与えます。
私はこのためにjQueryを必要としたくありません。グローバルな名前空間を汚染しないシンプルなJSソリューションが好まれます。閉鎖であなたのforループの内容を取り巻く
驚くべきことに、私はJSを何年も使っていて、閉鎖については全く知らなかった。 – SpliFF