0

我正在用 JSFL 为 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 不支持 for...in 吗?这有点奇怪,因为它似乎只是一个 JavaScript 引擎。

4

2 回答 2

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

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

于 2011-07-09T02:58:41.687 回答
5

永远不要使用 for..in 遍历数组,因为它是为对象枚举而设计的。只需要另一个脚本来修改 Array.prototype 和你的 for..in 中断(如果你不相信我,扩展 Object.prototype 并观察 Adob​​e IK 工具开始吐出错误!)

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

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

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

于 2011-10-20T22:03:53.357 回答