<meta name="viewport" id="dynamic-viewport" content="width=device-width,target-densitydpi=device-dpi,initial-scale=1,user-scalable=0,maximum-scale=1,minimum-scale=1">\r
<link rel="stylesheet" type="text/css" media="all" href="css/xui.css">\r
\r
-<script type="text/javascript" src="js/00_core/00_builtin.js"></script>\r
-<script type="text/javascript" src="js/00_core/00_X.js"></script>\r
-<script type="text/javascript" src="js/00_core/01_XUa.js"></script>\r
-<script type="text/javascript" src="js/00_core/02_XType.js"></script>\r
-\r
-<script type="text/javascript" src="js/00_core/03_XCallback.js"></script>\r
-<script type="text/javascript" src="js/00_core/04_XClass.js"></script>\r
-<script type="text/javascript" src="js/00_core/05_XTimer.js"></script>\r
-<script type="text/javascript" src="js/00_core/06_XEventDispatcher.js"></script>\r
-<script type="text/javascript" src="js/00_core/07_XNotification.js"></script>\r
-\r
-<script type="text/javascript" src="js/01_dom/10_XDom.js"></script>\r
-<script type="text/javascript" src="js/01_dom/11_XDomDTD.js"></script>\r
-<script type="text/javascript" src="js/01_dom/11_XDomNode.js"></script>\r
-<script type="text/javascript" src="js/01_dom/12_XDomEvent.js"></script>\r
-<script type="text/javascript" src="js/01_dom/13_XDomBoxModel.js"></script>\r
-<script type="text/javascript" src="js/01_dom/14_XDomAttr.js"></script>\r
-<script type="text/javascript" src="js/01_dom/15_XDomStyle.js"></script>\r
-<script type="text/javascript" src="js/01_dom/17_XDomNodeList.js"></script>\r
-<script type="text/javascript" src="js/01_dom/18_XDomQuery.js"></script>\r
-<script type="text/javascript" src="js/01_dom/19_XDomParser.js"></script>\r
-<script type="text/javascript" src="js/01_dom/20_XDomImage.js"></script>\r
-<!--<script type="text/javascript" src="js/01_dom/22_XDomBuilder.js"></script>-->\r
+<script type="text/javascript" src="js/import.js"></script>\r
\r
<script type="text/javascript" src="js/10_ui/00_XUI.js"></script>\r
<script type="text/javascript" src="js/10_ui/02_XUI_Attr.js"></script>\r
} };\r
\r
var undefined,\r
- X = new Function( 'return X._shortcut && X._shortcut.apply( X._shortcut, arguments )' );\r
+ X = new Function( 'return X._shortcut && X._shortcut.apply( X._shortcut, arguments )' ),\r
+ X_TEMP = {};\r
\r
X.VERSION = '0.6.50';\r
\r
return ret;\r
};\r
\r
+X.deepCopy = function( src ){\r
+ function clone( src, objSrc, objCopy, n ) {\r
+ var ret, i, key;\r
+ if( !src ){ // 0, "", null, undefined, NaN, false\r
+ return src;\r
+ } else\r
+ if( X.Type.isArray( src ) ){\r
+ i = objSrc.indexOf( src );\r
+ if( i !== -1 ) return objCopy[ i ];\r
+ objSrc[ ++n ] = src;\r
+ objCopy[ n ] = ret = [];\r
+ } else\r
+ if( X.Type.isObject( src ) ){\r
+ i = objSrc.indexOf( src );\r
+ if( i !== -1 ) return objCopy[ i ];\r
+ objSrc[ ++n ] = src;\r
+ objCopy[ n ] = ret = {};\r
+ } else {\r
+ // string, number, true\r
+ return src;\r
+ };\r
+ for( key in src ){\r
+ ret[ key ] = clone( src[ key ], objSrc, objCopy, n );\r
+ };\r
+ return ret;\r
+ }; \r
+ return clone( src, [], [], -1 );\r
+};\r
+\r
+\r
+\r
+\r
X.copyArray = function( ary ){\r
var ret = [], i = ary.length;\r
if( !i ) return ret;\r
X_Class_DEF_LIST = [],\r
X_Class_PRIVATE_CLASS_LIST = [],\r
X_Class_PRIVATE_DEF_LIST = [],\r
+ X_Class_CALLING_SUPER = [],\r
+ X_Class_CALL_SUPER_STACK = [],\r
X_Class_killPrivateFlag = false,\r
X_Class_traits = null,\r
X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf\r
};\r
return instance;\r
};\r
-\r
+/* クラス定義を辿ってスーパークラスのコンストラクタを探す。\r
+ * 呼び出したコンストラクタは配列に控える。\r
+ * さらに呼ばれた場合、配列を元にさらに奥のコンストラクタを取得\r
+ * TODO 現在 new しているインスタンスを保持してチェックする\r
+ */\r
function X_Class_superConstructor(){\r
- var s = X_Class_getClassDef( this ).SuperConstructor;\r
- return s && s.apply( this, arguments );\r
+ var sClass = this,\r
+ i = X_Class_CALLING_SUPER.indexOf( sClass ),\r
+ n = -1,\r
+ l, sList, def, sConst, ret;\r
+\r
+ if( i === -1 ){\r
+ X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
+ X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
+ } else {\r
+ sList = X_Class_CALL_SUPER_STACK[ i ];\r
+ };\r
+ \r
+ while( sClass ){\r
+ def = X_Class_getClassDef( sClass );\r
+ sClass = def.SuperClass;\r
+ sConst = def.SuperConstructor;\r
+ if( sConst && sList[ ++n ] !== sConst ){\r
+ sList[ n ] = sConst;\r
+ ret = sConst.apply( this, arguments );\r
+ --sList.length;\r
+ if( !sList.length ){\r
+ X_Class_CALLING_SUPER.splice( i, 1 );\r
+ X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
+ };\r
+ return ret;\r
+ };\r
+ };\r
};\r
\r
console.log( 'X.Core.Class' );\r
\r
X.Event = {\r
COMPLETE : 1,\r
- SUCCESS : 2,\r
- ERROR : 3,\r
- PROGRESS : 4,\r
- BEFORE_CANCEL : 5,\r
- CANCELED : 6,\r
- TIMEOUT : 7,\r
- BEFORE_KILL_INSTANCE : 8,\r
- KILL_INSTANCE : 9,\r
- KILL_INSTANCE_CANCELED : 10,\r
- _LAST_EVENT : 10\r
+ READY : 2,\r
+ SUCCESS : 3,\r
+ ERROR : 4,\r
+ PROGRESS : 5,\r
+ BEFORE_CANCEL : 6,\r
+ CANCELED : 7,\r
+ TIMEOUT : 8,\r
+ BEFORE_KILL_INSTANCE : 9,\r
+ KILL_INSTANCE : 10,\r
+ KILL_INSTANCE_CANCELED : 11,\r
+ _LAST_EVENT : 11\r
};\r
\r
// ------------------------------------------------------------------------- //\r
* @param {Array=} opt_arg3\r
*/ \r
listening : function( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
- var list = this._listeners, unlistens, i, f, hash;\r
+ var list = this._listeners,\r
+ unlistens, i, f, hash;\r
+ \r
if( opt_type === undefined ) return !!list;\r
if( !list || !( list = list[ opt_type ] ) ) return false;\r
if( opt_arg1 === undefined ) return true;\r
if( !type ){\r
e = { type : type = e };\r
};\r
- e.target = e.target || this;\r
+ e.target = e.target || this;\r
+ e.currentTarget = e.currentTarget || this;\r
\r
++this._dispatching;\r
\r
if( r & X.Callback.STOP_NOW ){\r
sysOnly = true;\r
};\r
- ret |= r;\r
+ ret |= X.Type.isFinite( r ) ? r : 0;\r
};\r
\r
if( ( --this._dispatching ) === 0 ){\r
*/\r
function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){\r
var list = this._listeners,\r
- i, r, f;\r
+ i, raw, f;\r
\r
if( this._dispatching ){\r
if( !this._reserves ) this._reserves = [];\r
return this;\r
};\r
\r
- ( !list || !list[ type ] ) && X.Type.isString( type ) && X_EventDispatcher_actualAddEvent( this, type );\r
+ raw = this._rawObject || this._ie4getRawNode && this._ie4getRawNode();\r
+ raw && ( !list || !list[ type ] ) && X.Type.isString( type ) && X_EventDispatcher_actualAddEvent( this, type, raw );\r
\r
if( this.listening( type, opt_arg1, opt_arg2, opt_arg3 ) ) return this;\r
\r
*/\r
function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
var list = this._listeners,\r
- _list, reserves, unlistens, i, f;\r
+ _list, reserves, unlistens, i, f, raw;\r
if( !list ) return this;\r
\r
if( X.Type.isArray( opt_type ) ){\r
_list.splice( i, 1 );\r
if( !_list.length ){\r
delete this._listeners[ opt_type ];\r
- X.Type.isString( opt_type ) && X_EventDispatcher_actualRemoveEvent( this, opt_type );\r
+ raw = this._rawObject || this._ie4getRawNode && this._ie4getRawNode();\r
+ raw && X.Type.isString( opt_type ) && X_EventDispatcher_actualRemoveEvent( this, opt_type, raw );\r
if( X.isEmptyObject( this._listeners ) ) delete this._listeners;\r
};\r
};\r
// Days on the Moon DOM Events とブラウザの実装 \r
// http://nanto.asablo.jp/blog/2007/03/23/1339502\r
// Safari 2 では関数オブジェクトしか EventListener として使えませんが、Safari のナイトリービルドでは handleEvent メソッドを持つオブジェクトも EventListener として使えるようです。\r
- X_EventDispatcher_temp.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
- (function( that, type ){\r
- var raw = that._rawObject;\r
- if( !raw ) return; \r
- that._handleEvent = that._handleEvent || X.Callback.create( that, X_EventDispatcher_actualHandleEvent );\r
- type = X.Dom.Event.Rename[ type] || type;\r
- if( raw.addEventListener ){\r
- raw.addEventListener( type, that._handleEvent, false );\r
+ X_EventDispatcher_temp.EVENT_W3C /* && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) */ ? // Safari3-\r
+ (function( that, type, raw ){\r
+ var i;\r
+ \r
+ type = X.Dom.Event.Rename[ type ] || type;\r
+ \r
+ if( X.Type.isArray( type ) ){\r
+ for( i = type.length; i; ){\r
+ X_EventDispatcher_actualAddEvent( that, type[ --i ], raw );\r
+ };\r
} else {\r
- // Safari は Image, Opera7 は window\r
- raw[ 'on' + type ] = that._handleEvent;\r
- };\r
- }) :\r
- X_EventDispatcher_temp.EVENT_W3C ?\r
- (function( that, type ){\r
- if( that._rawObject ){\r
- that._handleEvent = that._handleEvent || X.Callback.create( that, X_EventDispatcher_actualHandleEvent );\r
- that._rawObject.addEventListener( X.Dom.Event.Rename[ type ] || type, that._handleEvent, false );\r
+ that._handleEvent || ( that._handleEvent = X.Callback.create( that, X_EventDispatcher_actualHandleEvent ) );\r
+ \r
+ if( raw.addEventListener ){\r
+ raw.addEventListener( type, that._handleEvent, false );\r
+ } else {\r
+ // Safari は Image, Opera7 は window\r
+ raw[ 'on' + type ] = that._handleEvent;\r
+ }; \r
};\r
}) :\r
X_EventDispatcher_temp.EVENT_IE ?\r
- (function( that, type ){\r
- var raw = that._rawObject;\r
- if( !raw ) return;\r
- type = X.Dom.Event.Rename[ type ] || type;\r
+ (function( that, type, raw ){\r
//if( type === 'load' && that._tag && X.Dom.Event._LOAD_FIX_TAGS[ that._tag ] ){\r
// type = 'readystatechange';\r
//};\r
// ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する\r
raw[ 'on' + type ] = X.Callback.create( that, X_EventDispatcher_dispatch, [ type ] );\r
} else {\r
- that._handleEvent = that._handleEvent || X.Callback.create( that, X_EventDispatcher_actualHandleEvent );\r
+ type = X.Dom.Event.Rename[ type ] || type;\r
\r
- if( raw.attachEvent ){\r
- raw.attachEvent( 'on' + type, that._handleEvent );\r
- } else {\r
- raw[ 'on' + type ] = that._handleEvent;\r
+ if( X.Type.isArray( type ) ){\r
+ for( i = type.length; i; ){\r
+ X_EventDispatcher_actualAddEvent( that, type[ --i ], raw );\r
+ };\r
+ } else{\r
+ that._handleEvent || ( that._handleEvent = X.Callback.create( that, X_EventDispatcher_actualHandleEvent ) );\r
+ \r
+ if( raw.attachEvent ){\r
+ raw.attachEvent( 'on' + type, that._handleEvent );\r
+ } else {\r
+ raw[ 'on' + type ] = that._handleEvent;\r
+ }; \r
}; \r
};\r
-\r
}) :\r
- (function( that, type ){\r
- var raw = that._rawObject || ( that._ie4getRawNode && that._ie4getRawNode() );\r
- if( !raw ) return;\r
- raw[ 'on' + ( X.Dom.Event.Rename[ type ] || type ) ] = that._handleEvent = that._handleEvent || X.Callback.create( that, X_EventDispatcher_actualHandleEvent );\r
+ (function( that, type, raw ){\r
+ var i;\r
+ type = X.Dom.Event.Rename[ type ] || type;\r
+ \r
+ if( X.Type.isArray( type ) ){\r
+ for( i = type.length; i; ){\r
+ X_EventDispatcher_actualAddEvent( that, type[ --i ], raw );\r
+ };\r
+ } else {\r
+ raw[ 'on' + type ] = that._handleEvent || ( that._handleEvent = X.Callback.create( that, X_EventDispatcher_actualHandleEvent ) );\r
+ };\r
});\r
\r
\r
var X_EventDispatcher_actualRemoveEvent =\r
- X_EventDispatcher_temp.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
- (function( that, type ){\r
- var raw = that._rawObject;\r
- if( !raw ) return;\r
+ X_EventDispatcher_temp.EVENT_W3C /*&& ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 )*/ ? // Safari3-\r
+ (function( that, type, raw, opt_skip ){\r
type = X.Dom.Event.Rename[ type ] || type;\r
\r
- if( raw.addEventListener ){ // Image\r
- raw.removeEventListener( type, that._handleEvent, false );\r
+ if( X.Type.isArray( type ) ){\r
+ for( i = type.length; i; ){\r
+ X_EventDispatcher_actualRemoveEvent( that, type[ --i ], raw, !!i );\r
+ };\r
} else {\r
- raw[ 'on' + type ] = null;\r
- };\r
- if( !that._listeners ){\r
- X.Callback._correct( that._handleEvent );\r
- delete that._handleEvent;\r
- };\r
- }) :\r
- X_EventDispatcher_temp.EVENT_W3C ?\r
- (function( that, type ){\r
- var raw = that._rawObject;\r
- if( !raw ) return;\r
- raw.removeEventListener( X.Dom.Event.Rename[ type ] || type, that._handleEvent, false );\r
- if( !that._listeners ){\r
- X.Callback._correct( that._handleEvent );\r
- delete that._handleEvent;\r
+ if( raw.addEventListener ){ // Image\r
+ raw.removeEventListener( type, that._handleEvent, false );\r
+ } else {\r
+ raw[ 'on' + type ] = null;\r
+ };\r
+ if( !opt_skip && !that._listeners ){\r
+ X.Callback._correct( that._handleEvent );\r
+ delete that._handleEvent;\r
+ }; \r
};\r
}) :\r
X_EventDispatcher_temp.EVENT_IE ?\r
- (function( that, type ){\r
- var raw = that._rawObject;\r
- if( !raw ) return;\r
- type = X.Dom.Event.Rename[ type ] || type;\r
+ (function( that, type, raw, opt_skip ){\r
+ var i;\r
//if( type === 'load' && that._tag && X.Dom.Event._LOAD_FIX_TAGS[ that._tag ] ){\r
// type = 'readystatechange';\r
//};\r
raw[ 'on' + type ] = X.emptyFunction;\r
raw[ 'on' + type ] = '';\r
} else {\r
- if( raw.attachEvent ){\r
- raw.detachEvent( 'on' + type, that._handleEvent );\r
+ type = X.Dom.Event.Rename[ type ] || type;\r
+ \r
+ if( X.Type.isArray( type ) ){\r
+ for( i = type.length; i; ){\r
+ X_EventDispatcher_actualRemoveEvent( that, type[ --i ], raw, !!i );\r
+ };\r
} else {\r
- raw[ 'on' + type ] = X.emptyFunction;\r
- raw[ 'on' + type ] = '';\r
+ if( raw.attachEvent ){\r
+ raw.detachEvent( 'on' + type, that._handleEvent );\r
+ } else {\r
+ raw[ 'on' + type ] = X.emptyFunction;\r
+ raw[ 'on' + type ] = '';\r
+ };\r
+ \r
+ if( !opt_skip && !that._listeners ){\r
+ X.Callback._correct( that._handleEvent );\r
+ delete that._handleEvent;\r
+ };\r
};\r
- \r
- if( !that._listeners ){\r
- X.Callback._correct( that._handleEvent );\r
- delete that._handleEvent;\r
- }; \r
};\r
}) :\r
- (function( that, type ){\r
- var raw = that._rawObject || ( that._ie4getRawNode && that._ie4getRawNode() );\r
- if( !raw ) return;\r
+ (function( that, type, raw, opt_skip ){\r
+ var i;\r
type = X.Dom.Event.Rename[ type ] || type;\r
- raw[ 'on' + type ] = X.emptyFunction;\r
- raw[ 'on' + type ] = '';\r
- if( !that._listeners ){\r
- X.Callback._correct( that._handleEvent );\r
- delete that._handleEvent;\r
+ if( X.Type.isArray( type ) ){\r
+ for( i = type.length; i; ){\r
+ X_EventDispatcher_actualRemoveEvent( that, type[ --i ], raw, !!i );\r
+ };\r
+ } else {\r
+ raw[ 'on' + type ] = X.emptyFunction;\r
+ raw[ 'on' + type ] = '';\r
+ if( !opt_skip && !that._listeners ){\r
+ X.Callback._correct( that._handleEvent );\r
+ delete that._handleEvent;\r
+ };\r
};\r
});\r
\r
// Is this in regard to the Safari 1.x preventDefault bug on click/dblclick?\r
// https://groups.google.com/forum/#!msg/comp.lang.javascript/uYEuCHjHxnw/yKoHtZJPa1QJ\r
var X_EventDispatcher_actualHandleEvent =\r
- X.UA.IE4 || X.UA.IE5678 ? // ie45678 EVENT_IE & EVENT_DOM0 for ie4\r
+ X.UA.IE4 || X_EventDispatcher_temp.EVENT_IE ? // ie45678 EVENT_IE & EVENT_DOM0 for ie4\r
(function(){\r
var ret;\r
\r
- if( event.type === 'readystatechange' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){\r
+ //if( event.type === 'readystatechange' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){\r
//type = 'readystatechange';\r
- };\r
+ //};\r
\r
- ret = X_EventDispatcher_dispatch.call( this, new X.Dom.Event( event, this, this._rawObject ) );\r
+ ret = this.dispatch( new X.Dom.Event( event, this, this._rawObject ) );\r
\r
if( ret & X.Callback.STOP_PROPAGATION ){\r
event.cancelBubble = true;\r
}) :\r
//X.Dom.EVENT_W3C & EVENT_DOM0\r
(function( e ){\r
- var ret = X_EventDispatcher_dispatch.call( this, new X.Dom.Event( e, this ) );\r
+ var ev = new X.Dom.Event( e, this ),\r
+ ret = X.Callback.NONE,\r
+ i, l;\r
+ \r
+ // touch event -> pointer\r
+ if( X.Type.isArray( ev ) ){\r
+ if( ev.length === 0 ){\r
+ // TouchEvent の後に発生した MouseEvent のキャンセル\r
+ ret = X.Callback.STOP_PROPAGATION | X.Callback.PREVENT_DEFAULT;\r
+ } else {\r
+ for( i = 0, l = ev.length; i < l; ++i ){\r
+ ret |= this.dispatch( ev[ i ] ) || 0;\r
+ }; \r
+ };\r
+ } else {\r
+ ret = this.dispatch( ev );\r
+ };\r
\r
if( ret & X.Callback.STOP_PROPAGATION ){\r
e.stopPropagation();\r
};\r
\r
// イベントの退避、dom が画面から抜かれる場合に実施しておく\r
-function X_EventDispatcher_migrateEvent( that ){\r
- var hash = that._listeners,\r
- type;\r
- if( !hash ) return;\r
- for( type in hash ){\r
- // 数字イベントの除外\r
- '' + parseFloat( type ) !== type && X_EventDispatcher_actualRemoveEvent( that, type );\r
- };\r
-};\r
-\r
// 退避したイベントの復帰\r
-function X_EventDispatcher_restoreEvent( that ){\r
+function X_EventDispatcher_toggleAllEvents( that, add ){\r
var hash = that._listeners,\r
+ raw = that._rawObject || that._ie4getRawNode && that._ie4getRawNode(),\r
+ f = add ? X_EventDispatcher_actualAddEvent : X_EventDispatcher_actualRemoveEvent,\r
type;\r
- if( !hash ) return;\r
+ if( !hash || !raw ) return;\r
for( type in hash ){\r
// 数字イベントの除外\r
- '' + parseFloat( type ) !== type && X_EventDispatcher_actualAddEvent( that, type );\r
+ '' + parseFloat( type ) !== type && f( that, type, raw );\r
};\r
};\r
\r
_getSize :\r
X.UA.IE ?\r
new Function( 'return[X.Dom._root.clientWidth,X.Dom._root.clientHeight]' ) :\r
- 4 <= X.UA.iOS ?\r
- new Function( 'return[window.innerWidth,window.innerHeight]' ) :\r
new Function( 'return[window.innerWidth,window.innerHeight]' ),\r
\r
getSize : function(){\r
X.Dom.EVENT_POINTER = navigator.msPointerEnabled || navigator.pointerEnabled;\r
X.Dom.EVENT_TOUCH = !X.Dom.EVENT_POINTER && window.ontouchstart !== undefined;\r
\r
-X.Dom.moveToHead = {\r
- STYLE : true,\r
- LINK : true,\r
- TITLE : true,\r
- BGSOUND : true,\r
- AREA : true,\r
- BASE : true,\r
- META : true\r
-};\r
\r
-X.Dom.cleanupTagNames = {\r
- SCRIPT : true,\r
- NOSCRIPT : true,\r
- NOFRAMES : true,\r
- '!' : true, // ie\r
- COMMENT : true, // ie\r
- NOEMBED : true,\r
- NOLAYER : true\r
- };\r
-X.Dom.skipCleanupTagNames = {\r
- PRE : true,\r
- TEXTAREA : true,\r
- CODE : true,\r
- KBD : true,\r
- SAMP : true,\r
- XMP : true,\r
- PLAINTEXT : true,\r
- LISTING : true\r
-};\r
\r
X.Dom.CRLF = String.fromCharCode( 13 ) + String.fromCharCode( 10 );\r
\r
ss = '//',\r
_ary, ary, i = 0;\r
\r
- if( 'http:file'.indexOf( path.substr( 0, 4 ) ) !== -1 ) return path;\r
+ if( 'http:file:https:'.indexOf( path.substr( 0, 4 ) ) !== -1 ) return path;\r
\r
_ary = X.Dom.baseURL.split( ss );\r
ary = _ary[ 1 ].split( s );\r
\r
+/* なんで */\r
X.Dom.DTD = {\r
\r
EMPTY : {\r
}\r
};\r
\r
+X.Dom.moveToHead = {\r
+ STYLE : true,\r
+ LINK : true,\r
+ TITLE : true,\r
+ BGSOUND : true,\r
+ AREA : true,\r
+ BASE : true,\r
+ META : true\r
+};\r
+\r
+X.Dom.cleanupTagNames = {\r
+ SCRIPT : true,\r
+ NOSCRIPT : true,\r
+ NOFRAMES : true,\r
+ '!' : true, // ie\r
+ COMMENT : true, // ie\r
+ NOEMBED : true,\r
+ NOLAYER : true\r
+};\r
\r
+X.Dom.skipCleanupTagNames = {\r
+ PRE : true,\r
+ TEXTAREA : true,\r
+ CODE : true,\r
+ KBD : true,\r
+ SAMP : true,\r
+ XMP : true,\r
+ PLAINTEXT : true,\r
+ LISTING : true\r
+};\r
};\r
// src の onload があるので先ではないか?\r
// ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
- X_EventDispatcher_restoreEvent( this );// イベントの復帰\r
+ X_EventDispatcher_toggleAllEvents( this, true );// イベントの復帰\r
}) :\r
X.Dom.DOM_IE4 ? (function(){\r
var xnodes, i;\r
this._ie4getRawNode().style.filter = X.Dom.Style.SPECIAL_FIX( this._css );\r
};\r
delete this._dirty;\r
- X_EventDispatcher_restoreEvent( this );// イベントの復帰\r
+ X_EventDispatcher_toggleAllEvents( this, true );// イベントの復帰\r
}) :\r
(function(){});\r
\r
};\r
\r
if( !elm ) return;\r
- this._xnodeType === 1 && X_EventDispatcher_migrateEvent( this );// イベントの退避\r
+ this._xnodeType === 1 && X_EventDispatcher_toggleAllEvents( this, false );// イベントの退避\r
// elm.parentNode.tagName for ie7\r
if( !X.UA.MacIE ){\r
!isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
};\r
\r
if( !elm ) return;\r
- this._xnodeType === 1 && X_EventDispatcher_migrateEvent( this );// イベントの退避\r
+ this._xnodeType === 1 && X_EventDispatcher_toggleAllEvents( this, false );// イベントの退避\r
\r
if( X.Dom.Attr.HAS_VALUE[ this._tag ] && ( !this._newAttrs || !X.inObject( 'value', this._newAttrs ) ) ){\r
this._attrs.value = elm.value;\r
* http://d.hatena.ne.jp/uupaa/20100430/1272561922\r
* event.offsetX と offsetY の互換性について\r
* \r
+ * http://www.keynavi.net/ja/tipsj/gokan.html\r
+ * Safari : マウスイベントは大丈夫ですが ページ全体に対するキーイベントをきちんと扱えない問題があります。 \r
+ * その他、リンクに対するフォーカス(element.focus())の動作がおかしい、 スクリーン上のマウス位置(event.screenX/Y)をブラウザ画面の 左下隅から計算する などの問題があり修正が待たれます。 \r
+ * \r
*/\r
\r
+// http://msdn.microsoft.com/ja-jp/library/ie/dn255104%28v=vs.85%29.aspx\r
+var X_Dom_Event_devicePixelRatio = window.devicePixelRatio || ( window.screen.deviceXDPI / window.screen.logicalXDPI ),\r
+ X_Dom_Event_convertMSPointerType = window.MSPointerEvent && {\r
+ 2 : 'touch',\r
+ 3 : 'pen',\r
+ 4 : 'mouse'\r
+ };\r
+\r
if( !X.UA.IE || 9 <= X.UA.IE ){\r
X.Dom.Event = function( e, xnode ){\r
- var touch0;\r
- //this._event = e;\r
- this.type = X.Dom.Event.RenameTo[ e.type ] || e.type;\r
- \r
- //http://www.quirksmode.org/js/events_properties.html\r
- if( e.target ){\r
- this.target = Node._getXNode( e.target.nodeType === 3 ? e.target.parentNode : e.target );// defeat Safari bug // xnode\r
- };\r
- if( e.relatedTarget ){\r
- this.relatedTarget = Node._getXNode( e.relatedTarget.nodeType === 3 ? e.relatedTarget.parentNode : e.relatedTarget ); // xnode\r
- };\r
- \r
- this.currentTarget = xnode; // xnode\r
- this.eventPhase = e.eventPhase;\r
- \r
- this.clientX = e.clientX;\r
- this.clientY = e.clientY;\r
- //this.screenX = e.screenX;\r
- //this.screenY = e.screenY;\r
- this.pageX = e.pageX;\r
- this.pageY = e.pageY;\r
- this.offsetX = e.offsetX || e.layerX || 0; // 要素上の座標を取得 \r
- this.offsetY = e.offsetY || e.layerY || 0;\r
- \r
- this.keyCode = e.keyCode;\r
- this.altKey = e.altKey;\r
- this.ctrlKey = e.ctrlKey;\r
- this.shiftKey = e.shiftKey;\r
- \r
- // http://www.programming-magic.com/20090127231544/\r
- this.which = e.which || ( e.button + 1 ); // 左:1, 中:2, 右:3\r
- this.button = e.button;\r
+ var _type = e.type,\r
+ type,\r
+ changedTouches, targetTouches, targetIDs, changedTargets, isEnd,\r
+ altKey, ctrlKey, metaKey, shiftKey, target, related,\r
+ i, n, time, touch, ev;\r
\r
- // https://developer.mozilla.org/ja/docs/DOM/DOM_event_reference/mousewheel\r
+ //this._event = e;\r
+ this.type = type = X.Dom.Event.RenameTo[ _type ] || _type;\r
\r
- // TODO\r
- // axis\r
- // https://w3g.jp/blog/tools/wheelevent_crossbrowser\r
- // ホイール系イベント2014年版クロスブラウザ\r
- if( e.deltaY !== undefined ){\r
- this.deltaX = e.deltaX;\r
- this.deltaY = e.deltaY;\r
- } else\r
- if( e.wheelDeltaY !== undefined ){\r
- this.deltaX = e.wheelDeltaX / 120;\r
- this.deltaY = e.wheelDeltaY / 120;\r
- } else\r
- if( e.wheelDelta !== undefined ){\r
- this.deltaX = 0;\r
- this.deltaY = e.wheelDelta / -120;\r
+ // http://msdn.microsoft.com/ja-jp/library/ie/dn304886%28v=vs.85%29.aspx\r
+ // ポインター イベントの更新\r
+ if( e.pointerType ){\r
+ // PointerEvent;\r
+ if( X_Dom_Event_convertMSPointerType ){\r
+ this.pointerType = X_Dom_Event_convertMSPointerType[ e.pointerType ];\r
+ this.pressure = e.pressure || ( e.button !== -1 ? 0.5 : 0 );\r
+ // ポインターの接触形状の スクリーン ピクセル単位の幅と高さ なので変換。(多分、、、)\r
+ this.width = e.width / X_Dom_Event_devicePixelRatio;\r
+ this.height = e.height / X_Dom_Event_devicePixelRatio; \r
+ } else {\r
+ this.pointerType = e.pointerType;\r
+ this.pressure = e.pressure;\r
+ // ポインターの接触形状の CSS ピクセル単位の幅と高さ。\r
+ this.width = e.width;\r
+ this.height = e.height;\r
+ };\r
+\r
+ switch( this.pointerType ){\r
+ case 'pen' :\r
+ //Y-Z 平面と、ペンの軸が含まれる平面の間の角度を返します。Y 軸の範囲は -90 ~ +90 です。X の傾きの正の方向は右方向です。\r
+ this.tiltX = e.tiltX;\r
+ this.tiltY = e.tiltY;\r
+ if( _type === 'MSPointerHover' ){\r
+ this.type = 'pointermove'; // ie10 には pointerhover と pointermoveがあり、ie11 で一本化。ie11 では buttons を見て hover 状態を判定\r
+ };\r
+ case 'touch' :\r
+ this.radiusX = e.radiusX;\r
+ this.radiusY = e.radiusY;\r
+ this.rotationAngle = e.rotationAngle;\r
+ case 'mouse' :\r
+ };\r
+ \r
+ this.button = e.button;\r
+ this.buttons = e.buttons;\r
+ \r
+ this.pointerId = e.pointerId; \r
+ this.target = Node._getXNode( e.target );\r
+ this.relatedTarget = Node._getXNode( e.relatedTarget ); // xnode\r
+ this.isPrimary = e.isPrimary;\r
+ this.hwTimestamp = e.hwTimestamp;\r
+ this.timestamp = e.timestamp;\r
+\r
+ this.altKey = e.altKey;\r
+ this.ctrlKey = e.ctrlKey;\r
+ this.metaKey = e.metaKey;\r
+ this.shiftKey = e.shiftKey;\r
+ //this.screenX = touch.screenX;\r
+ //this.screenY = touch.screenY;\r
+ this.clientX = e.clientX;\r
+ this.clientY = e.clientY;\r
+ this.pageX = e.pageX;\r
+ this.pageY = e.pageY;\r
+ this.offsetX = e.offsetX;\r
+ this.offsetY = e.offsetY;\r
} else\r
- if( e.detail !== undefined ){\r
- this.deltaX = 0;\r
- this.deltaY = e.type === 'MozMousePixelScroll' ? e.detail / 45 : e.detail / 3; // 3\r
+ if( X.Dom.Event.toPointer[ _type ] ){\r
+ // Touch or Mouse\r
+ \r
+ /* e.constructor === window.TouchEvent -> e.touches for iOS3.13 */\r
+ if( touches = e.changedTouches ){\r
+ if( touches.length === 0 ){\r
+ alert( 'e.changedTouches.length === 0' );\r
+ };\r
+ xnode._cancelMouse = type;\r
+ \r
+ events = [];\r
+ altKey = e.altKey;\r
+ ctrlKey = e.ctrlKey;\r
+ metaKey = e.metaKey;\r
+ shiftKey = e.shiftKey;\r
+ time = X.getTime();\r
+ for( i = touches.length; i; ){\r
+ touch = touches[ --i ];\r
+ target = touch.target;\r
+ related = touch.relatedTarget;\r
+ events[ i ] = {\r
+ type : type,\r
+ pointerType : 'touch',\r
+ target : Node._getXNode( target.nodeType === 3 ? target.parentNode : target ),// defeat Safari bug // xnodetouch.target,\r
+ currentTarget : xnode,\r
+ relatedTarget : Node._getXNode( related.nodeType === 3 ? related.parentNode : related ), // xnode\r
+ isPrimary : true,\r
+ hwTimestamp : time,\r
+ timestamp : time,\r
+ buttons : e.button,\r
+ buttons : e.buttons || e.button,\r
+ altKey : altKey,\r
+ ctrlKey : ctrlKey,\r
+ metaKey : metaKey,\r
+ shiftKey : shiftKey,\r
+ pointerId : touch.identifier + 2,\r
+ //screenX : touch.screenX,\r
+ //screenY : touch.screenY,\r
+ clientX : touch.clientX,\r
+ clientY : touch.clientY,\r
+ pageX : touch.pageX,\r
+ pageY : touch.pageY,\r
+ offsetX : touch.offsetX, // 要素上の座標を取得 \r
+ offsetY : touch.offsetY,\r
+ radiusX : touch.radiusX || 0,\r
+ radiusY : touch.radiusY || 0,\r
+ rotationAngle : touch.rotationAngle || 0,\r
+ pressure : touch.force || touch.webkitForce || ( isEnd ? 0 : 0.5 ),\r
+ width : touch.width || 0,\r
+ height : touch.height || 0\r
+ };\r
+ };\r
+ return events.length === 1 ? events[ 0 ] : events;\r
+ } else {\r
+ \r
+ if( xnode._cancelMouse === type ){\r
+ delete xnode._cancelMouse;\r
+ return [];\r
+ };\r
+ \r
+ // MouseEvent;\r
+ this.type = type;\r
+ this.pointerType = 'mouse';\r
+ \r
+ // http://www.programming-magic.com/20090127231544/\r
+ // TODO Opera で button==2の場合、コンテキストメニューイベントを発火 「ツール」->「設定」->「詳細設定」->「コンテンツ」->「Javascriptオプション」で「右クリックを制御するスクリプトを許可する」\r
+ this.button = e.button !== undefined ? e.button :\r
+ e.which !== undefined ? e.which - 1 : -1;\r
+ this.buttons = e.buttons !== undefined ? e.buttons : this.button === 0 ? 1 : this.button === 1 ? 2 : this.button === 2 ? 4 : 0;\r
+ this.pressure = ( this.button !== -1 ? 0.5 : 0 );\r
+ \r
+ elm = e.target;\r
+ this.target = Node._getXNode( elm.nodeType === 3 ? elm.parentNode : elm );// defeat Safari bug // xnodetouch.target;\r
+ this.isPrimary = true;\r
+ this.hwTimestamp = this.timestamp = X.getTime(); \r
+ this.altKey = e.altKey;\r
+ this.ctrlKey = e.ctrlKey;\r
+ this.metaKey = e.metaKey;\r
+ this.shiftKey = e.shiftKey;\r
+ this.pointerId = 1;\r
+ //this.screenX = touch.screenX;\r
+ //this.screenY = touch.screenY;\r
+ // TODO http://uupaa-js.googlecode.com/svn-history/r8/trunk/doc/reference/symbols/src/trunk_uu.module.ui.js.html\r
+ // Safari2ではclientX,YはpageX,Yと同じ値を返す\r
+ this.clientX = e.clientX;\r
+ this.clientY = e.clientY;\r
+ this.pageX = e.pageX;\r
+ this.pageY = e.pageY;\r
+ this.offsetX = e.offsetX || e.layerX; // 要素上の座標を取得 \r
+ this.offsetY = e.offsetY || e.layerY;\r
+ };\r
} else {\r
- this.deltaX = this.deltaY = 0;\r
- };\r
- \r
- if( /* e.constructor === window.TouchEvent || */ e.touches /* for iOS3.13 */ ){\r
- // TouchEvent\r
- this.touches = e.touches;\r
- this.changedTouches = e.changedTouches;\r
- this.targetTouches = e.targetTouches;\r
- this.metaKey = e.metaKey;\r
- this.force = e.force || e.webkitForce || 0;\r
- //\r
- if( this.touches.length ){\r
- touch0 = this.touches[ 0 ];\r
- this.clientX = touch0.clientX;\r
- this.clientY = touch0.clientY;\r
- this.pageX = touch0.pageX;\r
- this.pageY = touch0.pageY;\r
- this.offsetX = touch0.offsetX || touch0.layerX;\r
- this.offsetY = touch0.offsetY || touch0.layerY;\r
+ // Other\r
+ \r
+ this.keyCode = e.keyCode || e.which;\r
+ this.altKey = e.altKey;\r
+ this.ctrlKey = e.ctrlKey;\r
+ this.shiftKey = e.shiftKey;\r
+ this.metaKey = e.metaKey;\r
+ \r
+ this.button = e.button !== undefined ? e.button :\r
+ e.which !== undefined ? e.which - 1 : -1;\r
+ this.buttons = e.buttons !== undefined ? e.buttons : this.button === 0 ? 1 : this.button === 1 ? 2 : this.button === 2 ? 4 : 0;\r
+ \r
+ //http://www.quirksmode.org/js/events_properties.html\r
+ if( elm = e.target ){\r
+ this.target = Node._getXNode( elm.nodeType === 3 ? elm.parentNode : elm );// defeat Safari bug // xnode\r
};\r
- } else\r
- if( e.constructor === window.PointerEvent ){\r
- // PointerEvent;\r
- this.currentPoint = e.currentPoint;\r
- this.width = e.width;\r
- this.height = e.height;\r
- this.timeStamp = e.timeStamp;\r
- this.hwTimestamp = e.hwTimestamp;\r
- this.intermediatePoints = e.intermediatePoints;\r
- this.isPrimary = e.isPrimary;\r
- this.pointerId = e.pointerId;\r
- this.pointerType = e.pointerType;\r
- this.pressure = e.pressure;\r
- this.tiltX = e.tiltX;\r
- this.tiltY = e.tiltY;\r
+ if( elm = e.relatedTarget ){\r
+ this.relatedTarget = Node._getXNode( elm.nodeType === 3 ? elm.parentNode : elm ); // xnode\r
+ };\r
+ \r
+ if( type === 'wheel' ){\r
+ // https://developer.mozilla.org/ja/docs/DOM/DOM_event_reference/mousewheel\r
+ // TODO axis\r
+ // https://w3g.jp/blog/tools/wheelevent_crossbrowser\r
+ // ホイール系イベント2014年版クロスブラウザ\r
+ if( e.deltaY !== undefined ){\r
+ this.deltaX = e.deltaX;\r
+ this.deltaY = e.deltaY;\r
+ this.deltaZ = e.deltaZ;\r
+ } else\r
+ if( e.wheelDeltaY !== undefined ){\r
+ this.deltaX = e.wheelDeltaX / 120;\r
+ this.deltaY = e.wheelDeltaY / 120;\r
+ this.deltaZ = e.wheelDeltaZ / 120 || 0;\r
+ } else\r
+ if( e.wheelDelta !== undefined ){\r
+ this.deltaX = this.deltaZ = 0;\r
+ this.deltaY = e.wheelDelta / -120;\r
+ } else\r
+ if( e.detail !== undefined ){\r
+ this.deltaX = this.deltaZ = 0;\r
+ this.deltaY = _type === 'MozMousePixelScroll' ? e.detail / 45 : e.detail / 3; // 3\r
+ } else {\r
+ this.deltaX = this.deltaY = this.deltaZ = 0;\r
+ };\r
+ }; \r
};\r
- };\r
- if( !window.PointerEvent && window.MSPointerEvent ){\r
- window.PointerEvent = window.MSPointerEvent;\r
+\r
+ this.currentTarget = xnode; // xnode\r
+ this.eventPhase = e.eventPhase;\r
+ this.detail = e.detail;\r
+ \r
};\r
} else {\r
- X.Dom.Event = function( e, xnode, element, opt_type ){\r
+ X.Dom.Event = function( e, xnode, element ){\r
var btn;\r
\r
- //this._event = e;\r
- this.type = X.Dom.Event.RenameTo[ e.type ] || e.type || opt_type;\r
+ this.type = X.Dom.Event.RenameTo[ e.type ] || e.type;\r
this.target = Node._getXNode( e.srcElement ); // xnode\r
if( this.target && this.target._xnodeType === 3 ) this.target = this.target.parent; // ie4 の fake Textnode がヒットしていないか?\r
this.currentTarget = xnode; // xnode\r
- this.relatedTarget = Node._getXNode( e.formElement ? e.formElement : e.toElement ); // xnode\r
+ this.relatedTarget = Node._getXNode( e.formElement || e.toElement ); // xnode\r
this.eventPhase = e.srcElement === element ? 2: 3;\r
\r
- this.clientX = e.clientX;\r
- this.clientY = e.clientY;\r
- //this.screenX = e.screenX;\r
- //this.screenY = e.screenY;\r
- \r
- if( X.Dom._root ){ // uuu...\r
- \r
- this.pageX = e.clientX + X.Dom._root.scrollLeft;\r
- this.pageY = e.clientY + X.Dom._root.scrollTop;\r
- \r
- // DOMAssistant 2.8.1\r
- //event.pageX = DOMAssistant.def(e.pageX)? e.pageX : (event.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0));\r
- //event.pageY = DOMAssistant.def(e.pageY)? e.pageY : (event.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0)); \r
- };\r
- \r
-\r
- \r
- if( 5 <= X.UA.IE ){\r
- this.offsetX = e.offsetX; // イベントターゲット左上からの座標\r
- this.offsetY = e.offsetY; \r
- }// else\r
- //if( e.srcElement ){\r
- // this.offsetX = e.x - e.srcElement.offsetLeft; // e.x はイベント発生要素の親要素を基準にした座標。\r
- // this.offsetY = e.y - e.srcElement.offsetTop; \r
- //};\r
- \r
this.keyCode = e.keyCode;\r
this.altKey = e.altKey;\r
this.ctrlKey = e.ctrlKey;\r
- this.shiftKey = e.shiftKey;\r
- \r
+ this.shiftKey = e.shiftKey; \r
+\r
// http://www.programming-magic.com/20090127231544/\r
switch( this.type ){\r
case 'click' :\r
case 'dblclick' :\r
- this.which = 1;\r
+ this.button = 0;\r
break;\r
case 'contextmenu' :\r
- this.which = 3;\r
+ this.button = 2;\r
break;\r
default :\r
+ // mouseup, mousedown\r
btn = e.button;\r
- this.which =\r
- btn & 1 ? 1 :\r
+ this.button =\r
+ btn & 1 ? 0 :\r
btn & 4 ? 2 :\r
- btn & 2 ? 3 : 0; // 左:1(click:0), 中:4, 右:2\r
+ btn & 2 ? 1 : -1; // 左:1(click:0), 中:4, 右:2\r
+ \r
+ };\r
+ this.buttons = e.button;\r
+ \r
+ if( type = X.Dom.Event.toPointer[ e.type ] ){\r
+ this.type = type;\r
+ this.clientX = e.clientX;\r
+ this.clientY = e.clientY;\r
+ //this.screenX = e.screenX;\r
+ //this.screenY = e.screenY;\r
+ \r
+ //if( X.Dom._root ){ // uuu...\r
+ this.pageX = e.clientX + X.Dom._root.scrollLeft;\r
+ this.pageY = e.clientY + X.Dom._root.scrollTop;\r
+ // DOMAssistant 2.8.1\r
+ //event.pageX = DOMAssistant.def(e.pageX)? e.pageX : (event.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0));\r
+ //event.pageY = DOMAssistant.def(e.pageY)? e.pageY : (event.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0)); \r
+ //};\r
+\r
+ if( 5 <= X.UA.IE ){\r
+ this.offsetX = e.offsetX; // イベントターゲット左上からの座標\r
+ this.offsetY = e.offsetY; \r
+ }// else\r
+ //if( e.srcElement ){\r
+ // this.offsetX = e.x - e.srcElement.offsetLeft; // e.x はイベント発生要素の親要素を基準にした座標。\r
+ // this.offsetY = e.y - e.srcElement.offsetTop; \r
+ //};\r
+\r
+ this.deltaX = 0;\r
+ this.deltaY = e.wheelDelta / -120;\r
+ \r
+ this.pointerId = 1;\r
+ this.radiusX = 0;\r
+ this.radiusY = 0;\r
+ this.rotationAngle = 0;\r
+ this.width = 0;\r
+ this.height = 0;\r
+ this.tiltX = 0;\r
+ this.tiltY = 0;\r
};\r
- this.button = this.which - 1;\r
- this.deltaX = 0;\r
- this.deltaY = e.wheelDelta / -120;\r
- \r
- if( this.type === 'wheel' ) console.log( e.wheelDelta );\r
};\r
};\r
\r
//LINK : true\r
};\r
\r
-X.Dom.Event.Rename = {};\r
-X.Dom.Event.RenameTo = {};\r
+X.Dom.Event.Rename = {};\r
+X.Dom.Event.RenameTo = {};\r
+X.Dom.Event.toPointer = !X.Dom.EVENT_POINTER && ( X.Dom.EVENT_TOUCH ?\r
+ {\r
+ touchdown : 'pointerdown',\r
+ mousedown : 'pointerdown',\r
+ touchup : 'pointerup', \r
+ mouseup : 'pointerup',\r
+ touchmove : 'pointermove',\r
+ mousemove : 'pointermove',\r
+ touchcancel : 'pointercancel',\r
+ contextmenu : 'contextmenu',\r
+ dbclick : 'dbclick',\r
+ click : 'click',\r
+ tap : 'click'\r
+ } :\r
+ {\r
+ mousedown : 'pointerdown',\r
+ mouseup : 'pointerup',\r
+ mousemove : 'pointermove',\r
+ contextmenu : 'contextmenu',\r
+ dbclick : 'dbclick',\r
+ click : 'click'\r
+ });\r
+\r
+\r
// https://github.com/georgeadamson/jQuery.prefixfree-events/blob/master/jQuery.prefixfree-events.js\r
// https://developer.mozilla.org/en-US/docs/Web/Events/wheel\r
//\r
if( document.onwheel === undefined ){\r
// DOMMoseScroll\r
if( X.UA.Gecko && window.MouseScrollEvent ){\r
- if( 2 <= X.UA.Gecko || ( 1.9 < X.UA.Gecko && 1 <= X.UA.GeckoPatch ) ){ // Gecko 1.9.1+ (firefox3.5+)\r
+ if( 2 <= X.UA.Gecko || ( 1.9 <= X.UA.Gecko && 1 <= X.UA.GeckoPatch ) ){ // Gecko 1.9.1+ (firefox3.5+)\r
console.log( 'wheel <= MozMousePixelScroll' );\r
X.Dom.Event.Rename[ 'wheel' ] = 'MozMousePixelScroll';\r
} else\r
- if( 0.9 < X.UA.Gecko && 7 <= X.UA.GeckoPatch ){ // Gecko 0.9.7+ (NN6.2+?)\r
+ if( 1 <= X.UA.Gecko || ( 0.9 <= X.UA.Gecko && 7 <= X.UA.GeckoPatch ) ){ // Gecko 0.9.7+ (NN6.2+?)\r
console.log( 'wheel <= DOMMouseScroll' );\r
X.Dom.Event.Rename[ 'wheel' ] = 'DOMMouseScroll';\r
};\r
} else {\r
X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel';\r
};\r
- if( document.onmousewheel !== undefined ){ // Opera で判定失敗\r
- X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel';\r
- };\r
+ //if( document.onmousewheel !== undefined ){ // Opera で判定失敗する\r
+ // X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel';\r
+ //};\r
};\r
\r
\r
X.Dom.Event.Rename[ 'transitionend' ] = 'mozTransitionEnd';\r
};\r
\r
-\r
-if( navigator.msPointerEnabled && !navigator.pointerEnabled ){\r
- console.log( 'pointerdown <= MSPointerDown' );\r
- X.Dom.Event.Rename[ 'pointerdown' ] = 'MSPointerDown';\r
- X.Dom.Event.Rename[ 'pointerup' ] = 'MSPointerUp';\r
- X.Dom.Event.Rename[ 'pointermove' ] = 'MSPointerMove';\r
- X.Dom.Event.Rename[ 'pointercancel' ] = 'MSPointerCancel';\r
+if( !navigator.pointerEnabled ){\r
+ if( navigator.msPointerEnabled ){\r
+ console.log( 'pointerdown <= MSPointerDown' );\r
+ X.Dom.Event.Rename[ 'pointerdown' ] = 'MSPointerDown';\r
+ X.Dom.Event.Rename[ 'pointerup' ] = 'MSPointerUp';\r
+ X.Dom.Event.Rename[ 'pointermove' ] = [ 'MSPointerMove', 'MSPointerHover' ];// ie10 と ie11 でペンのhoverevent の値が異なる\r
+ X.Dom.Event.Rename[ 'pointercancel' ] = 'MSPointerCancel';\r
+ // http://msdn.microsoft.com/ja-jp/library/ie/dn304886%28v=vs.85%29.aspx\r
+ } else\r
+ if( X.Dom.EVENT_TOUCH ){\r
+ X.Dom.Event.Rename[ 'pointerdown' ] = [ 'touchdown', 'mousedown' ];\r
+ X.Dom.Event.Rename[ 'pointerup' ] = [ 'touchup', 'mouseup' ];\r
+ X.Dom.Event.Rename[ 'pointermove' ] = [ 'touchmove', 'mousemove' ];\r
+ X.Dom.Event.Rename[ 'pointercancel' ] = 'touchcancel';\r
+ X.Dom.Event.Rename[ 'click' ] = [ 'click', 'tap' ];\r
+ } else {\r
+ X.Dom.Event.Rename[ 'pointerdown' ] = 'mousedown';\r
+ X.Dom.Event.Rename[ 'pointerup' ] = 'mouseup';\r
+ X.Dom.Event.Rename[ 'pointermove' ] = 'mousemove';\r
+ X.Dom.Event.Rename[ 'pointercancel' ] = 'mouseleave';//??\r
+ // Opera\r
+ // X.Dom.Event.Rename[ 'contextmenu' ] = 'mousedown'; button==2 の場合\r
+ };\r
};\r
\r
+\r
(function( rename, renameTo ){\r
- for( var k in rename ){\r
- renameTo[ rename[ k ] ] = k;\r
+ var k, name, i;\r
+ for( k in rename ){\r
+ name = rename[ k ];\r
+ if( X.Type.isArray( name ) ){\r
+ for( i = name.length; i; ){\r
+ renameTo[ name[ --i ] ] = k;\r
+ };\r
+ } else {\r
+ renameTo[ name ] = k;\r
+ };\r
};\r
})( X.Dom.Event.Rename, X.Dom.Event.RenameTo );\r
\r
if( 6 <= X.UA.IE && X.inHead ){\r
// if this script in Head\r
document.write( "<script id=__ie_onload defer src=javascript:void(0)><\/script>" );\r
- X.Dom._script = document.getElementById( "__ie_onload" );\r
- X.Dom._script.onreadystatechange = function(){\r
- var s = X.Dom._script;\r
+ X_TEMP._script = document.getElementById( "__ie_onload" );\r
+ X_TEMP._script.onreadystatechange = function(){\r
+ var s = X_TEMP._script;\r
if( s && s.readyState === 'complete' ){\r
s.onreadystatechange = X.emptyFunction;\r
s.onreadystatechange = null;\r
s.parentNode.removeChild( s );\r
- delete X.Dom._script;\r
+ delete X_TEMP._script;\r
X.Dom._init && X.Dom._init();\r
};\r
};\r
// Re: onLoad doesn't work with Safari?\r
// http://lists.apple.com/archives/web-dev/2003/Oct/msg00036.html\r
if( X.UA.WebKit || X.UA.Safari < 3 ){ // sniff\r
- X.Timer.add( 10, function(){\r
+ X.Timer.add( 16, function(){\r
if( !X.Dom._init ) return X.Callback.UN_LISTEN;\r
- if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return X.Dom._init();\r
+ if( document.readyState === 'loaded' || document.readyState === 'complete' ) return X.Dom._init();\r
});\r
};\r
\r
+/*\r
+ * http://msdn.microsoft.com/ja-jp/library/ie/hh180174%28v=vs.85%29.aspx\r
+ * 孤立するとウィンドウ オブジェクトのプロパティが消去される\r
+ */\r
+\r
X.Util.NinjaIframe = X.EventDispatcher.inherits(\r
'NinjaIframe',\r
{\r
\r
if( !opt_html ) return this;\r
\r
- if( X.UA.IE < 9 ){\r
- //if( 7 < X.UA.IE ){\r
- this._html = opt_html;\r
- //}; \r
- } else {\r
- this._html = opt_html;\r
- X_Util_NinjaIframe_writeToIframe( this );\r
- };\r
+ this._html = opt_html;\r
+ X.UA.IE < 9 || X_Util_NinjaIframe_writeToIframe( this );\r
+ \r
return this;\r
},\r
\r
return new X_NET_Queue( X_NET_TYPE_IMAGE, url );\r
},\r
\r
+ // <script>, <link>\r
+ \r
amountQueue : function(){\r
return X_NET_QUEUE_LIST.length;\r
}\r
if( X_Net_XHR_X_DOMAIN ){\r
if( false /* isXDomain( url ) */ ){ // isXDomain\r
if( !this._isXDR ){\r
- X_EventDispatcher_migrateEvent( this );\r
+ X_EventDispatcher_toggleAllEvents( this, false );\r
this._rawObject = X_Net_XHR_X_DOMAIN;\r
- X_EventDispatcher_restoreEvent( this );\r
+ X_EventDispatcher_toggleAllEvents( this, true );\r
this._isXDR = true;\r
};\r
} else {\r
if( this._isXDR ){\r
- X_EventDispatcher_migrateEvent( this );\r
+ X_EventDispatcher_toggleAllEvents( this, false );\r
this._rawObject = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
- X_EventDispatcher_restoreEvent( this);\r
+ X_EventDispatcher_toggleAllEvents( this, true );\r
this._isXDR = false;\r
};\r
};\r
}; \r
};\r
\r
- // send å\89\8dã\81«ã\83\95ã\83©ã\82°ã\82\92ç«\8bã\81¦ã\82\8b,å\9b\9eç·\9aã\81\8cæ\97©ã\81\84ã\81¨ raw.send() å\86\85ã\81§ onload -> _busy = false ã\81®ã\81®ã\81¡ã\80\81 _busy = true ã\81\99ã\82\8bã\82±ã\83¼ã\82¹ã\81\8cã\81\82ã\82\8bã\81\9fã\82\81ã\80\82\r
+ // send 前にフラグを立てる,回線が早いと raw.send() 内で onload -> _busy = false ののち、 _busy = true するため。\r
this._busy = true;\r
\r
// http://allabout.co.jp/gm/gc/24097/#1\r
_START_BUBLEUP : X.Dom.Event._LAST_EVENT + 0.5, \r
\r
// raw pointing device event\r
+ \r
_POINTER_DOWN : ++X.Dom.Event._LAST_EVENT,\r
_POINTER_UP : ++X.Dom.Event._LAST_EVENT,\r
_POINTER_MOVE : ++X.Dom.Event._LAST_EVENT,\r
};\r
\r
// raw pointing device event\r
-if( X.Dom.EVENT_POINTER ){\r
+//if( X.Dom.EVENT_POINTER ){\r
X.UI.Event.IdToName[ X.UI.Event._POINTER_DOWN ] = 'pointerdown';\r
X.UI.Event.IdToName[ X.UI.Event._POINTER_UP ] = 'pointerup';\r
X.UI.Event.IdToName[ X.UI.Event._POINTER_MOVE ] = 'pointermove';\r
X.UI.Event.IdToName[ X.UI.Event._POINTER_CANCEL ] = 'pointercancel';\r
-} else {\r
+/*} else {\r
\r
if( X.Dom.EVENT_TOUCH ){\r
X.UI.Event.IdToName[ X.UI.Event._TOUCH_START ] = 'touchstart';\r
X.UI.Event.IdToName[ X.UI.Event._MOUSE_UP ] = 'mouseup';\r
X.UI.Event.IdToName[ X.UI.Event._MOUSE_MOVE ] = 'mousemove';\r
X.UI.Event.IdToName[ X.UI.Event._MOUSE_CANCEL ] = 'mouseleave'; // ??\r
-};\r
+};*/\r
\r
\r
( function( IdToName, NameToID, p ){\r
numTouches = 0,// count the total touches on the screen\r
pointerType, i, l, touches, ret, active, gesture, startEv,\r
hammer, deltaTime, deltaX, deltaY, velocity, center;\r
-\r
- //console.log( 'Hammer@handleEvent ' + X.UI.Event.IdToName[ e.type ] + ' ' + e.pointerType );\r
+ \r
+ //console.log( 'Hammer@handleEvent ' + X.UI.Event.IdToName[ e.type ] + ' ' + e.pointerType + ' ' + type );\r
if( !type ) return;\r
\r
+ //console.log( e.type + ' dw:' + X.UI.Event._POINTER_DOWN + ' up:' + X.UI.Event._POINTER_UP + ' mv:' + X.UI.Event._POINTER_MOVE );\r
+ \r
if( e.pointerType ){\r
type |= POINTER;\r
switch( e.pointerType ){\r
else if (\r
type & TOUCH || //sourceEventType.match(/touch/) || // touch events are always on screen\r
( type & POINTER && type & START ) || //sourceEventType.match(/pointerdown/) || // pointerevents touch\r
- ( type & MOUSE && e.which === 1 ) //(sourceEventType.match(/mouse/) && e.which === 1) // mouse is pressed\r
+ ( type & MOUSE && e.button === 0 ) //(sourceEventType.match(/mouse/) && e.which === 1) // mouse is pressed\r
){\r
enable_detect = true;\r
};\r
\r
+ console.log( 'Hammer@handleEvent ' + IdToGestureID[ e.type ] + ' ' + e.type + ' ' + X.UI.Event._POINTER_DOWN + ' ' + enable_detect );\r
+\r
// we are in a touch event, set the touch triggered bool to true,\r
// this for the conflicts that may occur on ios and android\r
- type & ( TOUCH | POINTER ) && ( touch_triggered = true );\r
+ //type & ( TOUCH | POINTER ) && ( touch_triggered = true );\r
+ type & TOUCH && ( touch_triggered = true );\r
//if (sourceEventType.match(/touch|pointer/)) { touch_triggered = true;}\r
\r
// when touch has been triggered in this detection session\r
POINTERS[ i ] && ( touches[ touches.length ] = POINTERS[ i ] );\r
};\r
numTouches = touches.length;\r
+ \r
+ console.log( 'numTouches ' + numTouches );\r
} else\r
// touch\r
if ( type & TOUCH ){ //sourceEventType.match(/touch/)) {\r
\r
e = {\r
center : Utils.getCenter( touches ),\r
- timeStamp : Date.now ? Date.now() : +new Date,\r
+ timeStamp : e.timeStamp,\r
target : e.target,\r
touches : touches,\r
eventType : type & EVENT_TYPE_MASK,\r
Detection.register( Gestures[ name ] );\r
};\r
\r
- if( X.Dom.EVENT_POINTER ){\r
+ //if( X.Dom.EVENT_POINTER ){\r
Hammer.EVENT_TYPES_START = [ X.UI.Event._POINTER_DOWN ];\r
types = [ X.UI.Event._POINTER_MOVE, X.UI.Event._POINTER_UP, X.UI.Event._POINTER_CANCEL ];\r
- } else\r
+ /*} else\r
if( X.Dom.EVENT_TOUCH ){\r
Hammer.EVENT_TYPES_START = [ X.UI.Event._TOUCH_START, X.UI.Event._MOUSE_DOWN ];\r
types = [ X.UI.Event._MOUSE_MOVE, X.UI.Event._MOUSE_UP, X.UI.Event._MOUSE_CANCEL,\r
} else {\r
Hammer.EVENT_TYPES_START = [ X.UI.Event._MOUSE_DOWN ];\r
types = [ X.UI.Event._MOUSE_MOVE, X.UI.Event._MOUSE_UP, X.UI.Event._MOUSE_CANCEL ];\r
- };\r
+ }; */\r
\r
// Add touch events on the document\r
Utils.addEvents( uinodeRoot, types, Hammer.prototype.handleEvent );\r
Hammer.DO_TOUCHES_FIX = Hammer.HAS_TOUCHEVENTS && ( X.UA.Android < 2.2 || X.UA.Blink || X.UA.Opera );\r
\r
// detect touchevents\r
- Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled;\r
+ Hammer.HAS_POINTEREVENTS = true; // navigator.pointerEnabled || navigator.msPointerEnabled;\r
Hammer.HAS_POINTEREVENTS && console.log( 'Hammer.HAS_POINTEREVENTS : true' );\r
\r
\r
//this.xnode = X.Dom.Node.create( 'div' );\r
this.phase = 1;\r
\r
- this.dispatch( { type : X.UI.Event.INIT } );\r
+ this.dispatch( X.UI.Event.INIT );\r
},\r
\r
addToParent : function( xnodeParent ){\r
xnodeParent && xnodeParent.append( this.xnode );\r
\r
this.phase = 2;\r
- this.dispatch( { type : X.UI.Event.ADDED } );\r
+ this.dispatch( X.UI.Event.ADDED );\r
},\r
\r
creationComplete : function(){\r
l, i;\r
\r
this.phase = 3;\r
- this.User.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
+ this.User.dispatch( X.UI.Event.CREATION_COMPLETE );\r
\r
// html 要素が親に追加されるまで控えていたイベントの登録\r
if( events && ( l = events.length ) ){\r
},\r
\r
dispatch : function( e ){\r
+ //console.log( e.type + ' ' + ( this._listeners && this._listeners[ e.type ] ) );\r
var xve = X.UI.Event,\r
ret = X_EventDispatcher_dispatch.call( this, e ),\r
- type = e.type;\r
+ type = e.type || e;\r
+ \r
+ // TODO captureEvent PointerEvent\r
if( ret & X.Callback.MONOPOLY && !this.hitChildData && ( xve._POINTER_MOVE === type || xve._MOUSE_MOVE === type || xve.FILE_DRAG === type ) ){\r
this.rootData.monopolyNodeData = this;\r
return ret;\r
};\r
this.rootData.monopolyNodeData = null;\r
- if( xve._START_BUBLEUP < type && this.parentData && ret & X.Callback.STOP_PROPAGATION === 0 && ret & X.Callback.STOP_NOW === 0 ) return this.parentData.dispatch( e );\r
+ if( xve._START_BUBLEUP < type && this.parentData && !( ret & X.Callback.STOP_PROPAGATION ) && !( ret & X.Callback.STOP_NOW ) ) return this.parentData.dispatch( e );\r
return ret;\r
}\r
\r
// hover や rollover rollout のための move イベントの追加
// X.Dom.Event.activate, X.Dom.Event.deactivate ?
// mouseout, mouseover
- if( X.Dom.EVENT_POINTER ){
+ //if( X.Dom.EVENT_POINTER ){
this.xnodeInteractiveLayer.listen( X.UI.Event.IdToName[ X.UI.Event._POINTER_MOVE ], X.UI._eventRellay );
if( counter[ X.UI.Event._POINTER_MOVE ] ){
++counter[ X.UI.Event._POINTER_MOVE ];
} else {
counter[ X.UI.Event._POINTER_MOVE ] = 1;
};
- } else {
+ /*} else {
this.xnodeInteractiveLayer.listen( X.UI.Event.IdToName[ X.UI.Event._MOUSE_MOVE ], X.UI._eventRellay );
if( counter[ X.UI.Event._MOUSE_MOVE ] ){
++counter[ X.UI.Event._MOUSE_MOVE ];
} else {
counter[ X.UI.Event._MOUSE_MOVE ] = 1;
};
- };
+ };*/
X.Timer.once( 0, this, this.afterAddToView );
},
afterAddToView : function(){
--- /dev/null
+document.write( [\r
+ '<script src="' +\r
+ 'js/00_core/00_builtin.js',\r
+ 'js/00_core/00_X.js',\r
+ 'js/00_core/01_XUa.js',\r
+ 'js/00_core/02_XType.js',\r
+ \r
+ 'js/00_core/03_XCallback.js',\r
+ 'js/00_core/04_XClass.js',\r
+ 'js/00_core/05_XTimer.js',\r
+ 'js/00_core/06_XEventDispatcher.js',\r
+ 'js/00_core/07_XNotification.js',\r
+ \r
+ 'js/01_dom/10_XDom.js',\r
+ 'js/01_dom/11_XDomDTD.js',\r
+ 'js/01_dom/11_XDomNode.js',\r
+ 'js/01_dom/12_XDomEvent.js',\r
+ 'js/01_dom/13_XDomBoxModel.js',\r
+ 'js/01_dom/14_XDomAttr.js',\r
+ 'js/01_dom/15_XDomStyle.js',\r
+ 'js/01_dom/17_XDomNodeList.js',\r
+ 'js/01_dom/18_XDomQuery.js',\r
+ 'js/01_dom/19_XDomParser.js',\r
+ 'js/01_dom/20_XDomImage.js',\r
+ 'js/01_dom/22_XDomBuilder.js',\r
+\r
+ 'js/03_util/00_XUtil.js',\r
+ 'js/03_util/01_XNinjaIframe.js',\r
+ 'js/03_util/02_XJSON.js',\r
+ \r
+ 'js/04_net/00_XNet.js',\r
+ 'js/04_net/01_XNetXHR.js',\r
+ 'js/04_net/02_XNetJSONP.js'\r
+ + '"></script>'\r
+].join( '"></script><script src="' ));\r
+\r
+\r