#targetengine是什么?

9
我以前只接触过在InDesign脚本中使用#targetengine "session";将对话框转换为调色板的经验。但是,当我试图编写一个菜单脚本时,我发现它还可以用其他方式,并且使用了一个与session不同的术语(target?)。

Adobe有时会认为每个想要编写脚本的人都是经验丰富的程序员,因此我没有找到清晰的解释。

因此,当我使用#targetengine时,我在做什么?我可以使用除"session"之外的任何术语吗?一些搜索建议这个功能与全局变量有关;是否如此?如果是,如何清除它们而无需重新启动InDesign?这是JavaScript还是ExtendScript/InDesign的功能?


1
每个想要编写脚本的人都是程序员。嗯...然而,Adobe的"Javascript"丑陋无比。Meh. - Jared Farrish
我是一名平面设计师,需要时会编写代码,但并非程序员,因此很多时候我感觉他们做出的假设我并不了解。 - Brendan
我建议你如果想学习JavaScript的话,可以去找一本相关的书籍。 - Brad
@Brad,我对JavaScript有一定的了解;我制作网页已经好几年了,并且在InDesign中编写了许多脚本。我只是想在这里扩展我的技能,但卡在了这个点上。通常情况下,JS在网上有很好的文档,但由于较少的人为ID编写脚本,一些功能很难通过在线搜索了解。哪本JavaScript书可以帮助我更多地了解#targetengine - Brendan
2
你读过这个这个了吗?它似乎是一个标志,告诉Javascript引擎在你打开InDesign的整个时间内保持该变量在引号中。就像一个“会话”级别的值。 - Jared Farrish
显示剩余2条评论
2个回答

31

#targetengine 是 Adobe InDesign、PhotoShop、Illustrator 等脚本中的特定概念,它不是通用的 JavaScript 功能。

它指定了如何处理所有全局“东西”——不仅包括变量,还包括函数声明和对全局状态的任何其他更改。

如果使用默认的“main”引擎,所有全局变量都会在脚本完成后消失。如果使用“session”引擎,只要主机应用程序保持运行状态,所有全局变量就会被保存下来。这意味着,如果运行此脚本:

#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:有两个不同的“test”全局变量,一个在“session”引擎中,另一个在(新创建的)“mine”引擎中。


1
很抱歉,Photoshop不支持#targetengine,所有内容都在同一个引擎中运行 - 在未声明的情况下,在“main”引擎中警报“test”会导致错误,否则#targetengine将被忽略。JavaScript工具指南CC本身表示这是InDesign和Illustrator的专属功能,但我被告知PremierePro也有它。 - Davide Barranca
我更正之前的说法:InDesign和Illustrator仅支持#targetengine,PremierePro不支持。 - Davide Barranca

2
这个讨论是在我监控的Slack频道上提出的。一位资深开发人员如下所述(为了清晰起见进行了整理):
“据我所知,//@targetengine仅适用于InDesign(可能包括InCopy)和Illustrator。”
“InDesign上可以正常工作,而Illustrator上则无法正常工作。不过,就我所知,其他应用程序都有能力使用带有C++的targetengines,并且CEP会为每个CEP[扩展?]提供其自己的隔离引擎。”
“至少有三种类型的引擎。”
1. “main” 引擎,在InDesign中它是一个临时引擎,在完成脚本执行后会忘记所有内容。
2. “Public Private” 引擎,比如session,可以在脚本执行后记住并保持活动状态,非常适合事件监听器。这些和主要的引擎都可以使用$.engineName进行识别,并在ESTK / vsCode上找到。
3. “Private Private” $.engineName将显示“”,只能使用C++创建,这是大多数应用程序使用的方式,也是CEP除了InDesign之外使用的方式。在InDesign中,CEP使用可以选择的“Public Private”引擎。
他认为还有第四种类型,但他忘记了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接