IEのビジー状態、オブジェクトの状態を取得(busy, readyState)_InternetExplorer
Warning: Use of undefined constant full - assumed 'full' (this will throw an Error in a future version of PHP) in /home/hikarujyouho/hikarujyouhou.com/public_html/wp-content/themes/giraffe/single.php on line 49

スポンサーリンク
コンテンツ(CONTENT)
IEのビジー状態、オブジェクトの状態を取得(busy, readyState)
InternetExplorerがビジー状態なのか、
操作可能な状態なのかを判別します。
IE.busy = True / False・readyState
IE.readyState = 0~4
・True・・・ビジー状態である
・False・・・ビジー状態ではないreadyState
・0・・・初期化未完了状態(READYSTATE_UNINITIALIZED)
・1・・・ロード中状態(READYSTATE_LOADING)
・2・・・ロード完了状態(READYSTATE_LOADED)
・3・・・操作可能状態(READYSTATE_INTERACTIVE)
・4・・・全データ読込完了状態(READYSTATE_COMPLETE)
ビジー状態とは、オブジェクトの状態とは?
IE.navigate(URL)で、指定のURLにアクセスできることは既に説明しました。
しかし、URLを指定しアクセスしたからと言って、直ぐにデータが使用できるとは限りません。
インターネットの回線が重かったり、ページのデータ(画像とか)がたくさんあったりする場合、
ページにアクセスしてもなかなか表示がされませんよね。
そんな状態で次の処理を行ったらどうなるでしょう。
ページの読込が全部終わってないのに、「××のデータを××して」と
スクリプトに命令があっても、「そんなデータはページにないよ(本当はあるけど、まだ読込が終わってない)」
とエラーが返ってしまうことになりかねません。
ページの読込が終わるまで待つにはどうしたらよい?
例えば、UWSCのSLEEP(20秒)等、長めに待ってみましょうか。
でもそれってすごく不安定な処理ですよね。
回線やページの重さっていつも一定ではないです。
指定時間より長くかかってエラーになったり、
逆にあっという間に終わってしまい、余計な時間待たされたりすることも。
そこで、IEの状態を取得し、「読込状態」が終わったら次の処理に移るという、
スマートな処理にする方法を使いましょう。
※SLEEPも使いますが最短0.1秒でOK
IE = CREATEOLEOBJ( "InternetExplorer.Application" ) |
IE.visible = True |
IE.navigate( "http://canal22.org" ) |
REPEAT |
//0.1秒待つ |
SLEEP(0.1) |
UNTIL !IE.busy AND IE.readyState = 4 |
MSGBOX( "読込完了!" ) |
どうでしょうか。
実際にページにアクセスしても、
画像などを読み込んだりしているため、きちんと待機していることが分かります。
全ての読み込みが終わったら「読込完了!」のメッセージが表示されます。
busyとreadyStateは何を表す?
busyは英語のビジーです。
オブジェクトが何か別の処理をしていて、「ビジー状態」のときはIE.busyはTrueを返します。
readyStateはオブジェクトがデータを読込しているときの状態を数値で返します。
「0」は「まだ初期化すらしてないよ」という状態、
「1」は「読込中」、「2」は「読込<は>終わった」状態です(読込だけは終わった状態)
「3」は更に一歩進んで、とりあえず「操作はできますよ」という状態です。
砂時計とカーソルの両方が出ているアイコンが出ている状態と思えばOKです。
そして読込は全て完了、自由に操作もできますよという状態が「4」です。
と言うわけで、ループ文の条件は下記の意味となります。
!IE.busy //IE.busy = Falseと同じ。つまり「ビジー状態」じゃ無くなったらという意味 |
IE.readyState = 4 //読込完了した状態 = 4になったら、という意味 |
ビジー状態とオブジェクトの状態の遷移を見てみよう
それでは、ビジー状態とオブジェクトの状態の遷移を見てみましょう。
以下のスクリプトは2つのIEオブジェクトを立ち上げ、状態の遷移をPRINTしています。
なお、待機状態を判別するループ文はWHILE-WENDでも実現可能ですので
そのパターンも書いてみました。
両者の違いを比べてみるのもいいでしょう。
スクリプトは以下のようになります。
IE = CREATEOLEOBJ( "InternetExplorer.Application" ) |
IE.visible = True |
PRINT "1番目のページにアクセス" |
IE.navigate( "http://canal22.org" ) |
REPEAT |
SLEEP(0.1) |
PRINT "IE.busy=" + IE.busy |
PRINT "IE.readyState=" + IE.readyState |
UNTIL !IE.busy AND IE.readyState = 4 |
PRINT "IE.busy=" + IE.busy |
PRINT "IE.readyState=" + IE.readyState |
PRINT "----------" |
PRINT "2番目のページにアクセス" |
IE.navigate( "http://canal22.org/kansu/" ) |
WHILE IE.busy OR IE.readyState <> 4 |
SLEEP(0.1) |
PRINT "IE.busy=" + IE.busy |
PRINT "IE.readyState=" + IE.readyState |
WEND |
PRINT "IE.busy=" + IE.busy |
PRINT "IE.readyState=" + IE.readyState |
どうでしょうか。
1番目、2番目のページにアクセスした際のbusy状態、readyState状態の遷移がバッチリ分かれば幸いです。
1番目のページにアクセス |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=4 |
IE.busy=True |
IE.readyState=4 |
IE.busy=True |
IE.readyState=4 |
IE.busy=True |
IE.readyState=4 |
IE.busy=True |
IE.readyState=4 |
IE.busy=False |
IE.readyState=4 |
IE.busy=False |
IE.readyState=4 |
---------- |
2番目のページにアクセス |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=1 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=True |
IE.readyState=3 |
IE.busy=False |
IE.readyState=4 |
IE.busy=False |
IE.readyState=4 |
http://canal22.org/advance/ie/ie-busy-readystate/
スポンサーリンク