我之前使用#targetengine
的唯一体验是,当我在InDesign中编写脚本时,我使用#targetengine "session";
将对话框转换为调色板。但是当我试图找出如何编写菜单脚本时,我开始看到它弹出以其他方式使用并使用session
以外的术语(目标?)。
Adobe喜欢假设每个想要编写脚本的人有时都是经验丰富的程序员,所以我没有找到关于这是什么的明确解释。
所以,当我使用#targetengine
时,我在做什么?我可以使用"session"
以外的任何术语吗?一些搜索建议此功能与全局变量有关;那是这样吗?如果是这样,如何在不重新启动InDesign的情况下清除它们?这是JavaScript事物还是ExtendScript / InDesign功能?
答案 0 :(得分:26)
#targetengine
特定于InDesign,PhotoShop,Illustrator等中的Adobe脚本 - 它不是一般的Javascript功能。
它指定了如何处理所有全球性的东西' - 不仅是变量,还有函数声明和全局状态的任何其他变化。
如果您使用默认的' main'引脚所有全局变量在脚本完成后立即消失。如果您使用'会话'只要主机应用程序继续运行,所有全局变量都会被保留。这意味着如果您运行脚本:
#targetengine "session"
var test = "test";
然后运行脚本:
#targetengine "session"
alert(test);
您会收到一个消息框,显示test
而非提供错误
除了两个标准'主要'和'会话'您可以使用任意名称创建自己的引擎 - 因此,如果您运行脚本
#targetengine "mine"
var test = "another test";
然后运行
#targetengine "mine"
alert(test);
您会看到一个显示another test
的消息框,但如果您再次运行
#targetengine "session"
alert(test);
你仍然得到test
:有两种不同的测试'全局变量,一个在'会话'引擎和一个(新创建的)' mine'之一。
答案 1 :(得分:1)
此讨论在我监控的Slack频道中进行。一位长期的开发人员说了以下内容(为清楚起见,进行了一些清理):
据我所知
//@targetengine
仅适用于InDesign(可能 包括InCopy)和Illustrator。在InDesign上它可以正常工作,而在Illustrator上则不能。不过,据我所知,其他所有应用程序都可以将目标引擎与C ++一起使用,这就是CEP对每个具有独立引擎的CEP [扩展名]所做的工作。
至少有3种类型的引擎。
- 像
main
引擎,在InDesign中是一个临时引擎,在完成脚本执行后会忘记所有内容。Public Private
这样的
session
引擎会记住脚本执行后并保持活动状态,对事件侦听器很有用。这些和main
可以使用$.engineName
进行标识,并可以在ESTK / vsCode中找到
Private Private
$.engineName
将显示""
只能用C ++创建,除了InDesign中CEP使用Public Private
以外,大多数应用程序和CEP都使用可以选择的引擎。
他认为还有第四种被他遗忘的类型。