我正在用JSFL为闪存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引擎。
发布于 2011-07-09 10:58:42
哇哦。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-10-21 06:03:53
不应该使用for..in遍历数组,因为它是为对象枚举而设计的。只需使用另一个脚本来修改Array.prototype和for..in中断(如果您不相信我的话,请扩展Object.prototype并观察Adobe IK工具开始输出错误!)
在JSFL中循环数组的最干净的方法(它使用Spidermonkey引擎)是:
for each(var layer in layers)
{
fl.trace(layer.name);
}PS。@cwallenpole。您所说的选择修改“不可预测性”是正常行为:http://help.adobe.com/en_US/flash/cs/extend/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7f91.html
https://stackoverflow.com/questions/6632389
复制相似问题