4

バージョン フラッシュ cs5

わかりましたので、選択したすべてのライブラリ項目の名前を変更する一般的なコードを知っています

var items = fl.getDocumentDOM().library.getSelectedItems();
for (var i=0; i<items.length; i++){
var item = items[i];
item.name = "ABC_"+item.name;
}

しかし、ライブラリ アイテムがフォルダにある場合、これでは十分ではありません... item.name はフル パスを返しますが、item.name は名前を設定するためです。oO 他の誰かがここで指摘しているように、http://forums.adobe.com/message/107718

  • Level1の名前をABC_Level1に変更しようとすると
  • Level1 のフォルダー パスが LIBRARY/FolderA/FolderB/Level1 の場合
  • 私は代わりにこれを手に入れます
  • ABC_FolderA-FolderB-Level1

おそらく、このような文字列パーサーをコーディングできます。

item.name = "ABC_"+item.name.substr(item.name.lastIndexOf("-"), 99)

しかし、それは本当に見苦しく、ライブラリ項目にすでに「-」が含まれていると機能しません。たとえば「レベル1」

だから私が望んでいるのは、パスではなく名前だけを返す名前にアクセスする別の方法だと思います

4

3 に答える 3

8

名前を取得するときは完全なパスですが、名前を設定すると、それは単なるアイテム名 (パスではない) になるため、注意が必要です。連結する前に、名前とフォルダーを分離する必要があります。したがって、関数を書くと読みやすくなるかもしれませんが、それを行うための「クリーンな」方法はありません。

function getItemName(item) {
   return item.name.split("/").pop();
}

次に、アイテムの名前を次のように設定します。

 item.name = "ABC_" + getItemName(item);
于 2011-02-26T03:12:49.117 に答える
1

私が誤解していなければ、ほとんどの JavaScript 言語実装と同様に、JSFL はプロトタイプベースの言語です。つまり、新しいプロパティ/メソッドを既存の組み込みオブジェクトに追加できます。理論的には、@Justin Putneyのソリューションと同じように、すべてのライブラリアイテムに「getShortName()」メソッドを持たせることができます。

次のようなもの:

Object.prototype.addMethod = function(name, pMethod) {
  this.prototype[name] = pMethod;
}

Function.prototype.addMethod = function(name, pMethod) {
  this.prototype[name] = pMethod;
}

Object.addMethod( "getShortName", function() {
  return this.name.split("/").pop();
});

/*
  NOTE: SymbolItem.addMethod was causing a bug, so Object, although it's generic,
  seems like the best choice.
*/

fl.trace( fl.getDocumentDOM().library.items[0].getShortName() );

これにより、一般的に JSFL の機能を拡張する便利な方法が実現します。理想的には、このスニペットの最初のビット (メソッド定義) を一度だけ実行する必要があります。これは、Flash IDE が実行されている限り保持されるためです。

于 2011-03-01T19:14:32.560 に答える
0

JSFLにプロパティを追加することは可能ですが、ネイティブプロトタイプにプロパティを追加しないでください。これにより、Flash内のすべてのオブジェクトが変更され、特にその醜い頭が繰り返しになります。AdobeのIKツールは、実際にはfor..inループを内部で使用しますが、forループを使用する必要があります。Object.prototypeを拡張するとすぐにこれに気付くでしょう...ステージを操作すると、出力パネル(CS4)がエラーでいっぱいになり始めます!

私のテストでは、Itemを拡張できませんでした(おそらく内部的に抽象クラスであるためですか?)が、SymbolItemを拡張することはできました(他のすべてのItemバリアントも拡張する必要があります):

SymbolItem.prototype.__defineGetter__('shortName', function(element){ return this.name.split('/').pop(); })
SymbolItem.prototype.__defineGetter__('path', function(element){ return this.name; })

trace(fl.getDocumentDOM().library.items[0].shortName);

ゲッターを使用すると、先ほど触れたfor..inの問題からも保護されます。

于 2011-10-24T10:57:56.013 に答える