Javascriptを使ってiMacrosを動かしているときに、stopボタンを押してもプログラムが動作し続けていることはありませんか?この原因はプログラムの書き方にあります。
Stopボタンを押しても動作が続いている
TAGコマンドの説明で作った連続してクリックするプログラムですが、実は下の動画のように、途中でStioボタンを押しても動作し続けることがあります。
プログラムの内容
もう一度リンクを連続してクリックするプログラムを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var macro = "CODE:"; macro += "URL GOTO=http://b.hatena.ne.jp/ranking \n"; iimPlay(macro); for(var i = 1; i <= 10; i++) { var macro = "CODE:"; macro += "TAB T=1 \n"; macro += "TAG POS=" + i + " TYPE=A ATTR=class:entry-link \n"; macro += "WAIT SECONDS=2 \n"; macro += "TAB T=1 \n"; iimPlay(macro); } |
このプログラムはJavascriptのFor文を使って、iMacrosのクリックするプログラムを10回実行させる処理ですね。図で書くとこんな感じです。
Stopで停止する場所
このプログラムはJavascriptの部分はすぐに実行されるのですが、iMacrosの部分はブラウザの処理を行なっているので時間がかかっています。Stopを押したタイミングはこのiMacrosが実行されているタイミングであることがほとんどです。
つまり、Stopを押して停止するプログラムは、上の図の右側:iMacrosの箇所です。そして、そのiMacrosが停止すると左のJavascriptに戻って次のiMacrosのプログラムが実行されます。
Stopを押してもプログラムが停止しなかった原因
何回もプログラムを押してもプログラムが停止しなかったのは、Javascript側で次のiMacrosが実行されていたからです。
今回のプログラムは指定回数を繰り返しFor文だったので、iMacrosのプログラムが10回繰り返されるまでStopを押すと処理が停止します。これが例えば繰り返しをずっと行うWhile文のようなものだと、Stopを何回押してもとプログラムが止まらなくなるので注意が必要です。
Stopを押してプログラムを止めるためには
Stopボタンが押されたということをプログラムが認識して、繰り返し処理を停止させる必要があります。
iMacrosプログラムを実行するiimPlay()関数
ここでiMacrosのiimPlay()関数を見てみましょう。Javascriptで使う場合は次のように書きます。
var ret_code = iimPlay ( String macro [, int timeout] );
この書式のように、iimPlay関数は変数 ret_code に何か戻り値を戻していますね。実はこの戻り値にはエラーコードが入ります。このエラーコードとは、このページに記載されている番号のことです。実はユーザーがStopを押した時もエラーが出力されます。
Stopを押した時のエラーコード
先ほど停止したプログラムのエラー出力を見ると、 ” Error code: -101 ” と記載されています。ということでこの番号を判断して、繰り返し文を停止させるようにすれば、プログラムを停止させることが出来ます。
For文を停止させる
for文など繰り返し処理を停止させるには、繰り返し処理文に何かラベルをつけて、そのラベルをbreak文で指定するようにします。
例えば、For文で変数 i が3になったら、For文の繰り返しを停止するプログラムは次のようになります。ここでは “loop” というラベルを使っていますね。
1 2 3 4 5 6 7 |
loop:(var i = 0 ; i < 10; i++) { if(3 == i) { break loop; } } |
Stopを押して処理が停止するプログラム
iimPlay()の戻り値が “-101” の時にFor文を停止するプログラムを追加します。元のプログラムから次の様に変更を追加しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var macro = "CODE:"; macro += "URL GOTO=http://b.hatena.ne.jp/ranking \n"; iimPlay(macro); repeat:for(var i = 1; i <= 10; i++) { var macro = "CODE:"; macro += "TAB T=1 \n"; macro += "TAG POS=" + i + " TYPE=A ATTR=class:entry-link \n"; macro += "WAIT SECONDS=2 \n"; macro += "TAB T=1 \n"; var ret_code = iimPlay(macro); if(-101 == ret_code) { break repeat; } } |
変更しているのは以下の3点ですね。
- For文にラベル:repeatを追加する(6行目)
- iimPlay関数の戻り値を変数:ret_code で受け取るようにする(13行目)
- ret_codeが “-101” であるときに、For文を停止させる(14行目から17行目)
このようにすればStopボタンを押した時に、プログラムをしっかりと停止させることができますよ。