0

Flash CS5 の JSFL でスクリプトを書いています。メイン タイムラインからレイヤーのリストを取得しようとしています。タイムラインを取得し、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 を拡張して、Adobe IK ツールがエラーを吐き出すのを見てください!)

JSFL (Spidermonkey JavaScript エンジンを使用) で配列をループする最もクリーンな方法は次のとおりです。

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

PS。@cwallenpole。あなたが話す選択変更の「予測不可能性」は通常の動作です:

于 2011-10-20T22:03:53.357 に答える