Ajax.Requestはこう使えばよいのか
Prototype.jsのAjax.Requestに渡すコールバック関数は、オブジェクト内のメソッドを渡しても、thisでオブジェクトの内部変数は参照できない。
まあ、AjaxのFAQに当たるもので、当たり前といえば当たり前である。
これを解決するにはクロージャを使う。
こんな感じ。
<script language="javascript">
function TEST(x){
var val=x;
this.dispVal=function(Res){
alert(val+Res.responseText);
}
}
var t=new TEST('aaa');
function Read(URL){
var a=new Ajax.Request(
URL,
{method: 'get', asynchronous :true, onComplete: function(Res){t.dispVal(Res); }});
}
Read('http://test.com/test.txt');
</script>
実行すると、アラートダイアログのメッセージに'aaa'+<http://test.com/test.txtの内容>が出力される。
ミソは、TEST()の変数valに設定することと、TEST()をnewで作ること。
TEST()の変数valは、ローカル変数のように見えるが、メンバ変数と考えればよいのか?そうすると、newしたオブジェクトを保っている間は保持される。(this.valでないことに注意)
これの問題は、クロージャが残ったままになり、溜まりにたまるとメモリリークを起こしてしまうことと、ローカル変数tの処遇に困ること。うまく開放すればよいのだが。
« ふと思った | トップページ | 今日買ってきた本 »
« ふと思った | トップページ | 今日買ってきた本 »
コメント