如何在Adobe InDesign中使用app.selection [0]作为脚本

时间:2015-04-28 01:08:04

标签: javascript adobe 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]相同,在这种情况下,它将是多余的(并且不正确)

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

然而,不同页面项目上的相同概念就像魅力一样。跟随它是非常令人费解的。此外,似乎无法确定该项目是什么类型的对象。我想说点:

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

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

2 个答案:

答案 0 :(得分:4)

app.selection返回一个对象数组,因此数组中的每个项目可以是不同的类型,并且它可用的属性和方法会有所不同。使用Extendscript Javascript控制台时,您只需键入

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

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

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

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

此时,您将了解更多可以访问的属性,具体取决于类型。

要回答问题的第二部分,没有allTextFrames属性,但有一个allPageItems属性。这将返回一个pageItems数组(textFrames,groups等),您可以像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())。

答案 1 :(得分:0)

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

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

然后,如果您选择了一个或多个项目,则可以通过索引

来访问这些对象

sel [0] //返回数组的第一项。 Javascript从零开始计数。

如果您说访问,例如sel [4]并且选择计数少于5个项目或列5为空,那么您将获得未定义的值。所以你需要在使用之前仔细检查选择项的有效性,并且永远不要假定它会返回一些东西。

HTH,

卢瓦克 http://www.ozalto.com