0

なぜそれが機能しないのか理解しています。しかし、結果を取得する方法がわかりません:

グローバル配列があります:

var members=[[1,x,y,z],[2,x1,y1,z1],[3,x2,y2,z3]];

function drop() {
  for (var i = 0; i < members.length-1; i++) { 
    setTimeout(function() {
      addMarker();
    }, i * 30);
  }
}

function addMarker() { 
  var marker = new google.maps.Marker({
    position: members[iterator][1],
    icon: pinImage[members[iterator][2]],
    shadow: shadow,
    map: map,
    draggable: false,
    title: members[iterator][3],
    animation: google.maps.Animation.DROP    }); 
  google.maps.event.addListener(marker, 'click', function() {
    $.ajax({
      url : 'ajax/get_infowindow_content.php?id='+members[iterator][0],
      success: function(data) {
        infowindow.close();
        infowindow.setContent(data);
        infowindow.open(map, marker);
      }
    });
  }); 
  markers.push(marker);  
  iterator++;
}

問題はここにあります:

url : 'ajax/get_infowindow_content.php?id='+members[iterator][0],

マーカーをクリックすると、関数が起動され、メンバー[iterator] [0]がチェックされますが、イテレーターはイテレーターの最後の値です(ループ全体の後)。

最良の解決策は、次のような .value() のようなものです。

url : 'ajax/get_infowindow_content.php?id='+members[iterator][0].value(),

しかし、もちろんうまくいきません。

積み重なって..

4

2 に答える 2

2

クロージャーが必要で、パラメータを addMarker 関数に渡すだけです。

var members = [[1, x, y, z], [2, x1, y1, z1], [3, x2, y2, z3]];

function drop() {
    for (var i = 0; i < members.length; i++) {
        (function(j) {
            setTimeout(function() {
                addMarker(members[j]); //pass the value
            }, i * 30);
        })(i); //closure to keep the value
    }
}

function addMarker(member) {
    var marker = new google.maps.Marker({
        position: member[1],
        icon: pinImage[member[2]],
        shadow: shadow,
        map: map,
        draggable: false,
        title: member[3],
        animation: google.maps.Animation.DROP
    });
    google.maps.event.addListener(marker, 'click', function() {
        $.ajax({
            url: 'ajax/get_infowindow_content.php?id=' + member[0],
            success: function(data) {
                infowindow.close();
                infowindow.setContent(data);
                infowindow.open(map, marker);
            }
        });
    });
    markers.push(marker);
}​
于 2012-12-15T17:10:37.713 に答える
0

iの引数として渡してみてくださいaddMarker()

function addMarker(i){/* code*/}

次にループで:

setTimeout(function() {
      addMarker(i);
    }, i * 30);
于 2012-12-15T17:11:34.260 に答える