JSFL for ... in循环似乎不起作用

时间:2011-07-09 02:50:10

标签: javascript flash for-loop jsfl

我正在JSFL for Flash CS5中编写一个脚本,我正在尝试从主时间轴中获取一个层列表。我正在获取时间轴,然后使用for ... in循环遍历它,但是我得到的对象似乎未定义。这是我制作的一些测试代码:

alert(fl.getDocumentDOM().getTimeline().layers[0].name); //Returns "text1"

for(layer in fl.getDocumentDOM().getTimeline().layers) {
    alert(layer.name); //Returns "undefined"
}

那么,JSFL不支持...... in?这有点奇怪,因为它似乎只是一个JavaScript引擎。

2 个答案:

答案 0 :(得分:5)

那是谁。 JSFL不仅仅是一个JavaScript引擎,它是奇异的世界JavaScript,可能非常难以预测。不相信我?不确定是否仍然如此,请尝试fl.getDocumentDOM().selection.push(<obj>)。它没有用,但确实如此:var s = fl.getDocumentDOM().selection; s.push(<obj>) fl.getDocumentDOM().selection = s

那就是说,你的语法是关闭的:

var layers = fl.getDocumentDOM().getTimeline().layers;
// include 'var' it's good taste
for(var layer in layers) {
    // for... in iterates the KEYS, so you actually have to do a lookup
    alert(layers[layer].name);
}

顺便说一句,你最好用数字索引迭代数组,它更清晰,更快。

答案 1 :(得分:5)

你永远不应该使用for..in循环数组,因为它是为Object枚举设计的。所需要的是另一个脚本修改Array.prototype和你的for..in中断(如果你不相信我,扩展Object.prototype并观察Adobe IK工具开始吐出错误!)

在JSFL(使用Spidermonkey JavaScript引擎)上循环遍历Arrays的最简洁方法是:

for each(var layer in layers)
{
    fl.trace(layer.name);
}

PS。 @cwallenpole。您所说的选择修改“不可预测性”是正常行为:http://help.adobe.com/en_US/flash/cs/extend/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7f91.html