JavaScript数组遍历manualy工作,但循环不

时间:2010-09-16 11:29:47

标签: javascript api google-maps

我将谷歌地图标记放入数组中,当我手动执行时,一切正常:

var m =[];

   m[0] = new google.maps.Marker(.....

   google.maps.event.addListener(m[0], 'click', function() 
   {
    alert('Markerklik');
    $("#trasa").append(m[0].getPosition().toString()+"<br>");
   });  

   m[1] = new google.maps.Marker( .....

   google.maps.event.addListener(m[1], 'click', function() 
   {
    alert('Markerklik');
    $("#trasa").append(m[1].getPosition().toString()+"<br>");
   }); 

但如果我想循环使用:

    for ( var i=0 ; i<2; i++ )
{
// do the same with m[i]
}

单击标记(m [i] .getPosition())时, m [i]未定义

有关如何使用循环自动执行此操作的任何建议吗?

注意,如果我将标记放入变量temp,则将监听器添加到temp并执行m.push(temp);循环 - 点击任何标记,给我最后添加标记的位置。

这看起来像向m [i]添加事件甚至不检查i的值,例如,它不是在寻找m [1],而是像变量“named” m [i]

如果我使用m [0]和m [1]手动完成所有代码 - 每个方法都可以正常工作,有事件连接到m [0]和m [1],但是创建带有for循环的标记m [i] ]看起来像绑定事件不是m [0]和一个循环m [1],但是当我只是字母 i 时,将事件添加到“m [i]”,而不是i的值< / p>

好的,看起来响应的代码

for (var i=0 ; i<2; i++ ) 
  {
   (function(x) {
    m[x] = new google.maps.Marker( {
     position: getRandomPoint(),
     title: 'Mojmarkers'
    });

    google.maps.event.addListener(m[x], 'click', function() {
     alert('Markerklik');
     $("#trasa").append(m[x].getPosition().toString()+"<br>");
    }); 

    return m[x];
   })(i);
  }

任何人都可以解释为什么这个不寻常的解决方案可以按我的意愿运作?

4 个答案:

答案 0 :(得分:2)

你可以尝试下面的代码,这可能是一个封闭内存问题。

for (var i=0 ; i<2; i++ ) {
    (function(i) {
        m[x] = new google.maps.Marker(.... ;
        return  google.maps.event.addListener(m[x], 'click', function() {
            alert('Markerklik');
            $("#trasa").append(m[x].getPosition().toString()+"<br>");
         });
    })(x);
}

答案 1 :(得分:1)

如果在返回标记的单独函数中创建标记对象,在create函数中向其添加事件侦听器,然后将该对象放在函数外部的数组中,会发生什么?

答案 2 :(得分:0)

尝试从var声明中删除for

答案 3 :(得分:0)

尝试使用

m.push(new google.maps.marker...);

然后正如Pranay所提到的那样,使用length属性并遍历m数组。