如何在 Adob​​e InDesign 中为脚本使用 app.selection[0]

How to use app.selection[0] for scripts in Adobe InDesign

我想 运行 通过仅测试当前选择(而不是整个文档)来编写代码,但我很难理解数组 "app.selection" 及其方法的确切工作原理。首先,我使用 "for" 循环循环通过使用以下方法选择的每个项目:

for(loop = 0; loop < app.selection.length; loop++){
    var sel = loop;
}

这工作正常,但是当我想确定每个项目是什么时,它变得有点奇怪。例如,

for(txt = 0; txt < app.selection[sel].textFrames.length; txt++){
    // do something to each text frame in the selection here.
}

没有按预期工作,但是

for(img = 0; img < app.selection[sel].allGraphics.length; img++){
    // do something to each graphic in the selection here
}

似乎工作正常,无论选择包括的不仅仅是图形本身,还是在组内还是组外。

有时,似乎 app.selection[0] 是访问项目本身的唯一途径。换句话说,如果选择了一个文本框,app.selection[0] 可能与 app.document.textFrames[0] 相同,在这种情况下说 [=16= 是多余的(而且是不正确的) ]

app.document.textFrames[0].textFrames[0]

然而,不同页面项目上的相同概念却很有魅力。令人费解的是。此外,似乎无法确定该项目是哪种对象。我想说的是:

if (app.selection[0] == [object TextFrame])

但这似乎对我不起作用。有没有办法清楚地测试当前项目是组、图形还是文本框,并根据结果做不同的事情?

App.selection 确实是一个数组,每个项目都可以通过其索引访问:

var sel = app.selection //在没有打开文档时可能为空!打开文档时没有选择的空数组。选择情况下的一到n长度数组。

然后假设您选择了一个或多个项目,您可以通过其索引找到这些对象

sel[0] //这个return是数组的第一项。 Javascript 从零开始计数。

一旦说如果你访问,说 sel[4] 并且选择计数少于 5 个项目或第 5 列为空,那么你会得到一个未定义的值。所以你需要在使用之前仔细检查选择项的有效性,不要认为它会 return 东西。

HTH,

洛伊克 http://www.ozalto.com

app.selection returns 一个对象数组,所以数组中的每一项都可以是不同的类型,它可用的属性和方法也会不同。使用 Extendscript Javascript 控制台时,您只需键入

即可查看数组中的特定项目。
app.selection[0]

(或任何数字)。结果将类似于 [object TextFrame].

在遍历选择数组时,您可以使用 app.selection[0].constructor.name 来确定每个数组的类型。或者,如果您只对某些类型感兴趣,

if (app.selection[i] instanceof TextFrame){}

届时您将了解更多有关您可以访问哪些属性的信息,具体取决于类型。

要回答问题的第二部分,没有 allTextFrames 属性,但是有 allPageItems 属性。这是一个 returns 页面项(textFrames、组等)数组,您可以像 app.selection 一样使用它。因此,如果我在文档的第一页上分组了三个文本框(除此之外别无其他),我可以看到以下内容都是正确的:

app.activeDocument.pages[0].textFrames.length == 0;
app.activeDocument.pages[0].allPageItems.length == 4;
app.activeDocument.pages[0].allPageItems[0] instanceof Group;
app.activeDocument.pages[0].allPageItems[1].constructor.name == "TextFrame";

因此,如果它比 textFrames 集合对您更有用,您可以循环访问该数组。请记住,您无权访问 TextFrames 的特殊集合属性(如 everyItem())。