使用jsfl批量重命名flash库项目

版本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设置名称。 o.O正如别人在这里指出的那样,http://forums.adobe.com/message/107718 所以当我尝试将Level1重命名为ABC_Level1时 如果Level1的文件夹路径是LIBRARY / FolderA / FolderB / Level1 我得到了这个 ABC_FolderA-FolderB中-1级 我可能会编写某种类似的字符串解析器, item.name =“ABC _”+ item.name.substr(item.name.lastIndexOf(“ - ”),99) 但这真的很难看,如果库项目已经包含“ - ”,那就行不通了。例如“Level-1” 所以我想我想要的是一种不同的方式来访问返回名称而不是路径的名称     
已邀请:
这很棘手,因为当你得到名字时它就是完整的路径,但是当你设置名称时,它只是项目名称(而不是路径)。在连接之前,您必须分隔名称和文件夹。因此,没有“干净”的方法来做到这一点,尽管编写一个函数可能会使它更具可读性:
function getItemName(item) {
   return item.name.split("/").pop();
}
然后设置项目的名称:
 item.name = "ABC_" + getItemName(item);
    
如果我没有误会 - 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中扩展功能的简便方法。理想情况下,您只想运行此代码段ONCE的第一部分(方法定义),因为只要您的Flash IDE运行它们就会持续存在。     
在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还可以保护您免受我刚才提到的问题。     

要回复问题请先登录注册