javascript - Indesign Script 确实起作用了两次

标签 javascript adobe-indesign extendscript xml-import

我正在组装一个脚本来自动生成不同版本的报告。该脚本将首先导入 XML 文件,然后运行一些其他功能来整理 Indesign 项目。

当我运行这个脚本时,

var myMenuAction = app.menuActions.item("Import XML...");
myMenuAction.invoke();

“导入 XML”对话框打开并要求我选择要导入的 XML 文件,单击“打开”后弹出“XML 导入选项”框。到目前为止,一切都很好。但是在我单击“确定”后,“导入 XML”框再次弹出。

这不是一个真正关键的问题,如果我第一次选择我想要的文件和我想要的选项,无论我再次选择它们还是点击“取消”似乎都没有什么区别,所以脚本仍然按照我的意愿执行,只是看起来不太整洁。

所以我的问题是我需要做什么才能只获得一轮导入 XML 对话框?

最佳答案

无论是否宣称为 Guru,我实际上也对此感到困惑。但是您自己的观察是正确的!

... is it possible that because there are two instances of "Import XML..." in the menus (one under File, the other in the dropdown menu in the Structure window) that both are being invoked?

确实是这样。 xx.item(yy)集合 中检索一个或多个 项目。来自 Marc Autret's blog :

The big secret is that none of the above methods actually returns any element. . . except to understand an 'element' as an object specifier.

您得到的是对“多个对象”的引用,是的,有两个名为“导入 XML...”的菜单。很难说服 InDesign 显示有两个; myMenuAction.length 不起作用(它"is"单个元素,因此没有长度),并且 myMenuAction.constructor.name 显示 [Object MenuAction] -- 同样,对于单个元素。但是,alert (myMenuAction.name); 最终显示了(非)预期的输出:

alert box showing two menus

为了找出如何调用 just one 花费了大量遍历 DOM 的时间。我选择定位"file"->“导入 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 对象的引用,因此您可以在导入后立即对其进行后处理。

关于javascript - Indesign Script 确实起作用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997252/

相关文章:

javascript - Illustrator - 在文本路径脚本中批量插入文件名会使 Illustrator 崩溃

javascript - 在 InDesign CC 2017 javascript 中,使用 eventListener "afterOpen"时,如何避免警告 "No documents are open."?

javascript - express JS : Handlebars "each" tag not displaying content

javascript - 在 Adob​​e InDesign 中使用 peerjs

javascript - 如何在插画脚本中将 CMYK 转换为 RGB?

javascript - 什么是#targetengine?

javascript - 请建议使用 jest 对这两个功能进行单元测试的正确方法

javascript - 如何让代码等待 Node js中的函数返回

javascript - Chrome 扩展程序可替换 Gmail 聊天中的文本

javascript - 使用 ExtendScript 访问内部预合成层