2010-11-01 112 views
1

我試圖使用OpenLayers JavaScript庫來加載一些KML文件到地圖。我可以在沒有問題的情況下加載所有KML,但是現在嘗試從正在生成的OpenLayers.Layer.Vector對象中檢索數據,我遇到了一個問題。JavaScript控制檯可以看到對象的內容,但我無法訪問它

如果我輸出生成的對象與console.log我可以看到完整的對象與它的所有屬性充實,但如果我嘗試以編程方式訪問大多數屬性,我得到一個未定義的錯誤。這裏是我的代碼:

map = new OpenLayers.Map("mapdiv"); 
    map.addLayer(new OpenLayers.Layer.OSM()); 

    var vectors = new Array(); 

    for(i = 1; i <= 14; i++) { 

     var layer = new OpenLayers.Layer.Vector("KML", { 
      strategies: [new OpenLayers.Strategy.Fixed()], 
      protocol: new OpenLayers.Protocol.HTTP({ 
       url: "kml/" + i + ".kml", 
       format: new OpenLayers.Format.KML 
      }) 
     }); 
     console.log(layer); 
     console.log(layer.features[0].attributes.name); 

     vectors.push(layer); 
    } 
    //etc... 

所以只有console.log(層)我能夠看到一切。不過,儘管信息明顯存在,但我得到了錯誤。另外,當我嘗試直接通過控制檯訪問相同的信息時,它工作得很好。

我在這裏錯過了一些明顯的東西嗎?

編輯:

這裏是根對象

Object: 
EVENT_TYPES: Array[25] 
alwaysInRange: true 
div: HTMLDivElement 
drawn: true 
events: Object 
features: Array[1] 
id: "OpenLayers.Layer.Vector_39" 
inRange: true 
map: Object 
maxExtent: Object 
maxResolution: 1.40625 
maxScale: 13517.573318481445 
minExtent: null 
minResolution: 0.00004291534423828125 
minScale: 442943842.5 
name: "KML" 
numZoomLevels: 16 
options: Object 
projection: Object 
protocol: Object 
renderer: Object 
resolutions: Array[16] 
scales: Array[16] 
selectedFeatures: Array[0] 
strategies: Array[1] 
styleMap: Object 
tileSize: Object 
units: "degrees" 
unrenderedFeatures: Object 
__proto__: Object 

編輯2:

將無法​​對字符串化容易使這裏是一些相關的信息:

內「特徵「:

0: Object 
length: 1 
__proto__: Array[0] 
id: "OpenLayers.Layer.Vector_39" 

「0」 裏面:

attributes: Object 
data: Object 
geometry: Object 
id: "OpenLayers.Feature.Vector_3508" 
layer: Object 
lonlat: null 
renderIntent: "default" 
state: null 
style: null 
inRange: true 

裏面的 「屬性」:

name: <string, which I can assure you exists> 

爲了澄清 「layer.features [0] .attributes.name」,我試圖在我的代碼使用當我把它輸入到控制檯時工作得很好。

編輯3!

直接訪問輸出的層級通過控制檯:從硬編碼腳本

1) layer -> Object 
2) layer.features -> Object 
3) layer.features[0] -> Object 
4) layer.features[0].attributes -> Object 
5) layer.features[0].attributes.name -> <the string I'm looking for> 
OR 
6) layer.features[0].attributes['name'] works the same as above 

輸出:

1) layer -> Object 
2) layer.features -> [] 
3) layer.features[0] -> undefined 
etc... 
+1

**當你顯示'console.log(圖層)時, '?這個問題的答案顯然取決於「圖層」對象的結構。例如,你假設生成的'layer'對象有一個叫'features'的屬性,但是這裏沒有列出:http://dev.openlayers.org/releases/OpenLayers-2.10/doc/apidocs/files/OpenLayers /Layer-js.html – 2010-11-01 19:10:20

+0

你可以發佈console.log()嗎?如果你的瀏覽器沒有像這樣輸出它,也許JSON字符串化。 – 2010-11-01 19:13:33

+1

我們還需要查看layer.features的結構。 – Stephen 2010-11-01 19:15:03

回答

1

你應該能夠看到的屬性提供您關注的正確的路徑。您的完整表達是layer.features[0].attributes.name。什麼到目前爲止已張貼告訴我們,layer.featureslayer.features[0]部分是正確的,但我們必須知道什麼是在layer.features[0]知道它是否有一個attributes物業等

即跳出

一件事是, attributes是複數,然後你直接訪問它的屬性。複數建議它可能是一個數組,所以也許你需要看一個下標?

對於這個東西,我發現沒有什麼比打敗一個調試器。您可以使用一個鑽取到layer對象中,並確切瞭解其中的內容,通常當您這樣做時,甚至可以看到已擴展到的點的路徑。有對每一個主要的瀏覽器那裏調試器:

  • Chrome和Safari瀏覽器擁有「開發工具」中建(Chrome上按Ctrl + Shift + I將打開面板)
  • Firefox擁有出色的Firebug插件
  • IE具有Visual Studio.Net的免費版本(和IE8及以上的有一些內置的工具,以及)

編輯:你的更新問題的這部分很有趣:

2)layer.features -> []
3)layer.features[0] -> undefined

這表明,無論是A)features爲空數組,或B)features稀疏陣列不具有索引0。所有JavaScript數組都很稀疏(它們根本不是真正的數組),因此您可以嘗試:

var name; 
for (name in layer.features) { 
    console.log(name + ": " + layer.features[name]); 
} 
+0

是的,這個解決方案實際上只需在Chrome Developer Tools中點擊一下即可。或者二,擴展功能數組。 – 2010-11-01 19:23:19

+0

使用Chrome開發工具,這就是爲什麼我知道信息在那裏。正如在控制檯中提到的,我可以訪問這些數據,但是在我的代碼中做同樣的事情就會被破壞。 – Jared 2010-11-01 19:25:22

+1

我有類似的問題,當我給console.log(layer.features.length)它顯示0,但是當我給螢火蟲控制檯相同,然後長度顯示爲10(這是實際長度功能數組,我能夠看到螢火蟲)。可能是什麼原因?在創建'圖層'對象之前是否調用了layer.features.length? – 2013-02-13 12:14:16

0

您需要研究對象的格式。這是圍繞着很長的路要走,但試試這個:

console.log(layer.features); 
console.log(layer.features[0]); 
console.log(layer.features[0].attributes); 
console.log(layer.features[0].attributes.name); 

某處,你會得到一個錯誤的行,這將告訴你,你的問題是。我猜在看到你的當前日誌後,attributesname不存在(至少不是你認爲他們這樣做的格式)。 (當然,在螢火蟲中使用這種方式會更好/更容易,但上面的代碼片段會讓你開始。)

相關問題