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

标签 javascript openlayers

我正在尝试使用 OpenLayers JavaScript 库将多个 KML 文件加载到 map 中。我可以毫无问题地加载所有 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(layer) 我就可以看到一切。但是,对于以下行,尽管信息明确存在,但我收到错误。另外,当我尝试直接通过控制台访问相同的信息时,它工作得很好。

我在这里遗漏了一些明显的东西吗?

编辑:

这是根对象

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... 

最佳答案

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

值得注意的一件事是 attributes 是复数,然后您可以直接访问它的属性。复数表明它可能是一个数组,所以也许您需要查看下标?

对于这个东西,我发现没有什么比调试器更好的了。您可以深入了解层对象并准确找出其中的内容,通常当您这样做时,您甚至可以看到到达已扩展点的路径。每个主要浏览器都有调试器:

  • 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]);
}

关于JavaScript 控制台可以看到对象的内容,但我无法访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4072211/

相关文章:

javascript - 从第二级 iframe 中选择根文档

javascript - 如何让模态框在 x 秒内关闭?

javascript - 顶点图表文本 chop 自定义

javascript - 工作流程详细信息页面中的自定义表格

javascript - Openlayers DragRotate map 交互不起作用

javascript - 禁用聚类点的弹出窗口

javascript - TS2304 : Cannot find name '__decorate' , '__metadata' 和 '__extends'

openlayers - 如何在 OpenLayers 3 Map 上放置静态图像叠加层

html - OpenLayer.Popup.FramedCloud 中无响应的 onclick 事件

javascript - OpenLayers 创建复杂的样式(一侧有孔和笔划的多边形)