2014-01-28 16 views
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時,如何轉換我的代碼以避免在循環中生成函數?

回答

2

您可以在循環之前定義的一個小功能,然後就指的是本地函數從內環路:

循環之前:

function handleMarkerClick() { 
    this.iwindow.open(map,this); 
} 

然後,在循環:

for (var alphabet in window.towns) { 
    for (var town in window.towns[alphabet]) { 

    // .... 

    window.google.maps.event.addListener(info.marker, 'click', handleMarkerClick); 
+0

這有效......但現在我得到'可能的嚴重違規',因爲在函數中有'this'。 值得做什麼?是:) – clov3rly

+0

@CloverLeaf - 沒有實際的違規行爲,因爲addListener()會在調用時適當地設置this。不知道爲什麼jsLint是反對 - 我想這只是不知道你知道你在做什麼,即使你真的這樣做。 [這個問題](http://stackoverflow.com/questions/16553264/why-is-jshint-throwing-a-possible-strict-violation-on-this-line)關於jsHint包含一個答案如何解決警告與特殊評論 - 不知道如果相同的方法適用於jsLint或不。 – jfriend00

+0

太好了,謝謝。 JSHint技巧正是我所需要的。 – clov3rly