Провозглашен Гуру или нет, меня это тоже смутило. Но вы правильно поняли со своим наблюдением!
... возможно ли, что из-за того, что в меню есть два экземпляра «Импорт XML ...» (один в разделе «Файл», другой в раскрывающемся меню в окне «Структура»), оба вызываются?
Это действительно правильно. xx.item(yy)
извлекает один или несколько элементов из коллекции. Из блога Марка Отре:
Большой секрет в том, что ни один из вышеперечисленных методов фактически не возвращает какой-либо элемент. . . за исключением понимания «элемента» как спецификатора объекта.
Вы получаете ссылку на «несколько объектов», и да, есть два меню под названием «Импорт XML...». Довольно сложно убедить InDesign показать, что их два; myMenuAction.length
не работает (это "один элемент", поэтому он не имеет длины), а myMenuAction.constructor.name
показывает [Object MenuAction]
-- опять же, для одного элемента. Однако alert (myMenuAction.name);
, наконец, показывает (не)ожидаемый результат:
Потребовалось удивительно много обхода DOM, чтобы узнать, как вызывать только один. Я выбрал «Файл» -> «Импорт XML ...», и это то, что нужно:
var myMenu = app.menus.item("Main");
var fileMenu = myMenu.menuElements.item("File");
alert (fileMenu.menuItems.everyItem().name);
var myXmlMenu = fileMenu.menuItems.item("Import XML...");
alert (myXmlMenu.name);
myMenuAction = myXmlMenu.associatedMenuAction;
alert (myMenuAction.name);
myMenuAction.invoke();
Вы можете не включать оповещения, если хотите использовать это. Имейте в виду, что эти строки не в их локализуемых формах — этот пример будет работать только в InDesign на английском языке, но не при использовании другого языка интерфейса.
Лучший способ — по возможности избегать вызова меню. В этом случае вы, вероятно, можете безопасно заменить свой код следующим:
folder = Folder.myDocuments;
if (File.fs == "Windows")
myFile = folder.openDlg( 'Load XML', "XML files,*.xml;All files:*.*", false);
else
myFile = folder.openDlg( 'Load XML', function(file)
{
return file instanceof Folder ||
(!(file.hidden) && file.name.match(/\.(xml)$/i));
}, false );
}
if (myFile)
xml = app.activeDocument.importXml(myFile);
Несколько преимуществ заключаются в том, что он не зависит от локали; вы можете настроить диалоговое окно «Открыть» так, чтобы оно запускалось в другой папке (например, в той, в которой сохранен ваш текущий документ) и использовать другие или несколько файловых фильтров; вы можете импортировать свой XML в текущий документ или прямо в существующий элемент (версия скрипта «Импортировать в выбранный элемент» в диалоговом окне «Импорт XML»); вы получаете ссылку на только что загруженный XML-объект, поэтому вы можете сразу после импорта обработать его.
person
Jongware
schedule
19.04.2014
app.activeDocument.importXMl
? Кроме того, что делает этот вызов второго меню? (Догадываюсь, я бы сказал, что он также пытается импортировать.) Пожалуйста, покажите больше своего кода. - person Jongware   schedule 11.04.2014