1
所以我有了這個代碼,循環遍歷每個城鎮window.towns
,這是一個嵌套的對象,按城鎮名的第一個字符排序。像這樣:避免使用Google Maps addEventListener循環制作函數
//sample data:
window.towns = {
'A' : {
"Aberdeen" : {
"town_info": {
"google_maps": {
"lat" : 47.561236,
"lng" : 0.1235467 }
}
} ,
"Agency Village" : {
"town_info": {
"google_maps": {
"lat" : 47.561236,
"lng" : 0.1235467 }
}
}
},
'B' : { //towns beginning with B
},
'C' : {},
// ... all the way thru 'Z'
}
然後我的代碼通過每個字母循環,併爲每個字母,遍歷以該字母開頭的城鎮,創造了谷歌地圖的每個小鎮上的一個標記,以及信息單擊標記時出現的窗口。
for (var alphabet in window.towns) {
for (var town in window.towns[alphabet]) {
var info = window.towns[alphabet][town].town_info;
if (info !== undefined &&
typeof info !== undefined &&
info.google_maps !== undefined &&
typeof info.google_maps !== undefined) {
var lat = info.google_maps.lat,
lng = info.google_maps.lng;
info.marker =
new window.google.maps.Marker({
position: new window.google.maps.LatLng(lat,lng),
map: map,
title: window.towns[alphabet][town].post_title,
icon: icon_image
});
info.marker.iwindow =
new window.google.maps.InfoWindow({
content: '<strong><a href="#'+
window.towns[alphabet][town].post_title
.replace(' ','-','g').toLowerCase()+
'" class="town">'+
window.towns[alphabet][town].post_title+
'</a></strong>'
});
window.google.maps.event.addListener(info.marker, 'click', function() {
this.iwindow.open(map,this);
});
}
}
}
該代碼正常工作。但是,我得到一個JSLint錯誤,「不要在循環中創建函數」,這是有道理的。當匿名函數取決於this
的值等於當前的info.marker
時,如何轉換我的代碼以避免在循環中生成函數?
這有效......但現在我得到'可能的嚴重違規',因爲在函數中有'this'。 值得做什麼?是:) – clov3rly
@CloverLeaf - 沒有實際的違規行爲,因爲addListener()會在調用時適當地設置this。不知道爲什麼jsLint是反對 - 我想這只是不知道你知道你在做什麼,即使你真的這樣做。 [這個問題](http://stackoverflow.com/questions/16553264/why-is-jshint-throwing-a-possible-strict-violation-on-this-line)關於jsHint包含一個答案如何解決警告與特殊評論 - 不知道如果相同的方法適用於jsLint或不。 – jfriend00
太好了,謝謝。 JSHint技巧正是我所需要的。 – clov3rly