版本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
我可能会编写某种字符串解析器,就像这样,
item.name =“ABC _”+ item.name.substr(item.name.lastIndexOf(“ - ”),99)
但是这真的很难看,如果库项目已经包含“ - ”,那就不行了。例如“Level-1”
所以我想我想要的是一种不同的方式来访问名称,它只返回名称而不是路径
答案 0 :(得分:8)
这很棘手,因为当你获取这个名称时,它就是完整路径,但是当你设置这个名字时,它只是项目名称(而不是路径)。在连接之前,您必须分隔名称和文件夹。因此,没有“干净”的方法来做到这一点,尽管编写一个函数可能会使它更具可读性:
function getItemName(item) {
return item.name.split("/").pop();
}
然后设置项目的名称:
item.name = "ABC_" + getItemName(item);
答案 1 :(得分:1)
如果我没有误会 - JSFL就像大多数JavaScript语言实现一样,是一种基于原型的语言。这意味着,您可以向现有内置对象添加新属性/方法。理论上,你可以使所有的库项目都有一个“getShortName()”方法,就像@Justin Putney的解决方案一样。
有些事情:
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正在运行,它们就会持续存在。
答案 2 :(得分: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还可以保护您免受我刚才提到的问题。