如何在 Adobe 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,
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())。
我想 运行 通过仅测试当前选择(而不是整个文档)来编写代码,但我很难理解数组 "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,
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())。