4

版本flash 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

如果我没记错的话 - JSFL,就像大多数 JavaScript 语言实现一样,是一种基于原型的语言。这意味着,您可以向现有的内置对象添加新的属性/方法。理论上,您可以使所有库项目都具有与 @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 中的所有对象,特别是在 for..in 迭代中抬起它丑陋的头。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);

使用 getter 还可以保护您免受我刚才提到的 for..in 问题的影响。

于 2011-10-24T10:57:56.013 回答