Home Notices Documents Classes Download Others Rice
Documents  >  tutorial  >  基本の使用法  >  スクリプトの統合
Loadイベント

このセクションの目的

前のセクションまでで、ぺージの表示、JavaScriptコードをRiceから呼び出す方法を別個のスクリプトでとして実装しました。ここでは、これらの別個のスクリプトを一つにまとめます。

そして、二つのスクリプトの統合に必要なLoadイベントについて説明します。

非同期メソッド

これまでに実装した、ぺージの表示、JavaScriptコードの実行の機能を単純に順番に並べただけのスクリプト"sample_005.cgx"を以下に示します。

1:

class main

2:

// ゲッタ

3:

closed getter directory _baseDir

4:

// このスクリプト(sample_005.cgx)の居るディレクトリを返す。

5:

rice riceEnv;

6:

file source = new file(riceEnv.SourceFileName);

7:

return source.Directory;

8:

endgetter

9:
10:

// メソッド

11:

open method void start()

12:

// ナビゲート

13:

browser brw; // 宣言文。browserクラスの変数"br"を作成。

14:

brw.Navigate("https://www.google.com/"); // Navigateメソッドの呼出。

15:
16:

//JavaScriptコード(sample_001.js)の読み込み

17:

reader red = new reader(this._baseDir.FullName + "\sample_001.js");

18:

string jsCode = red.ReadToEnd();

19:

red.Release();

20:
21:

//JavaScriptコードの実行

22:

jsexecutor jse; // 宣言文。jsexeutorクラスの変数"jse"を作成。

23:

jse.Execute(jsCode); // Executeメソッドの呼出。

24:

endmethod

25:
26:

open method void end()

27:

endmethod

28:

endclass

ナビゲートして読み込んで実行します。一見すると上手く動きそうに見えますが、これは望んだ様には動きません。その理由は十四行目のNavigate()メソッドの呼び出しにあります。


Navigateメソッドの実行はナビゲートの完了を待ちません。上の例でいうと、"https://www.google.com/"のページの表示の終了を待ちません。ナビゲートの要求をした後に即座に終了します。ブラウザは要求された"https://www.google.com/"を表示するために動いていますが、スクリプトは次へと処理が進んでいきます。

この様な動作をするメソッドを非同期メソッドといいます。

普通、ページの読み込みには時間がかかります。しかし、十四行目はナビゲートの要求をした後に即座に終了します。したがって、グーグルの検索ぺージが表示される前に後続のスクリプトが実行されます。後続のスクリプトが実行する"sample_001.js"は、新しく読み込まれるグーグルの検索ぺージを仮定しているので、JavaScriptの実行が上手くいかずにスクリプトがストップします。

Loadイベント

個別のスクリプトを一つにまとめるためには、何らかの方法でグーグルの検索ぺージの表示が終了するまでJavaScriptの実行を待たなければなりません。そして、CookerGXにはこの問題に対するちょうど良い解決法があります。

それは、browserクラスのLoadイベントです。Loadイベントはナビゲートされたページの表示が完全に終了した後に一度だけ発生するイベントです。このイベントを使えばナビゲートされたページの表示終了を判定できます。


Loadイベントを考慮して書き直したスクリプト"sample_006.cgx"を以下に示します。

1:

class main

2:

// ゲッタ

3:

closed getter directory _baseDir

4:

// このスクリプト(sample_006.cgx)の居るディレクトリを返す。

5:

rice riceEnv;

6:

file source = new file(riceEnv.SourceFileName);

7:

return source.Directory;

8:

endgetter

9:
10:

// メソッド

11:

open method void start()

12:

// ナビゲート

13:

browser brw; // 宣言文。browserクラスの変数"br"を作成。

14:

ehswitch ehs = brw.Load(this, "LoadHandler(eventargs)"); // ハンドラの割り当て。Loadメソッドは、ehswitchクラスのインスタンスを返す。

15:

ehs.OneShot(); // ハンドラ実行開始。OneShot()で開始されたハンドラは一度だけ呼び出されて停止。

16:

brw.Navigate("https://www.google.com/"); // Navigateメソッドの呼出。

17:

endmethod

18:
19:

open method void end()

20:

endmethod

21:
22:

// Loadイベント発生時に呼び出されるハンドラメソッド

23:

open method void LoadHandler(eventargs ea)

24:

//JavaScriptコード(sample_001.js)の読み込み

25:

reader red = new reader(this._baseDir.FullName + "\sample_001.js");

26:

string jsCode = red.ReadToEnd();

27:

red.Release();

28:
29:

//JavaScriptコードの実行

30:

jsexecutor jse; // 宣言文。jsexeutorクラスの変数"jse"を作成。

31:

jse.Execute(jsCode); // Executeメソッドの呼出。

32:

endmethod

33:

endclass

startメソッドの中でLoadイベントを利用しています。

十四行目で、browserクラスのLoadメソッドでLoadイベントで呼び出されるイベントハンドラ(イベント処理メソッド)を指定しています。

Loadメソッドの第一引数には、ハンドラをメンバとして持つインスタンスを指定します。この場合は、this キーワードを使って、現在のmainクラスのインスタンスを指定しています。第二引数には、ハンドラメソッドのシグネチャ(呼出に使う名前)を指定します。

Loadメソッドは、返り値としてehswitchクラスを返します。これを使ってハンドラの実行を制御します。この例ではOneShotメソッドを呼び出しています。OneShotメソッドで開始されたハンドラはイベント発生の最初の一回目だけ呼び出されます。

Loadメソッドの詳細はこちら、ehswitchクラスの詳細についてはこちらを参照してください。

ここまでが、Loadイベントに対するイベントハンドラの割り当てです。割り当て終了後に十六行目で、Navigateメソッドを呼び出しています。


Navigateメソッドは即座に終了し、同時にstartメソッドも終了します。

グーグルの検索ぺージの表示が完全に終了した後にLoadイベントが発生します。CookerGXは、このイベントに対してbrowserクラスのLoadメソッドで割り当てられているメソッドを実行します。この場合は、mainクラスの LoadHandlerメソッドが実行されます。

おわりに

sample_006.cgxを実行してみましょう。グーグルの検索ぺージでダイアログが表示されたはずです。





これまでのチュートリアルで示したように、CookerGXを使えばWebページを操作し、その内部から情報を抽出できます。

Previous
Copyright © CookerGX All rights reserved.