массовое переименование элементов флеш-библиотеки с помощью jsfl - PullRequest
4 голосов
/ 21 февраля 2011

версия 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'sпуть к папке - LIBRARY / FolderA / FolderB / Level1
  • Вместо этого я получаю
  • ABC_FolderA-FolderB-Level1

, возможно, я мог бы закодироватькакой-то синтаксический анализатор строк вроде этого,

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

но это действительно ужасно и не сработало бы, если бы элементы библиотеки уже содержали "-".«Уровень-1», например,

, так что я думаю, что я надеюсь на другой способ получить доступ к name , который возвращает только имя и , а не путь

Ответы [ 3 ]

8 голосов
/ 26 февраля 2011

Это сложно, потому что когда вы получаете имя, это полный путь, но когда вы устанавливаете имя, это просто имя элемента (а не путь).Вы должны отделить имя и папку перед объединением.Таким образом, нет «чистого» способа сделать это, хотя написание функции может сделать ее более читабельной:

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

Затем задайте имя элемента таким образом:

 item.name = "ABC_" + getItemName(item);
1 голос
/ 01 марта 2011

Если я не ошибаюсь - 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 в целом.В идеале вы просто хотите запустить первый фрагмент этого фрагмента ОДИН РАЗ (определения методов), поскольку они будут сохраняться до тех пор, пока работает ваша Flash IDE.

0 голосов
/ 24 октября 2011

Добавление свойств в JSFL возможно, но вы никогда не должны добавлять свойства к собственным прототипам, так как это изменит ВСЕ объекты во Flash, в частности, поднимая его уродливую головку для… в итерации.IK Tools от Adobe фактически используют цикл 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);

Использование методов получения также защищает вас отза ... в вопросе, который я только что упомянул.

...