2010年7月30日金曜日

そのループ、InDesignのPageItemsに使っちゃだめだよ!

for (var i = 0, elem; elem = elems[i]; i++) { doSomething(elem) }って書き方見やすくていいな - JavaScriptとかPerlとかPHPとかさくらとか勉強する

上記のページで、こういう書き方が紹介されていた。
var paragraphs = document.getElementsByTagName('p');
for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) {
doSomething(paragraph);
}

へーへーへー、さっそくやってみよう、ということで。
InDesignで、てきとうに2つ3つオブジェクトを置いたドキュメントを作り
var items = app.activeDocument.pageItems;
for (var i = 0, item; item = items[i]; i++) {
$.writeln(item);
}
と、やってみた。
……無限ループ発生。

なにが起こってるのか理解できなかったので、
$.writeln(items[100])
とかやってみたら、falseもエラーも返さない。
なるほど、pageItemsとか、InDesignのコレクションはただindexで引くだけじゃ、存在してなくてもfalseを返さないのか。pageItemsだけでなくtextFramesやpathItemsでも同じ。これじゃループ抜けられないわな……。

あ、そうか、要は配列でくればいいのかな?と思い
var items = app.activeDocument.pageItems.everyItem().getElements();
for (var i = 0, item; item = items[i]; i++) {
$.writeln(item);
}
これなら上手くいく。よし。

どちらにしろpageItemsへのアクセスは遅いし、ループさせるならいったん配列にした方が無難みたいです。

0 件のコメント: