我正在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引擎。
答案 0 :(得分:5)
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