====== jQuery plugin for monitoring idle state ======
前に、dojoで**[[study:javascript:dojo:monitor|idle state]]**を監視するクラスを作成してみたが、今回は同じソースをjQuery pluginで作成してみた。\\
plugin化するにあたって、optionの設定ができることと、activeステートとidleステートの際のcallbackメソッドを\\
overrideできるようにすることを目標にした。
これを元に機能を拡張していきたいと思う。
===== code snippet =====
ソースは簡単だが、コードの一部分を次に示す。
(function($) {
$.extend($.fn, {
monitor: function(options){
// check if a monitor was already created
var monitor = $.data(this[0], 'monitor');
if ( monitor ) {
return monitor;
}
monitor = new $.monitor( options, this[0] );
$.data(this[0], 'monitor', monitor);
return monitor;
}
});
// constructor for monitor
$.monitor = function( options, target) {
this.settings = $.extend( true, {}, $.monitor.defaults, options );
this.target = target;
this.init();
};
$.extend($.monitor, {
defaults:{
timeout : 500,
events : [scroll]
},
setDefaults: function(settings) {
$.extend($.monitor.defaults, settings );
},
prototype: {
init: function(){
this._idleTime = null;
this._timer = null;
this._state = "on";
this.idleTime = null;
this.initObservers(this.target, this.settings.events);
this.setTimer(this.target);
},
initObservers: function(target, events){
var oj = this;
$.each(events, function(i, e){
$(target).bind(e, function(event){
oj.onInterrupt(target, event);
});
});
},
onInterrupt: function(target, event){
this.idleTime = new Date() - this._idleTime;
$(target).bind("state:active", function(){}).trigger("state:active", $.monitor.onActive(this.idleTime));
this.setTimer(target);
},
setTimer: function(target){
clearTimeout(this._timer);
if(this._state=="on"){
this._idleTime = new Date();
this._timer = setTimeout(function(){
$(target).bind("state:idle", function(){}).trigger("state:idle", $.monitor.onIdle());
},this.settings.timeout);
}
}
},
onMonitor : function(){
this._state = "off";
},
offMonitor : function(){
this._state = "on";
},
onIdle: function(){
return false;
},
onActive: function(args){
return false;
}
});
})(jQuery);
optionsはtimeout時間(defaultで1000ms)と登録するイベント(defaultでscrollイベント)が指定できる。\\
dojoで作成したときは、登録するターゲットとイベントを共に指定したが、jQueryはターゲットを指定してからpluginで
メソッドを呼び出すため、分離することにした。\\
メソッドの呼び方については後ほど説明する。
使う際にはonActiveメソッドとonIdleメソッドをoverrideする必要がある。基本的には何もしないことにしている。
===== demo page =====
pluginを呼び出す部分を次に示す。
//override default onActive method
$.monitor.onActive = function(args){
$("p").css("opacity",1);
debug("active... after: " + args + "ms");
};
//override default onIdle method
$.monitor.onIdle = function(){
$("p").css("opacity",0.2);
debug("idle...");
};
$(function(){
$(document).monitor({timeout: 5000, events:['mousemove','keydown']});
$(window).monitor({events:['resize','scroll']});
});
基本的に
defalutメソッドであるonActiveメソッドとonIdleメソッドをoverrideしてから、monitorメソッドを呼び出す。\\
デモページでは、documentに対してtimeout5秒を指定してある。windowのりサイズイベントとスクロールイベントに対しては
defaultの1秒がたったらIdleステートになる。
デモは[[http://ria-web.info/test/jQuery/demo/demo01.html|demo page]]から確認できる。\\