首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript变量问题,简单问题

Javascript变量问题,简单问题
EN

Stack Overflow用户
提问于 2009-08-19 10:58:24
回答 4查看 304关注 0票数 0
代码语言:javascript
复制
var num = rez.data.length;

for(var key=0;key<num;key++)
{
  var marker = [];
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  marker[key] = new GMarker(point, {icon: iconS});
  GEvent.addListener(marker[key], "click", function() 
  {
    marker[key].openInfoWindowHtml('xxxxxx');
  });
  map.getMap().addOverlay(marker[key]); 
}

我需要帮助,谁能告诉我为什么行marker[key].openInfoWindowHtml('xxxxxx');中的marker[key]是未定义的?我在这里定义了它:marker[key] = new GMarker(point, {icon: iconS});

EN

回答 4

Stack Overflow用户

发布于 2009-08-19 11:10:24

除了其他答案所表明的之外,你还有另一个问题。

您的key变量的作用域位于内部事件处理函数的外部。发生的情况是,每次递增key时,都会更改事件处理程序中将使用的值。

实际上,假设num等于10。所有单击事件处理程序都将调用以下代码:

代码语言:javascript
复制
function() {
    marker[10].openInfoWindowHtml('xxxxxx');
}

解决这个问题的一种方法是在另一个函数中限定循环内容的范围,并立即调用它:

代码语言:javascript
复制
var num = rez.data.length;
var marker = [];
for(var key=0;key<num;key++)
{
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  marker[key] = new GMarker(point, {icon: iconS});
  function(key) {
    GEvent.addListener(marker[key], "click", function() {
      marker[key].openInfoWindowHtml('xxxxxx');
    });
  }(key);
  map.getMap().addOverlay(marker[key]); 
}

编辑:澄清。我所做的就是声明一个匿名函数,然后立即调用它。更清楚地看到正在发生的事情的另一种方法是

代码语言:javascript
复制
function(key) {
  GEvent.addListener(marker[key], "click", function() {
    marker[key].openInfoWindowHtml('xxxxxx');
  });
}(key);

可以替换为:

代码语言:javascript
复制
function temp(key) {
  GEvent.addListener(marker[key], "click", function() {
    marker[key].openInfoWindowHtml('xxxxxx');
  });
};

temp(key);

也就是说,首先声明一个名为temp的临时函数,然后在后面的行调用它。

票数 3
EN

Stack Overflow用户

发布于 2009-08-19 11:06:54

您应该在进入该循环之前定义标记数组...

代码语言:javascript
复制
var num = rez.data.length;
var marker = [];

for(var key=0;key<num;key++)
{
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  marker[key] = new GMarker(point, {icon: iconS});
    GEvent.addListener(marker[key], "click", function() 
    {
      marker[key].openInfoWindowHtml('xxxxxx');
    });
  map.getMap().addOverlay(marker[key]); 
}

...otherwise它将在每次循环运行时被重置,并且在索引num - 1处数组中将只有一个标记。

票数 1
EN

Stack Overflow用户

发布于 2009-08-19 11:17:24

可以从闭包访问key -所有侦听器函数都将共享相同的key。在for循环结束后,key应该等于num,显然marker[num]应该是undefined。您可以在处理程序中使用alert(key)验证这一点。

您希望在定义侦听器函数时使用特定的键。您可以通过在输入稳定的上下文中创建侦听器函数来完成此操作,例如:

代码语言:javascript
复制
function createListener(marker) {
  return function() {
    marker.openInfoWindowHtml('xxxxxx');
  };
}

var num = rez.data.length;

var markers = [];
for(var key=0;key<num;key++)
{
  var point  = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
  var marker = new GMarker(point, {icon: iconS});
  markers[key] = marker;
  GEvent.addListener(marker, "click", createListener(marker));
  map.getMap().addOverlay(marker); 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1299155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档