X.Cancel = {\r
- UN_LISTEN : 1,\r
- CANCEL_BUBBLEUP : 2, // 上位階層への伝播のキャンセル\r
- CANCEL_NEXT : 4, // 同一階層のリスナーのキャンセル\r
- CANCEL_DEFAULT : 8, // 結果動作のキャンセル,\r
- SYS_CANCEL : 16\r
+ NONE : 0,\r
+ UN_LISTEN : 1,\r
+ STOP_PROPAGATION : 2, // 上位階層への伝播のキャンセル\r
+ CANCEL_NOW : 4, // 同一階層のリスナーのキャンセル\r
+ PREVENT_DEFAULT : 8, // 結果動作のキャンセル,\r
+ MONOPOLY : 16, // move event を独占する\r
+ SYS_CANCEL : 32\r
};\r
+\r
+/* \r
+isDefaultPrevented():Boolean\r
+イベントで preventDefault() メソッドが呼び出されたかどうかを確認します。\r
+ Event\r
+ \r
+preventDefault():void\r
+イベントのデフォルト動作をキャンセルできる場合に、その動作をキャンセルします。\r
+ Event\r
+ \r
+stopImmediatePropagation():void\r
+イベントフローの現在のノードおよび後続するノードで、イベントリスナーが処理されないようにします。\r
+ Event\r
+ \r
+stopPropagation():void\r
+イベントフローの現在のノードに後続するノードで、イベントリスナーが処理されないようにします。\r
+*/
\ No newline at end of file
Super.__new = null;\r
traits = new Super();\r
Super.__new = C;\r
- klass = X.Class.create.apply( X.Class, params );\r
+ klass = X.Class.create.apply( null, params );\r
traits = null;\r
if( opt_super === true ){\r
def = X.Class._getClassDef( klass );\r
var i = 0,\r
c = next,\r
list = TICKET_LIST,\r
- queue, callback;\r
- for( ; i < list.length; ){\r
- queue = list[ i ];\r
- if( 0 < ( queue[ INDEX_LAST ] -= c ) ){\r
- ++i;\r
- continue;\r
- };\r
- callback = queue[ INDEX_CALLBACK ];\r
- c = queue[ INDEX_COUNT ];\r
- if( callback() === false || c === 1 ){\r
+ i = list.length,\r
+ queue, f, ret;\r
+ for( ; i; ){\r
+ queue = list[ --i ];\r
+ if( 0 < ( queue[ INDEX_LAST ] -= c ) ) continue;\r
+ f = queue[ INDEX_CALLBACK ];\r
+ c = queue[ INDEX_COUNT ];\r
+ ret = f();\r
+ if( ret === false || ret === X.Cancel.UN_LISTEN || c === 1 ){\r
list.splice( i, 1 );\r
- callback.kill();\r
+ f.kill();\r
queue.length = 0;\r
continue;\r
} else\r
- if( 1 < c ){\r
- --queue[ INDEX_COUNT ];\r
- };\r
- ++i;\r
+ if( 1 < c ) --queue[ INDEX_COUNT ];\r
queue[ INDEX_LAST ] = queue[ INDEX_TIME ];\r
};\r
timerId = -1;\r
};\r
function update(){\r
var list = TICKET_LIST,\r
- l = list.length,\r
+ i = list.length,\r
n = 99999999,\r
last;\r
- if( l === 0 ){\r
+ if( i === 0 ){\r
timerId !== -1 && clearTimeout( timerId );\r
timerId = -1;\r
return;\r
};\r
- for( ; l; ){\r
- last = list[ --l ][ INDEX_LAST ];\r
+ for( ; i; ){\r
+ last = list[ --i ][ INDEX_LAST ];\r
if( last < n ) n = last;\r
};\r
if( n < next || timerId === -1 ){\r
};\r
\r
return {\r
- add : function( time, count, args1, args2, args3 ){\r
- if( time < INTERVAL_TIME ) time = INTERVAL_TIME;\r
- time = Math.floor( time / INTERVAL_TIME );\r
- var callback,\r
- list = TICKET_LIST,\r
- l = list.length,\r
- i = l,\r
- queue, args;\r
- if( typeof count !== 'number' || count < 0 ){\r
- count = 0;\r
+ add : function( time, opt_count, args1, args2, args3 ){\r
+ time = time < INTERVAL_TIME ? 1 : ( time / INTERVAL_TIME ) | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に;\r
+\r
+ if( typeof opt_count !== 'number' ){\r
+ args3 = args2;\r
+ args2 = args1;\r
+ args1 = opt_count;\r
+ opt_count = 0;\r
};\r
- /*\r
- for( ; i; ){\r
- queue = list[ --i ];\r
- if( queue[ INDEX_CALLBACK ].same( args1, args2 ) === true ){\r
- queue[ INDEX_TIME ] = queue[ INDEX_LAST ] = time;\r
- queue[ INDEX_COUNT ] = count;\r
- update();\r
- return;\r
- };\r
- }; */ \r
\r
- list[ l ] = [ time, time, count, X.Callback.create( args1, args2, args3 ) ];\r
+ TICKET_LIST[ TICKET_LIST.length ] = [ time, time, opt_count, X.Callback.create( args1, args2, args3 ) ];\r
update();\r
},\r
once : function( time, args1, args2, args3 ){\r
if( !create ) return;\r
LIST[ LIST.length ] = instance;\r
TEMP[ TEMP.length ] = data = {};\r
+ if( window[ 'AbstractDisplayNode' ] && instance instanceof window[ 'AbstractDisplayNode' ] ){\r
+ X.Class._getPrivate( instance ).events = data;\r
+ };\r
} else {\r
data = TEMP[ i ];\r
};\r
{\r
listen : function( type, arg1, arg2 ){\r
var list = getList( this, type, true );\r
- if( list.length && exist( list, arg1, arg2 ) !== -1 ) return;\r
+ if( list.length && exist( list, arg1, arg2 ) !== -1 ) return this;\r
list[ list.length ] = X.Callback[ once === true ? 'once' : 'create' ]( arg1, arg2 );\r
+ return this;\r
},\r
listenOnce : function( type, arg1, arg2 ){\r
once = true;\r
- this.listen( type, arg1, arg2 );\r
+ //this.listen( type, arg1, arg2 );\r
+ X.EventDispatcher.prototype.listen.call( this, type, arg1, arg2 );\r
once = false;\r
+ return this;\r
},\r
unlisten : function( type, arg1, arg2 ){\r
var list = getList( this, type ),\r
list, i;\r
- if( !list ) return;\r
+ if( !list ) return this;\r
i = exist( list, arg1, arg2 );\r
- i !== -1 && list.splice( i, 1 );\r
- if( list.length === 0 ){\r
- list.data[ e.type ] = void 0;\r
- delete list.data;\r
+ if( i !== -1 ){\r
+ list[ i ].kill();\r
+ list.splice( i, 1 );\r
+ if( list.length === 0 ){\r
+ list.data[ e.type ] = void 0;\r
+ delete list.data;\r
+ };\r
};\r
+ return this;\r
},\r
listening : function( type, arg1, arg2 ){\r
var list = getList( this, type );\r
},\r
dispatch : function( e ){\r
// dispatch 中の listen は?\r
- // \r
- \r
var list = getList( this, e.type ),\r
- i, f;\r
+ i, f, ret, sysOnly, _ret;\r
if( !list ) return;\r
for( i = list.length; i; ){\r
f = list[ --i ];\r
// once の場合リストから削除してからファイア\r
- f.once === true && list.splice( i, 1 );\r
- if( f( e ) === false ){\r
- \r
+ if( f.once === true ){\r
+ list.splice( i, 1 );\r
+ ret = f( e );\r
+ } else {\r
+ ret = f( e );\r
+ if( ret === false || ret & X.Cancel.UN_LISTEN ){\r
+ list.splice( i, 1 );\r
+ f.kill();\r
+ };\r
};\r
if( list.length === 0 ){\r
list.data[ e.type ] = void 0;\r
delete list.data;\r
};\r
+ if( ret & X.Cancel.STOP_NOW ){\r
+ sysOnly = true;\r
+ };\r
+ _ret |= ret;\r
};\r
- return;\r
+ return _ret;\r
}\r
}//, onKillCallback( instance )\r
);\r
})();\r
\r
\r
-\r
-\r
var X = X || {};
X.DomEvent = {
- _load : false,
- _ready : false,
- _unload : false,
add :
document.addEventListener ?
(function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
element.attachEvent( 'on' + type, callback );
}) :
(function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
- var callback;
+ var callback, dom0, helper, list;
if( typeof arg2 === 'function' ){
callback = X.Callback.create( element, arg2, arg3 );
} else {
callback.c = X.DomEvent._callback; // override
return;
};
- helper = X.DomEvent.Dom0.find( element, type, callback );
+ dom0 = X.DomEvent.Dom0;
+ helper = dom0.find( element, type );
if( helper ){
- if( helper.list.indexOf( callback ) === -1 ) helper.list[ helper.list.length ] = callback;
+ list = helper.list;
+ if( list.indexOf( callback ) === -1 ) list[ list.length ] = callback;
} else {
- new X.DomEvent.Dom0.Helper( element, type, callback );
+ dom0.LIST[ dom0.LIST.length ] = new dom0.Helper( element, type, callback );
};
}),
remove :
};
}) :
(function( element, type, arg2, arg3 ){
- var t = X.DomEvent.Dom0.find( element, type ),
- c = X.Callback.find( arg2, arg3 ),
+ var dom0 = X.DomEvent.Dom0,
+ t = dom0.find( element, type ),
+ c = X.Callback.find( arg2, arg3 ),
i;
if( t && c ){
i = t.list.indexOf( c );
X.Callback._correct( c );
};
if( t.list.length === 0 ){
- t.elm[ 'on' + t.type ] = X.DomEvent.Dom0.emptyFunc;
+ t.elm[ 'on' + t.type ] = dom0.emptyFunc;
t.elm[ 'on' + t.type ] = '';
c = X.Callback.find( t );
X.Callback._correct( c );
- X.DomEvent.Dom0.LIST.splice( X.DomEvent.Dom0.LIST.indexOf( t ), 1 );
+ dom0.LIST.splice( dom0.LIST.indexOf( t ), 1 );
delete t.elm;
delete t.type;
delete t.list;
}),
_callback :
window.addEventListener ?
- (function( event ){
+ (function(){
var f = this,
- r = f.callback.call( f.context, event );
+ e = f.a[ 0 ],
+ r = f.callback.call( f.context, new X.DomEvent.xEvent( e ) );
if( r !== false ) return r;
- event.preventDefault();
- event.stopPropagation();
+ e.preventDefault();
+ e.stopPropagation();
return false;
- }) :
+ }) :
+ document.attachEvent ?
+ (function(){
+ var f = this,
+ e = window.event,
+ x = f.context,
+ r = f.callback.call( x, new X.DomEvent.xEvent( e, f.e ));
+ if( r !== false ) return r;
+ e.cancelBubble = true;
+ e.returnValue = false;
+ return r;
+ }) :
(function(){
var f = this,
e = window.event,
return r;
})
};
-if( !window.addEventListener ){
+if( window.addEventListener ){
+ X.DomEvent.xEvent = function( e ){
+ this._event = e;
+ this.type = e.type;
+ this.target = e.target;
+ this.currentTarget = e.currentTarget;
+ this.relatedTarget = e.relatedTarget;
+ this.eventPhase = e.eventPhase;
+
+ this.clientX = e.clientX;
+ this.clientY = e.clientY;
+ this.screenX = e.screenX;
+ this.screenY = e.screenY;
+
+ this.keyCode = e.keyCode;
+ this.altKey = e.altKey;
+ this.ctrlKey = e.ctrlKey;
+ this.shiftKey = e.shiftKey;
+
+ this.wheelDelta = e.wheelDelta;
+ };
+} else {
X.DomEvent.xEvent = function( e, element ){
this._event = e;
this.type = e.type;
helper = list[ --i ];
if( helper.elm === element && helper.type === type ) return helper;
};
- return null;
},
Helper : function( elm, type, callback ){
this.elm = elm;
this.type = type;
this.list = [ callback ];
- var callback = elm[ 'on' + type ] = X.DomEvent.create( this );
- callback.c = X.DomEvent._callback; // override
- X.DomEvent.Dom0.LIST[ X.DomEvent.Dom0.LIST.length ] = this;
+ callback = elm[ 'on' + type ] = X.Callback.create( this );
+ callback.c = X.DomEvent._callback; // override
}
};
X.DomEvent.Dom0.Helper.prototype.handleEvent = function(e){
CREATION_COMPLETE : 3,\r
REMOVED : 4,\r
\r
- VIEW_RESIZED : 7, // リサイズイベントのバブルアップは要素のレイアウトマネジャーでキャンセルされることも\r
- IN_VIEW : 8, // 要素が視界に入った\r
- OUT_VIEW : 9,\r
+ VIEW_RESIZED : 5, // リサイズイベントのバブルアップは要素のレイアウトマネジャーでキャンセルされることも\r
+ IN_VIEW : 6, // 要素が視界に入った\r
+ OUT_VIEW : 7,\r
\r
- _NO_BUBLEUP : 10 //-- ここ以上はノード上をバブルアップ\r
+ POINTER_OUT : 8,\r
+ POINTER_IN : 9,\r
\r
- // USER_CLICK\r
- // USER_MOVE\r
- // USER_KEYDOWN\r
- // USER_KEYUP\r
+ // FOCUS\r
+ // DISABLED\r
+ // ENABLED\r
+\r
+/* -- Pointing Device Event -- */\r
+ _START_POINTER : 10,\r
+ \r
+ CONTEXT_MENU : 10, // rightclick or longtouch or menukey\r
+ \r
+/* -- ここよりあとははノード上をバブルアップ -- */\r
+ _NO_BUBLEUP : 10.5, \r
+ //\r
+ POINTER_START : 11,\r
+ POINTER_END : 12,\r
+ POINTER_MOVE : 13,\r
+ \r
+ SELECT : 14, // click or tap or enterkey\r
+ FILE_DRAG : 15,\r
+ \r
+/* -- Pointing Device Event -- */\r
+ _END_POINTER : 15,\r
+ \r
+ KEY_DOWN : 16,\r
+ KEY_UP : 17,\r
+ \r
+ SCROLL : 18,\r
+\r
+ CHANGE : 19,\r
+ SUBMIT : 20,\r
+ \r
+ IdToName : {},\r
+ NameToID : {}\r
+};\r
+\r
+if( window.navigator.msPointerEnabled ){\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_START ] = 'MSPointerDown';\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_END ] = 'MSPointerUp';\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_MOVE ] = 'MSPointerMove';\r
+ X.ViewEvent.NameToID[ 'MSPointerDown' ] = X.ViewEvent.POINTER_START;\r
+ X.ViewEvent.NameToID[ 'MSPointerUp' ] = X.ViewEvent.POINTER_END;\r
+ X.ViewEvent.NameToID[ 'MSPointerMove' ] = X.ViewEvent.POINTER_MOVE;\r
+} else\r
+if( ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch ){\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_START ] = 'touchstart';\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_END ] = 'touchend';\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_MOVE ] = 'touchmove';\r
+ X.ViewEvent.NameToID[ 'touchstart' ] = X.ViewEvent.POINTER_START;\r
+ X.ViewEvent.NameToID[ 'touchend' ] = X.ViewEvent.POINTER_END;\r
+ X.ViewEvent.NameToID[ 'touchmove' ] = X.ViewEvent.POINTER_MOVE;\r
+} else {\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_START ] = 'mousedown';\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_END ] = 'mouseup';\r
+ X.ViewEvent.IdToName[ X.ViewEvent.POINTER_MOVE ] = 'mousemove';\r
+ X.ViewEvent.NameToID[ 'mousedown' ] = X.ViewEvent.POINTER_START;\r
+ X.ViewEvent.NameToID[ 'mouseup' ] = X.ViewEvent.POINTER_END;\r
+ X.ViewEvent.NameToID[ 'mousemove' ] = X.ViewEvent.POINTER_MOVE;\r
};\r
+\r
var view = X.UA.IE ?\r
( document.compatMode !== "CSS1Compat" ? document.body : document.documentElement ) : window,\r
lock = 0, w = 0, h = 0,\r
- resize, delayResize, _timer;\r
+ resize, delayResize;\r
\r
/* -----------------------------------------------\r
* Document Ready\r
* Dean Edwards/Matthias Miller/John Resig\r
*/\r
function init(){\r
- if( _timer ){\r
- clearInterval( _timer );\r
- _timer = void 0;\r
+ var s;\r
+ if( X.View.ready ) return X.Cancel.UN_LISTEN;\r
+ if( s = init.script ){\r
+ s.parentNode.removeChild( s );\r
+ s.onreadystatechange = new Function();\r
+ s.onreadystatechange = null;\r
+ delete init.script;\r
};\r
- if( X.View.ready ) return;\r
+ init = void 0;\r
X.View.ready = true;\r
X.View.dispatch( { type : X.ViewEvent.SYS_READY, w : w, h : h } );\r
+ return X.Cancel.UN_LISTEN;\r
};\r
- /* for Mozilla/Opera9 */\r
+ /* for ie9+/Mozilla/Opera9 */\r
if( document.addEventListener ){\r
- document.addEventListener( "DOMContentLoaded", init, false );\r
- };\r
+ X.DomEvent.add( document, 'DOMContentLoaded', init );\r
+ // document.addEventListener( "DOMContentLoaded", init, false );\r
+ } else\r
if( 4 < X.UA.IE ){\r
+ // if this script in Head\r
document.write( "<script id=__ie_onload defer src=javascript:void(0)><\/script>" );\r
- var _script = document.getElementById( "__ie_onload" );\r
- _script.onreadystatechange = function(){\r
- if( this.readyState == "complete" ){\r
- this.parentNode.removeElement( this );\r
- this.onreadystatechange = new Function();\r
- this.onreadystatechange = null;\r
- _script = void 0;\r
- init();\r
- };\r
- }; \r
- };\r
+ init.script = document.getElementById( "__ie_onload" );\r
+ init.script.onreadystatechange = function(){\r
+ this.readyState === 'complete' && init();\r
+ };\r
+ } else\r
if( X.UA.WebKit ){ // sniff\r
- _timer = setInterval( function(){\r
- if( /loaded|complete/.test( document.readyState ) ) init();\r
- }, 10);\r
+ X.Timer.add( 10, function(){\r
+ if( !init ) return X.Cancel.UN_LISTEN;\r
+ if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return init();\r
+ });\r
};\r
\r
/* for other browsers */\r
\r
/* -----------------------------------------------\r
* Resize\r
- * uupaa\r
+ * uupaa.js\r
*/\r
function unlock(){ lock = 0; };\r
\r
\r
X.View.listenOnce( X.ViewEvent.SYS_READY, function(){\r
if( X.UA.IE ){\r
- X.Timer.add( 100, 0, resize );\r
+ X.Timer.add( 100, resize );\r
} else {\r
X.DomEvent.add( window, 'resize', resize );\r
};\r