Sleipnir2スレ
- 25 :l ★:2007/04/25(水) 23:12:20 ID:???
- Sleipnirスクリプトから無理矢理非同期実行を実現
なんだかよく分からないが、以下のようなものができた。
if(typeof(_window.ScriptControls)=='undefined'){
_window.ScriptControls=new Array;
}
_window.ScriptControls.push(new ActiveXObject('MSScriptControl.ScriptControl.1'));
with(_window.ScriptControls[_window.ScriptControls.length-1]){
Language='JScript';AddObject('document',_document);AddObject('window',_window);
Eval('('+(function(){
//スクリプトコントロールで実行
//使いたい関数やオブジェクトなどは、全部ここで用意する
sleipnir=new ActiveXObject('Sleipnir.API');
XMLHTTP=new ActiveXObject("Microsoft.XMLHTTP");
print=function(msg){sleipnir.OutputAddString(msg);};
window._AsynchronousProcedure=function(){
//setTimeoutから非同期で呼び出される
//スクリプトコントロール内の変数を使用可能
with(XMLHTTP){
open('GET','http://lukewarm.s151.xrea.com/',false);
send();
print(responseText);
}
};
window.setTimeout('_AsynchronousProcedure()',0);
}).toString()+')();');
}
まず、スクリプトコントロールを生成してwindowにセットし、その他の準備を行い、実行させたいコードをEvalする。
この時、コードは文字列として与えなければならないが、引用符などをエスケープして記述するのは面倒である。
そこで、「'('+(function{...}).toString()+')();'」として、関数として記述したコードを一旦文字列に変換後その関数を即座に実行するように書き加えたものをEval()することに。
Evalされるコード内では、ActiveXObjectや関数などを定義した後、非同期実行したいコードをwindowにセットしてsetTimeout()で実行させている。
この方法には、SleipnirScript、window側のスクリプト機能、new ActiveXObjectで生成したものの3つのスクリプトコントロールが関わってくるので、非常にややこしい。
57KB
0ch BBS 2005-10-08