Home Notices Documents Classes Download Others Rice
Documents  >  tutorial  >  基本の使用法  >  JavaScriptコードの実行
JavaScriptコードの実行

このセクションの目的

前のセクションでターゲットとなるWebページを表示することに成功しました。このセクションでは、そのWebページ上でJavaScriptコードを実行する方法を学んでいきます。

jsexecutorクラス

前のセクションで出てきたbrowserクラスはCookerGXのブラウザ部分を操作する機能をまとめたクラスでした。

CookerGXはWebページを操作するためのソフトウエアであり、その操作はJavaScriptを使うことで行います。したがって、CookerGXはJavaScript関連の機能をまとめたクラスを持ちます。それがjsexecutorクラスです。


jsexecutorクラスの機能の一例です。

Webページ内のJavaScript関数を呼び出し、関数の返り値を受け取れます。

Webページ内に新しいJavaScript関数を埋め込めます。

任意のJavaScriptコードを直接実行できます。





以下の章では、読み込んだJavaScriptコードを直接実行します。

JavaScriptサンプルコード

先ず、サンプルスクリプトに実行させるJavaScriptコードを用意しなければなりません。サンプルアーカイブには、そのためのファイル"sample_001.js"が用意されています。

"sample_001.js"を以下に示します。

1:

(function(){

2:

let q_elements = document.getElementsByName("q"); // name属性が q の全てのタグを配列で取得。

3:

let q_element = q_elements[0]; // 目的の input タグは、配列の唯一の要素である。先頭を取り出す。

4:

q_element.value = ""; // input タグの値を削除。

5:

let inpVal = window.prompt("検索ワードを入力してください", "");

6:

// 空の場合やキャンセルした場合は何もしない

7:

if(inpVal == "null"){

8:

return;

9:

}

10:

q_element.value = inpVal; // input タグの値を設定。

11:

alert("検索を開始します。");

12:

let btnk_elements = document.getElementsByName("btnK");// name属性が btnK の全てのタグを配列で取得。

13:

let btnk_element = btnk_elements[0]; // 目的の input タグは、配列の唯一の要素である。先頭を取り出す。

14:

btnk_element.click(); // クリック。

15:

return;

16:

}());

JavaScriptコードが即時関数として記述されていることに注意してください。

実行

サンプルアーカイブ内の"sample_004.cgx"を以下に示します。これはGoogle検索ページの入力欄に検索ワードを入力するスクリプトです。

1:

class main

2:

// ゲッタ

3:

closed getter directory _baseDir

4:

// このスクリプト(sample_004.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:

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

13:

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

14:

string jsCode = red.ReadToEnd();

15:

red.Release();

16:
17:

//JavaScriptコードの実行

18:

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

19:

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

20:

endmethod

21:
22:

open method void end()

23:

endmethod

24:

endclass

三~八行目はゲッタ(getter)というクラスの構成要素(メンバ)の定義です。ゲッタの詳細についてはマニュアルを参照してください。


ここでは、十三~十五行目に注目してください。Googleの検索ページ上で実行するJavaScriptコードをファイルからstring(文字列)クラスの変数に読み込んでいます。

テキストファイルへのアクセス機能を提供するreaderクラスの変数を使っていますが、詳細については readerクラスのマニュアルをご覧ください。

この中で例として一番格好なのは十四行目です。


string jsCode = red.ReadToEnd();


この形式の文を、定義文といいます。最初から二つ目までは宣言文と同じ並びですが、等号以降が異なります。





図示したように、変数の宣言と初期値を一つの文で決定するのが定義文です。この等号より後を"式"と呼びます。

この式、前のセクションで説明した呼出"文"と似ています。browserとreaderの違いはありますが、どちらもドット演算子によるメンバ(メソッド)の呼び出しです。

片方では文、もう片方では式。何が二つを分かつのか?それはメソッドの返り値を利用するかどうかです。

前々のセクションのメソッド定義の図で少しふれていますが、メソッドは値を返せます。





返り値を利用するスクリプトの構成要素を式。利用しない構成要素を文と呼び区別しています。

十四行目は、red.ReadToEnd()の返す文字列(stringクラス)をstringクラスの変数jsCodeに代入、つまり利用しています。ですからReadToEnd()メソッドの呼出は式です。

これに対して、red.ReadToEnd()を文として使った場合は、返り値の文字列は捨てられて利用されません。



jsexecutor.Execute

十八~十九行目が実際にJavaScriptコードを実行している部分です。


十八行目でjsexecutorクラスの変数jseを宣言しています。

十九行目がJavaScriptの実行部分です。jse.Execute(jsCode);でExecute()メソッドを呼び出しJavaScriptをブラウザに渡して実行させています。


この例では、Execute()メソッドからの返り値は利用していませんが、利用することもできます。

jsexecutorクラスやExecute()メソッドの詳細についてはマニュアルを参照してください。


Execute()メソッドで実行されるJavaScriptコードは"sample_001.js"のように、即時関数形式であるべきです。

その理由を以下に示します。

JavaScriptから値を返す場合はreturn文が必要ですが、関数定義の中に無いreturn文はエラーになり実行できません。

関数定義の中に無い変数はグローバル変数となる危険があります。必要のないグローバル変数による名前空間の汚染は大変危険です。即時関数形式で記述すれば汚染の危険が減ります。

Next
Previous
Copyright © CookerGX All rights reserved.