JavaScript控制台可以看到Object的内容但我无法访问它

时间:2010-11-01 19:06:45

标签: javascript openlayers

我正在尝试使用OpenLayers JavaScript库将大量KML文件加载到地图中。我可以毫无问题地加载所有KML,但现在在尝试从正在生成的OpenLayers.Layer.Vector对象中检索数据时,我遇到了一个问题。

如果我使用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... 

2 个答案:

答案 0 :(得分:1)

如果你正确地遵循它们的路径,你应该能够看到属性。您的完整表达是layer.features[0].attributes.name。到目前为止您发布的内容告诉我们layer.featureslayer.features[0]部分是正确的,但我们必须知道layer.features[0]中的内容是否有attributes }属性等。

跳出来的一件事是attributes是复数,然后你直接访问它上面的一个属性。复数建议它可能是一个数组,所以你可能需要查看一个下标?

对于这些东西,我发现没有什么比调试器好。您可以在layer对象中使用一个向下钻取并找出其中的确切内容,通常当您这样做时,您甚至可以看到您已扩展到的点的路径。每个主要浏览器都有调试器:

  • Chrome和Safari内置了“开发工具”(在Chrome上按Ctrl + Shift +我将打开面板)
  • 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]);
}

答案 1 :(得分:0)

您需要研究对象的格式。这还有很长的路要走,但试试这个:

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

在某个地方,你会收到一个错误,这会告诉你问题在哪里。在我看到您当前的日志后,我猜想attributesname不存在(至少不是您认为的格式)。 (当然,为了这个,使用firebug中的下钻更好/更容易,但上面的代码片段可以帮助你开始。)