不管你是否称其为大师,我实际上也对此感到困惑。但是您自己的观察是正确的!
...是否有可能因为菜单中有两个“导入 XML ...”实例(一个在“文件”下,另一个在“结构”窗口的下拉菜单中)都被调用?
这确实是正确的。从集合xx.item(yy)
中检索一个或多个项目。来自Marc Autret 的博客:
最大的秘密是上述方法实际上都没有返回任何元素。. . 除了将“元素”理解为对象说明符。
您得到的是对“多个对象”的引用,是的,有两个名为“导入 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 对象的引用,因此您可以在导入后立即对其进行后处理。