X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F03_XDomEvent.js;h=b79e4cd82502d87bd50fab3ed1cb37c6389100f3;hb=e74c0b1d9384370c24941d36155f548ef63cb0b2;hp=e391e583d9166b87d31fba94234f197eea423eeb;hpb=36e3d975f201a804af90f1a21ff352d14a438f6c;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/02_dom/03_XDomEvent.js b/0.6.x/js/02_dom/03_XDomEvent.js index e391e58..b79e4cd 100644 --- a/0.6.x/js/02_dom/03_XDomEvent.js +++ b/0.6.x/js/02_dom/03_XDomEvent.js @@ -20,15 +20,16 @@ var X_Dom_Event_devicePixelRatio = window.devicePixelRatio || ( window.screen.de if( !X.UA.IE || 9 <= X.UA.IE ){ X.Dom.Event = function( e, xnode ){ - var _type = e.type, - type, + var originalType = e.type, + type, pointerType, touches, events, altKey, ctrlKey, metaKey, shiftKey, target, related, elm, i, n, time, touch, ev; //this._event = e; - this.type = type = X.Dom.Event.RenameTo[ _type ] || _type; + this.type = type = X_Event_RenameTo[ originalType ] || originalType; + console.log( 'original : ' + originalType + ' > ' + type ); // http://msdn.microsoft.com/ja-jp/library/ie/dn304886%28v=vs.85%29.aspx // ポインター イベントの更新 if( e.pointerType ){ @@ -52,7 +53,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ //Y-Z 平面と、ペンの軸が含まれる平面の間の角度を返します。Y 軸の範囲は -90 ~ +90 です。X の傾きの正の方向は右方向です。 this.tiltX = e.tiltX; this.tiltY = e.tiltY; - if( _type === 'MSPointerHover' ){ + if( originalType === 'MSPointerHover' ){ this.type = 'pointermove'; // ie10 には pointerhover と pointermoveがあり、ie11 で一本化。ie11 では buttons を見て hover 状態を判定 }; case 'touch' : @@ -85,15 +86,15 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ this.offsetX = e.offsetX; this.offsetY = e.offsetY; } else - if( X.Dom.Event.toPointer[ _type ] ){ + if( pointerType = X_Event_toPointer[ originalType ] ){ // Touch or Mouse /* e.constructor === window.TouchEvent -> e.touches for iOS3.13 */ - if( touches = e.changedTouches ){ + if( touches = e.changedTouches ){ if( touches.length === 0 ){ alert( 'e.changedTouches.length === 0' ); }; - xnode._cancelMouse = type; + xnode._cancelMouse = pointerType; events = []; altKey = e.altKey; @@ -106,7 +107,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ target = touch.target; related = touch.relatedTarget; events[ i ] = { - type : type, + type : pointerType, pointerType : 'touch', target : X_Node_getXNode( target.nodeType === 3 ? target.parentNode : target ),// defeat Safari bug // xnodetouch.target, currentTarget : xnode, @@ -140,8 +141,9 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ return events.length === 1 ? events[ 0 ] : events; } else { - if( xnode._cancelMouse === type ){ + if( xnode._cancelMouse === pointerType ){ delete xnode._cancelMouse; + console.log( '**** xnode._cancelMouse ' + xnode._cancelMouse ); return []; }; @@ -149,8 +151,6 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ this.type = type; this.pointerType = 'mouse'; - // http://www.programming-magic.com/20090127231544/ - // TODO Opera で button==2の場合、コンテキストメニューイベントを発火 「ツール」->「設定」->「詳細設定」->「コンテンツ」->「Javascriptオプション」で「右クリックを制御するスクリプトを許可する」 this.button = e.button !== undefined ? e.button : e.which !== undefined ? e.which - 1 : -1; this.buttons = e.buttons !== undefined ? e.buttons : this.button === 0 ? 1 : this.button === 1 ? 2 : this.button === 2 ? 4 : 0; @@ -175,6 +175,14 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ this.pageY = e.pageY; this.offsetX = e.offsetX || e.layerX; // 要素上の座標を取得 this.offsetY = e.offsetY || e.layerY; + + // http://www.programming-magic.com/20090127231544/ + // Opera で button==2の場合、コンテキストメニューイベントを発火 「ツール」->「設定」->「詳細設定」->「コンテンツ」->「Javascriptオプション」で「右クリックを制御するスクリプトを許可する」 + if( originalType === 'mousedown' && this.button === 2 && X.UA.Opera ){ + events = [ X.Object.clone( this ), X.Object.clone( this ) ]; + events[ 1 ].type = 'contextmenu'; + return events; + }; }; } else { // Other @@ -218,11 +226,11 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ } else if( e.detail !== undefined ){ this.deltaX = this.deltaZ = 0; - this.deltaY = _type === 'MozMousePixelScroll' ? e.detail / 45 : e.detail / 3; // 3 + this.deltaY = originalType === 'MozMousePixelScroll' ? e.detail / 45 : e.detail / 3; // 3 } else { this.deltaX = this.deltaY = this.deltaZ = 0; }; - }; + }; }; this.currentTarget = xnode; // xnode @@ -232,9 +240,9 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ }; } else { X.Dom.Event = function( e, xnode, element ){ - var _type = e.type, btn, type; + var originalType = e.type, btn, type; - this.type = X.Dom.Event.RenameTo[ _type ] || _type; + this.type = X_Event_RenameTo[ originalType ] || originalType; this.target = X_Node_getXNode( e.srcElement ); // xnode if( this.target && this.target._xnodeType === 3 ) this.target = this.target.parent; // ie4 の fake Textnode がヒットしていないか? this.currentTarget = xnode; // xnode @@ -247,7 +255,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ this.shiftKey = e.shiftKey; // http://www.programming-magic.com/20090127231544/ - switch( _type ){ + switch( originalType ){ case 'click' : case 'dblclick' : this.button = 0; @@ -266,7 +274,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ }; this.buttons = e.button; - if( type = X.Dom.Event.toPointer[ _type ] ){ + if( type = X_Event_toPointer[ originalType ] ){ this.type = type; this.clientX = e.clientX; this.clientY = e.clientY; @@ -305,27 +313,27 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ }; }; -X.Dom.Event.VIEW_ACTIVATE = ++X.Event._LAST_EVENT; -X.Dom.Event.VIEW_DEACTIVATE = ++X.Event._LAST_EVENT; -X.Dom.Event.VIEW_RESIZED = ++X.Event._LAST_EVENT; -X.Dom.Event.VIEW_TURNED = ++X.Event._LAST_EVENT; -X.Dom.Event.BASE_FONT_RESIZED = ++X.Event._LAST_EVENT; +X.Dom.Event.VIEW_ACTIVATE = ++X_Event_last; +X.Dom.Event.VIEW_DEACTIVATE = ++X_Event_last; +X.Dom.Event.VIEW_RESIZED = ++X_Event_last; +X.Dom.Event.VIEW_TURNED = ++X_Event_last; +X.Dom.Event.BASE_FONT_RESIZED = ++X_Event_last; // same_page_jump // on_screen_keyboard_show // on_screen_keyboard_hide -// X.Dom.Event.BEFORE_UPDATE = ++X.Event._LAST_EVENT; // このイベントで要素のサイズを取得すると無限ループに! -X.Dom.Event.AFTER_UPDATE = ++X.Event._LAST_EVENT; +// X.Dom.Event.BEFORE_UPDATE = ++X_Event_last; // このイベントで要素のサイズを取得すると無限ループに! +X.Dom.Event.AFTER_UPDATE = ++X_Event_last; // hash_change -X.Dom.Event.BEFORE_UNLOAD = ++X.Event._LAST_EVENT; -X.Dom.Event.UNLOAD = ++X.Event._LAST_EVENT; +X.Dom.Event.BEFORE_UNLOAD = ++X_Event_last; +X.Dom.Event.UNLOAD = ++X_Event_last; + +X.Dom.Event.ANIME_BEFORE_START = ++X_Event_last; +X.Dom.Event.ANIME_START = ++X_Event_last; +X.Dom.Event.ANIME = ++X_Event_last; +X.Dom.Event.ANIME_END = ++X_Event_last; +X.Dom.Event.ANIME_BEFORE_STOP = ++X_Event_last; // xnode.stop() のみ、指定時間による停止では呼ばれない +X.Dom.Event.ANIME_STOP = ++X_Event_last; -X.Dom.Event.ANIME_BEFORE_START = ++X.Event._LAST_EVENT; -X.Dom.Event.ANIME_START = ++X.Event._LAST_EVENT; -X.Dom.Event.ANIME = ++X.Event._LAST_EVENT; -X.Dom.Event.ANIME_END = ++X.Event._LAST_EVENT; -X.Dom.Event.ANIME_BEFORE_STOP = ++X.Event._LAST_EVENT; // xnode.stop() のみ、指定時間による停止では呼ばれない -X.Dom.Event.ANIME_STOP = ++X.Event._LAST_EVENT; -X.Dom.Event._LAST_EVENT = X.Event._LAST_EVENT; // ここに書いてあるイベントの最後の値 X.Dom.Event.ANIME_STOP と同じ値 // TODO load -> readystatechange this.readyState === "loaded" || this.readyState === "complete" X.Dom.Event._LOAD_FIX_TAGS = { @@ -334,32 +342,6 @@ X.Dom.Event._LOAD_FIX_TAGS = { //LINK : true }; -X.Dom.Event.Rename = {}; -X.Dom.Event.RenameTo = {}; -X.Dom.Event.toPointer = !X_UA_HID.POINTER && ( X_UA_HID.TOUCH ? - { - touchdown : 'pointerdown', - mousedown : 'pointerdown', - touchup : 'pointerup', - mouseup : 'pointerup', - touchmove : 'pointermove', - mousemove : 'pointermove', - touchcancel : 'pointercancel', - contextmenu : 'contextmenu', - dbclick : 'dbclick', - click : 'click', - tap : 'click' - } : - { - mousedown : 'pointerdown', - mouseup : 'pointerup', - mousemove : 'pointermove', - contextmenu : 'contextmenu', - dbclick : 'dbclick', - click : 'click' - }); - - // https://github.com/georgeadamson/jQuery.prefixfree-events/blob/master/jQuery.prefixfree-events.js // https://developer.mozilla.org/en-US/docs/Web/Events/wheel // @@ -368,17 +350,17 @@ if( document.onwheel === undefined ){ if( X.UA.Gecko && window.MouseScrollEvent ){ if( 2 <= X.UA.Gecko || ( 1.9 <= X.UA.Gecko && 1 <= X.UA.GeckoPatch ) ){ // Gecko 1.9.1+ (firefox3.5+) console.log( 'wheel <= MozMousePixelScroll' ); - X.Dom.Event.Rename[ 'wheel' ] = 'MozMousePixelScroll'; + X_Event_Rename[ 'wheel' ] = 'MozMousePixelScroll'; } else if( 1 <= X.UA.Gecko || ( 0.9 <= X.UA.Gecko && 7 <= X.UA.GeckoPatch ) ){ // Gecko 0.9.7+ (NN6.2+?) console.log( 'wheel <= DOMMouseScroll' ); - X.Dom.Event.Rename[ 'wheel' ] = 'DOMMouseScroll'; + X_Event_Rename[ 'wheel' ] = 'DOMMouseScroll'; }; } else { - X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel'; + X_Event_Rename[ 'wheel' ] = 'mousewheel'; }; //if( document.onmousewheel !== undefined ){ // Opera で判定失敗する - // X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel'; + // X_Event_Rename[ 'wheel' ] = 'mousewheel'; //}; }; @@ -386,92 +368,78 @@ if( document.onwheel === undefined ){ if( window.onwebkitanimationend !== undefined && window.onanimationend === undefined ){ console.log( 'animationend <= webkitAnimationEnd' ); - X.Dom.Event.Rename[ 'animationend' ] = 'webkitAnimationEnd'; - X.Dom.Event.Rename[ 'animationstart' ] = 'webkitAnimationStart'; - X.Dom.Event.Rename[ 'animationiteration' ] = 'webkitAnimationIteration'; + X_Event_Rename[ 'animationend' ] = 'webkitAnimationEnd'; + X_Event_Rename[ 'animationstart' ] = 'webkitAnimationStart'; + X_Event_Rename[ 'animationiteration' ] = 'webkitAnimationIteration'; } else if( window.onoanimationend !== undefined && window.onanimationend === undefined ){ console.log( 'animationend <= oAnimationEnd' ); - X.Dom.Event.Rename[ 'animationend' ] = 'oAnimationEnd'; - X.Dom.Event.Rename[ 'animationstart' ] = 'oAnimationStart'; - X.Dom.Event.Rename[ 'animationiteration' ] = 'oAnimationIteration'; + X_Event_Rename[ 'animationend' ] = 'oAnimationEnd'; + X_Event_Rename[ 'animationstart' ] = 'oAnimationStart'; + X_Event_Rename[ 'animationiteration' ] = 'oAnimationIteration'; } else /* if( window.onmozanimationend !== undefined && window.onanimationend === undefined ){ - X.Dom.Event.Rename[ 'animationend' ] = 'mozAnimationEnd'; - X.Dom.Event.RenameTo[ 'mozAnimationEnd' ] = 'animationend'; - X.Dom.Event.Rename[ 'animationstart' ] = 'mozAnimationStart'; - X.Dom.Event.RenameTo[ 'mozAnimationStart' ] = 'animationstart'; - X.Dom.Event.Rename[ 'animationiteration' ] = 'mozAnimationIteration'; - X.Dom.Event.RenameTo[ 'mozAnimationIteration' ] = 'animationiteration'; + X_Event_Rename[ 'animationend' ] = 'mozAnimationEnd'; + X_Event_RenameTo[ 'mozAnimationEnd' ] = 'animationend'; + X_Event_Rename[ 'animationstart' ] = 'mozAnimationStart'; + X_Event_RenameTo[ 'mozAnimationStart' ] = 'animationstart'; + X_Event_Rename[ 'animationiteration' ] = 'mozAnimationIteration'; + X_Event_RenameTo[ 'mozAnimationIteration' ] = 'animationiteration'; } else*/ if( document.documentElement && document.documentElement.style.msAnimation !== undefined && document.documentElement.style.animation === undefined ){ //document.documentElement.style.msAnimation console.log( 'animationend <= MSAnimationEnd' ); - X.Dom.Event.Rename[ 'animationend' ] = 'MSAnimationEnd'; - X.Dom.Event.Rename[ 'animationstart' ] = 'MSAnimationStart'; - X.Dom.Event.Rename[ 'animationiteration' ] = 'MSAnimationIteration'; + X_Event_Rename[ 'animationend' ] = 'MSAnimationEnd'; + X_Event_Rename[ 'animationstart' ] = 'MSAnimationStart'; + X_Event_Rename[ 'animationiteration' ] = 'MSAnimationIteration'; }; // https://developer.mozilla.org/en-US/docs/Web/Events/transitionend // chrome1+, firefox4+, IE10+, Opera10.5+, Safari3.2+, Android2.1+ if( window.onwebkittransitionend !== undefined && window.ontransitionend === undefined ){ console.log( 'transitionend <= webkitTransitionEnd' ); - X.Dom.Event.Rename[ 'transitionend' ] = 'webkitTransitionEnd'; + X_Event_Rename[ 'transitionend' ] = 'webkitTransitionEnd'; } else if( window.onotransitionend !== undefined && window.ontransitionend === undefined ){ if( X.UA.Opera < 12 ){ console.log( 'transitionend <= oTransitionEnd|ver.' + X.UA.Opera ); - X.Dom.Event.Rename[ 'transitionend' ] = 'oTransitionEnd'; + X_Event_Rename[ 'transitionend' ] = 'oTransitionEnd'; } else { console.log( 'transitionend <= otransitionEnd|ver.' + X.UA.Opera ); - X.Dom.Event.Rename[ 'transitionend' ] = 'otransitionEnd'; + X_Event_Rename[ 'transitionend' ] = 'otransitionEnd'; }; } else if( window.onmoztransitionend !== undefined && window.ontransitionend === undefined ){ console.log( 'transitionend <= mozTransitionEnd' ); - X.Dom.Event.Rename[ 'transitionend' ] = 'mozTransitionEnd'; + X_Event_Rename[ 'transitionend' ] = 'mozTransitionEnd'; }; if( !navigator.pointerEnabled ){ if( navigator.msPointerEnabled ){ console.log( 'pointerdown <= MSPointerDown' ); - X.Dom.Event.Rename[ 'pointerdown' ] = 'MSPointerDown'; - X.Dom.Event.Rename[ 'pointerup' ] = 'MSPointerUp'; - X.Dom.Event.Rename[ 'pointermove' ] = [ 'MSPointerMove', 'MSPointerHover' ];// ie10 と ie11 でペンのhoverevent の値が異なる - X.Dom.Event.Rename[ 'pointercancel' ] = 'MSPointerCancel'; + X_Event_Rename[ 'pointerdown' ] = 'MSPointerDown'; + X_Event_Rename[ 'pointerup' ] = 'MSPointerUp'; + X_Event_Rename[ 'pointermove' ] = [ 'MSPointerMove', 'MSPointerHover' ];// ie10 と ie11 でペンのhoverevent の値が異なる + X_Event_Rename[ 'pointercancel' ] = 'MSPointerCancel'; // http://msdn.microsoft.com/ja-jp/library/ie/dn304886%28v=vs.85%29.aspx } else if( X_UA_HID.TOUCH ){ - X.Dom.Event.Rename[ 'pointerdown' ] = [ 'touchdown', 'mousedown' ]; - X.Dom.Event.Rename[ 'pointerup' ] = [ 'touchup', 'mouseup' ]; - X.Dom.Event.Rename[ 'pointermove' ] = [ 'touchmove', 'mousemove' ]; - X.Dom.Event.Rename[ 'pointercancel' ] = 'touchcancel'; - //X.Dom.Event.Rename[ 'click' ] = [ 'click', 'tap' ]; // ループになってしまう! + X_Event_Rename[ 'pointerdown' ] = [ 'touchdown', 'mousedown' ]; + X_Event_Rename[ 'pointerup' ] = [ 'touchup', 'mouseup' ]; + X_Event_Rename[ 'pointermove' ] = [ 'touchmove', 'mousemove' ]; + X_Event_Rename[ 'pointercancel' ] = 'touchcancel'; + // X_Event_Rename[ 'click' ] = [ 'click', 'tap' ]; // ループになってしまう!直した! } else { - X.Dom.Event.Rename[ 'pointerdown' ] = 'mousedown'; - X.Dom.Event.Rename[ 'pointerup' ] = 'mouseup'; - X.Dom.Event.Rename[ 'pointermove' ] = 'mousemove'; - X.Dom.Event.Rename[ 'pointercancel' ] = 'mouseleave';//?? - // Opera - // X.Dom.Event.Rename[ 'contextmenu' ] = 'mousedown'; button==2 の場合 + X_Event_Rename[ 'pointerdown' ] = 'mousedown'; + X_Event_Rename[ 'pointerup' ] = 'mouseup'; + X_Event_Rename[ 'pointermove' ] = 'mousemove'; + X_Event_Rename[ 'pointercancel' ] = 'mouseleave';//?? + + // Opera は ブラウザ設定から右クリックの通知を許可すると mousedown で e.button==2 が返る,キャンセルは可能?? + X.UA.Opera && ( + X_Event_Rename[ 'contextmenu' ] = 'mousedown' ); }; }; - -(function( rename, renameTo ){ - var k, name, i; - for( k in rename ){ - name = rename[ k ]; - if( X.Type.isArray( name ) ){ - for( i = name.length; i; ){ - renameTo[ name[ --i ] ] = k; - }; - } else { - renameTo[ name ] = k; - }; - }; -})( X.Dom.Event.Rename, X.Dom.Event.RenameTo ); - - /* ----------------------------------------------- * Document Ready * Dean Edwards/Matthias Miller/John Resig @@ -511,10 +479,4 @@ if( X.UA.WebKit || X.UA.Safari < 3 ){ // sniff /* for other browsers */ Node._window.listenOnce( 'load', X_TEMP.onDomContentLoaded ); -// -X.Dom.listenOnce( X.Event.XDOM_READY, function(e){ - console.log( 'X.Dom XDomReady ' + X_Dom_readyState ); -} ); - -X.Dom.listen( X.Dom.Event.VIEW_RESIZED, function(e){ console.log( 'X.Dom VIEW_RESIZED ' + e.w + ' x ' + e.h ); } );