スポンサーサイト
投稿日時 : -------- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- --:-- | スポンサー広告
中央管理型イベントマネージャ『evtmgr.js』 0.04 beta
投稿日時 : 2008-09-17 15:56
 Javascriptのメモリリークレスな中央管理型イベントマネージャのevtmgr.jsのバージョン0.04betaを公開します。今バージョンで複数ウィンドウのイベントを親ウィンドウで中央管理できるようになりました。また、ウィンドウ単位でのイベント全削除にも対応。
 
このページの情報は古くなっている可能性があります。evtmgr.jsに関する最新情報はカテゴリ:evtmgr.jsを参照して下さい。
 

■evtmgr.js の特徴

 初期バージョンから徹底していることはすべてのイベント管理をevtmgrというObject一つで完結させることです。親ウィンドウにevtmgrというグローバル変数を1つ追加し、HTMLElementにイベントハンドラーを追加する以外、いかなる名前空間の汚染、仕様外のプロパティ追加などを行わない、イベントの完全な中央管理を実現しています。その他詳細は [Javascript] 中央管理型イベントマネージャ 『evtmgr.js』ドキュメントデモを参照してください(*ドキュメントとデモは現時点では0.03beta用のままです。)。
 

■evtmgr.js 0.04 beta 変更点

  • 複数ウィンドウのイベントが中央管理可能に。
  • 登録オブジェクトにwinプロパティ追加。
  • winプロパティを使ってウィンドウ単位でのイベント検索やイベント全削除が可能に。
  • isGarbage()メソッド追加。登録オブジェクト単体でのガーベッジ判定をプログラマが任意のタイミングで実行可能に。
  • isOverlap()メソッド追加。重複登録チェックをプログラマが任意のタイミングで実行可能に。
  • 重複登録チェックが少し高速化。
  • 0.03betaで追加されたrepaer()メソッド及びlifeプロパティ廃止。
登録オブジェクトのwinプロパティには、add()メソッドでのイベント登録時にelemプロパティに指定されたHTMLElementオブジェクトが所属する実行コンテキストのグローバルオブジェクト(各ウィンドウのWindowオブジェクト)が自動的に格納されます。登録時に設定しても上書きされます。
 

■evtmgr.js 0.04 beta のダウンロード

 使用は自己責任でお願いします。evtmgr.jsが原因で発生したいかなる損害に対しても作者itmstはその責任を負いません。
 
最新バージョンはカテゴリ:evtmgr.jsを参照して下さい。
 
evtmgr.js 0.04 beta (2008/09/17 20:03) 動作確認:Firefox 3.0.1 / Firefox 2.0.0.14 / Opera 9.52 / Safari 3.1.2 / IE 7.0 / IE 6.0 / IE 5.5 / Mozilla 1.8b / NN 9.0.0.5
 

■新機能を使ったサンプルコード

 0.04betaから追加した機能を使ったサンプルコードを載せておきます。
 
子ウィンドウを閉じる前に子ウィンドウのイベントを全削除する
//子ウィンドウを生成して参照を得る
var child = window.showModelessDialog("child.hta");

//イベント登録
evtmgr.add({
	type:"unload",
	elem:child,
	func:function(){evtmgr.selectRemove({win:child})},
	inst:child
});
子ウィンドウのWindowオブジェクトのchildでunloadイベントが発生したら、条件に一致するイベントを一括削除するselectRemove()メソッドに、winプロパティにchildが設定された条件指定用のオブジェクトを渡すようにイベント登録。これで子ウィンドウに設定したイベントはunloadイベント発生時に全て削除されます。このように複数のウィンドウのイベントを中央で管理できるようになりました。
 
子ウィンドウの中の0番目の"onclick"イベントを削除する
//登録イベントを検索して結果(Array)をfoundに格納
var found = evtmgr.find({
	type:"click",
	win:child
});

//結果が0件でないなら0番目のイベントを削除
if(found.length){
	evtmgr.remove(found[0]);
}
検索条件指定Objectのwinプロパティにchildとイベントタイプclickを設定してfind()メソッドに渡すと子ウィンドウ中のclickイベントを含む登録オブジェクトへの参照Arrayが返る。この0番目の登録オブジェクトをremove()メソッドに渡してイベントを削除する。
 
ガーベッジ化したイベントかどうか調べる
<div id="mOverDiv">マウスオーバー</div>
<script>
var moverdiv = document.getElementById("mOverDiv");
function mOver(){alert('onmouseover!')}
var regObj = evtmgr.add({
	type:"mouseover",
	elem:moverdiv,
	func:mOver,
	inst:window
});
//ガーベッジ判定
alert(evtmgr.isGarbage(regObj)); //「false」と表示

//エレメントを削除してイベントをガーベッジ化させる
moverdiv.parentNode.removeChild(moverdiv);

//ガーベッジ判定
alert(evtmgr.isGarbage(regObj)); //「true」と表示

//削除
evtmgr.remove(regObj);

</script>
イベント登録後にelemプロパティが参照しているHTMLElementが消えた場合、今後イベントが発生する可能性が全くないガーベッジ(ゴミ)になる。isGarbage()メソッドに登録オブジェクトを渡してみて、ガーベッジ化しているかどうか判定できる。ガーベッジ化している場合はこのサンプルコードのように個別に削除するか、GC(ガーベッジコレクション)を実行するgc()メソッドを呼び出せばよい。GCはgcAutoStart()メソッドで自動実行させることもできる。
 
 
重複登録かどうかチェックする
//登録オブジェクト生成
var regObj1 = {
	type:"keydown",
	elem:document,
	func:showKeyCode,
	inst:window
};

//イベント登録
evtmgr.add(regObj1);

//まったく同じ条件の登録オブジェクトを新たに生成
var regObj2 = {
	type:"keydown",
	elem:document,
	func:showKeyCode,
	inst:window
};

//重複登録チェック
if(evtmgr.isOverlap(regObj2)){
	alert("重複したイベントです");
}
まったく同じ構成での重複登録はデフォルトでは許可されません。isOverlap()メソッドに登録しようとしているObjectを渡してみて重複かどうか判定できます。ちなみにevtmgr.overlap = true;とすればaddメソッド時の自動重複チェックが実行されなくなります。正しく設計されたプログラムなら重複してイベントを登録することはないと思われるので、登録時の負荷軽減のために重複を許可する方がよい。
 
 
スポンサーサイト
2008-09-17 15:56 | evtmgr.js | Comment(0) | Trackback(0)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。