日期:2014-05-16  浏览次数:20401 次

肿么又被循环难住了呢?
本帖最后由 dancingyomin 于 2013-04-08 16:25:35 编辑
请问这段最后两句有什么问题么?为什么markers显示正常,但是所有读出的info都是最后一个?

for(var i in mapx){
markers.push(new MMap.Marker({id:"n7h9"+[i],position:new MMap.LngLat(mapx[i],mapy[i]),icon:icon}))//自定义构造MMap.Marker对象
mapObj.addOverlays(markers[i]); 

infoWindows.push(new MMap.InfoWindow({content:minfo[i]}));
mapObj.bind(markers[i],"click",function(e){infoWindows[i].open(mapObj,e.lnglat)});
}

------解决方案--------------------
mapObj.bind(markers[i],"click",(function(_i){
return function(e){infoWindows[_i].open(mapObj,e.lnglat)}
})(i)
);
------解决方案--------------------
这不是什么JQUERY写法。

就是个闭包啦。。

2L是正解。

说白点就是编译期跟运行期的区别,你可以分析一下你的代码,逻辑上看起来是没问题的,每个绑定一个对应的i,但是真正到了运行期,函数还是去取i的值,这个时候i已经是最后那个值了,所以就形成了这样的情况

用立即执行的函数
(function(_i){
return function(e){infoWindows[_i].open(mapObj,e.lnglat)}
})(i)
执行以下的话,return的是一个新函数,这个函数里的_i就是每次的i,这样每次绑定的函数都是对应的i。
------解决方案--------------------
引用:
这是jqurey写法么?是不是需要引用jqurey文件的? 

这个就是传说中的回调函数么?

刚才直接复制试验了下,还不成功。现在点击后不显示任何info注释

另外不是很理解~我分解了一下这个文件

fn = function(e){infoWindows[_i].open(mapObj,e.lnglat);}
mapObj.bind(markers……


1#的就是js的方法,做了个闭包,要不你只能获取最后的信息