タブブラウザ Sleipnir オンラインデータベース
SleipnirA5-B9-A5-AF-A5-EA-A5-D7-A5-C8-BA-EE-C0-AE-CB-A1-.html

  [ トップ | ヘルプ ]

Sleipnirスクリプト作成法 †

ここでは、JavaScript,VBScript(以下、まとめて Script と表記)などを使ってSleipnirスクリプトを作る際の書式などを説明します。
Script を習得している前提で説明しているのでご了承ください。
なお、組み込みスクリプト(SleipnirScript*1)の書き方は
組み込みスクリプトの書き方 のページを参照してください。


↓Sleipnirスクリプト開発に関する質問や情報交換はこちら
Sleipnir Script BBS



ブラウザ上で動作する Script との違い †

通常、Webページ上に HTML と一緒に記述されている Script は、IEなどのブラウザが処理しています。
対して、Sleipnirスクリプトは Windows Script Host(WSH) が処理します。
したがって、IE や Sleipnir のセキュリティ設定で JavaScriptの実行 を OFF にしていても
Sleipnirスクリプトは動作します。
WSH 上で処理しているため、WSH の命令を使用することももちろん可能です。
ただし、HTMLに記述される Script でよく使用される window オブジェクトや、document オブジェクトをそのまま使用できないなどの制限もあるのでご注意ください。
WSH はSleipnirスクリプトを書く上でとても便利なので、習得しておくことをお勧めします。

なお、WSH はWindowsに標準で入っていますが、OSのバージョンによってはWSHのバージョンが古いこともあります。
できるだけ最新バージョンを入れておきましょう。

バージョンの確認法

Sleipnir.APIの使用法 †

Sleipnirでは、SleipnirスクリプトからSleipnir を操作するための API (Sleipnir.API)が多数あります。
使用するには、ソースコードの最初の方で次のように記述して定義します。

[JScript]

var pnir = new ActiveXObject("Sleipnir.API");

[VBScript]

Dim pnir
Set pnir = CreateObject("Sleipnir.API")

この記述の後に

pnir.○○○

と「pnir.」の後に使いたいSlepipnir.APIを記述することでSleipnir.APIが使用できます。
なお、変数名「pnir」は何でもかまいません。好きな文字列を定義してください。
(「Sleip」という変数名で定義する人も多いです)
また、

var pnir = new ActiveXObject("Sleipnir.API");
Dim pnir
Set pnir = CreateObject("Sleipnir.API")

はSleipnirスクリプト内で一度宣言するだけでOKです。Sleipnir.APIを使用するたびに宣言する必要はありません。

では実際に1つ簡単なスクリプトを書いて見ましょう。
今回は面倒なのでJavaScriptのみです。

[JScript]

var pnir = new ActiveXObject("Sleipnir.API");
var id = pnir.GetDocumentID(pnir.ActiveIndex);
pnir.Navigate(id, 'http://www.google.co.jp/');

これをメモ帳などのテキストエディタに記入し、拡張子を「.js」にして適当な名前をつけて保存し、
Sleipnirを起動した状態で実行(保存したファイルをダブルクリック)してみてください。
SleipnirのアクティブなウィンドウでGoogleのTOPページが表示されます。
(ファイルを {Sleipnirをインストールしたフォルダ}\scripts フォルダに入れればSleipnirの「メニューバー|スクリプト」から使用できます)
それではこのSleipnirスクリプトの説明をしていきます。

1行目:var pnir = new ActiveXObject("Sleipnir.API");

この行は先ほど説明したとおりです。Sleipnir.APIを使用する際のお約束です。

2行目:var id = pnir.GetDocumentID(pnir.ActiveIndex);

Sleipnir.API の ActiveIndex はアクティブなウィンドウのタブバー上での並び順を整数で取得します。
左から 0 1 2 3 ・・・と数えた時の順番を取得するので、左から7番目のタブのウィンドウがアクティブだった場合
ActiveIndex の 値は 6 になります。
GetDocumentID() はタブバー上での並び順の番号からその番号のウィンドウの ドキュメント固有のID を取得します。
ドキュメント固有のID というのは、Sleipnirで開かれたウィンドウ(タブ)1つ1つに付けられた識別番号です。
ウィンドウを開くたびにランダムな数字がIDとして割り当てられ、タブを並び替えてもこのIDは変化しません。
ちょっと話が複雑だったかもしれませんが、とにかく

var id = pnir.GetDocumentID(pnir.ActiveIndex);

は、アクティブなウィンドウの ドキュメント固有のID を取得して変数「id」に代入していると覚えておいて良いです。

3行目:pnir.Navigate(id, 'http://www.google.co.jp/');

Sleipnir.API の Navigate() は、任意の ドキュメント固有のID のウィンドウで任意のWebページを開きます。
変数「id」は3行目でアクティブなウィンドウの ドキュメント固有のID を代入しているので、
アクティブなウィンドウでGoogleのTOPページが開きます。

この他にも Sleipnir.API はたくさんありますが、ここでは省略します。

参照:Sleipnir.API リファレンス

window オブジェクト や document オブジェクト を使用する †

Webページ上に HTML と一緒に記述されている JavaScript では、

document.title

でページのタイトルを取得・設定したり、

window.back()

で前のページに戻ったりできますが、
Sleipnirスクリプトでこれらを使用するには準備が必要です。
と言っても、Sleipniスクリプトの最初の方に1~2行書き加えるだけです。

■documentオブジェクト
[JScript]

var pnir, id, document;
pnir = new ActiveXObject("Sleipnir.API");
id = pnir.GetDocumentID(pnir.ActiveIndex);
document = pnir.GetDocumentObject(id);
document.title = 'すれいぷにる!';

1~3行目は説明済みなので省略します。

4行目:document = pnir.GetDocumentObject(id);

Sleipnir.API の GetDocumentObject() は任意の ドキュメント固有のID のウィンドウの document オブジェクト を作成します。 宣言後はHTML上でJavaScriptを使用する時と同じように document オブジェクト が使用できます。

5行目:document.title = 'すれいぷにる!';

説明無用ですね。ウィンドウ(タブ)のタイトルを「すれいぷにる!」にします。
なお、

doc = pnir.GetDocumentObject(id);
doc.title = 'すれいぷにる!';

などのように「doc」と定義することもできます。
「pnir」の時と同じで「doc」以外にも何でもOKです。

■windowオブジェクト
[JScript]

var pnir, id, window;
pnir = new ActiveXObject("Sleipnir.API");
id = pnir.GetDocumentID(pnir.ActiveIndex);
window = pnir.GetWindowObject(id);
window.back();

1~3行目は説明済みなので省略します。

4行目:window = pnir.GetWindowObject(id);

Sleipnir.API の GetWindowObject() は任意の ドキュメント固有のID のウィンドウの window オブジェクト を作成します。 宣言後はHTML上でJavaScriptを使用する時と同じように window オブジェクト が使用できます。

5行目:window.back();

説明無用ですね。前のページに戻ります。
なお、

win = pnir.GetWindowObject(id);
win.back();

などのように「win」と定義することもできます。
「pnir」や「document」の時と同じで「win」以外にも何でもOKです。

なお、GetWebBrowserObject() もありますがあまり使われないのでここでは省略します。

◆注意
以上の方法で window オブジェクト や document オブジェクト をSleipnirスクリプトから使用できますが、
WebページでHTMLと一緒に書かれた Script に比べての処理速度が遅いです。
これは、Sleipnirスクリプトから window オブジェクト や document オブジェクト を使用する際、
Sleipnir が Sleipnirスクリプト と IE との仲立ちをしているからです。
間に Sleipnir が入る分、WebページでHTMLと一緒に書かれた Script に比べて処理速度が遅くなってしまいます。
特に、for文などを使ってページ内の画像全てに対して複雑な処理を行うなどした時に、
処理が終わるのに1分以上かかるなどということもあります。

あと、WebページのHTML上で onClick="..." などのイベントハンドラの中で参照するいわゆるイベントオブジェクトをSleipnirスクリプトで使用することはできません。
ご注意ください。

Sleipnirスクリプトにおける例外処理 †

前述の方法で window オブジェクト や document オブジェクト を作成するわけですが、
オブジェクトを作成しようとするウィンドウの状態によっては オブジェクト の作成に失敗してしまうことがあります。
例えば、ページのリンクをクリックしてダウンロードダイアログが出た際に開かれた空白ウィンドウなどでは失敗してしまいます。
なので、window オブジェクト や document オブジェクト の作成に成功しているか確かめた上で
これらのオブジェクトを使う必要があります。
方法は人それぞれさまざまですが、一般的には次のようにします。

[JScript]

pnir     = new ActiveXObject("Sleipnir.API");
id       = pnir.GetDocumentID(pnir.ActiveIndex);
document = pnir.GetDocumentObject(id);
if (document == null)  {
	pnir.MessageBox("Document オブジェクトを作成できません");
}
else {
	// TODO: コードをここに記述してください。
	
	document = null;
}

一般的に、documentオブジェクトしか判定する必要は無いです。
どっちかが成功してどっちかが失敗するということはまずありません。

なお、window オブジェクト も document オブジェクト も使用しないスクリプトの場合は、document == null の代わりに pnir.GetCount < 1 を書くこともあります。
Sleipnir.APIの GetCount は開かれているウィンドウ(タブ)の数を取得する API です。 Sleipnir 2.xx ではタブの数が 0 になることはありませんが、1.66 では 0 になることがあるので、
2.xx と 1.66 の両方で使用できるスクリプトを書く場合は pnir.GetCount < 1 で判定しておいた方が良いです。

テンプレート &dagger;

Sleipnirスクリプトを書く際に、毎回白紙から書くのは大変なので、テンプレートを置いておきます。

window = pnir.GetWindowObject(id);

などはお好みで追加してください。

[JScript]

var pnir, id, document;

pnir     = new ActiveXObject("Sleipnir.API");
id       = pnir.GetDocumentID(pnir.ActiveIndex);
document = pnir.GetDocumentObject(id);

if (document == null)  {
	pnir.MessageBox("Document オブジェクトを作成できません");
}
else {
	// TODO: コードをここに記述してください。
	
	document = null;
}

pnir = null;

[VBScript]

Option Explicit

Dim pnir, document, id

Set pnir = CreateObject("Sleipnir.API")
id = pnir.GetDocumentID(pnir.ActiveIndex)
Set document = pnir.GetDocumentObject(id)

If document Is Nothing Then
	Call pnir.MessageBox("Document オブジェクトを作成できません")
Else
	' TODO: コードをここに記述してください。

	Set document = Nothing
End If

Set pnir = Nothing

サンプルが滅多に見つからない PerlScript*2*3 と HSP3*4 でもできたので参考程度に載せます。

[PerlScript]

use Win32::OLE;

my $pnir     = Win32::OLE->CreateObject("Sleipnir.API");
my $id       = ${pnir}->GetDocumentID(${pnir}->ActiveIndex);
my $document = ${pnir}->GetDocumentObject($id);

if(!($document)) {
	${pnir}->MessageBox("Document オブジェクトを作成できません");
} else {
	# TODO: コードをここに記述してください。

	undef($document);
}

undef($pnir);
exit;

[HSP3]

	newcom pnir, "Sleipnir.API"
	id = pnir("GetDocumentID", pnir("ActiveIndex"))
	document = pnir("GetDocumentObject", id)

	if varuse(document) = 0 {
		pnir->"MessageBox" "Document オブジェクトを作成できません"
	} else {
		; TODO: コードをここに記述してください。

		delcom document
	}

	delcom pnir
	end

その他Sleipnirスクリプトに使用できる言語 &dagger;

COMコンポーネントの呼び出しに対応している言語であれば使用できると思います。

Rubyist Magazine - Win32OLE 活用法 【第 7 回】 ほかの言語での COM
python,perl,luaなど
DMonkey
ECMA(JavaScript)準拠の言語。VCLを利用してGUIを利用することが可能な他、その他便利な拡張オブジェクト群。
HSP3
初心者向けの言語。

*1 “Sleipnirスクリプト”とは別物
*2 ActivePerl のインストール必須
*3 PerlScript での日本語の扱いには不具合がありますのでご注意ください。
*4 HSP3 のインストール必須

Last-modified: 2020-12-09 (水) 10:44:44 (2d)