X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F03_XDomEvent.js;h=3910b6f05374ad05f35776845200f418c2f390e4;hb=d6670d07eb6589113c94af832862a93f2d010cdd;hp=d6ab3599d9a9a2b9dbae9fa049ddf07ebed9f72f;hpb=35b73e6051577fb7433bb11a074a3b5800550ac3;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 d6ab359..3910b6f 100644 --- a/0.6.x/js/02_dom/03_XDomEvent.js +++ b/0.6.x/js/02_dom/03_XDomEvent.js @@ -18,18 +18,31 @@ var X_Dom_Event_devicePixelRatio = window.devicePixelRatio || ( window.screen.de '4' : 'mouse' }; */ -if( !X.UA.IE || 9 <= X.UA.IE ){ +if( !X_UA.IE || 9 <= X_UA.IE ){ X.Dom.Event = function( e, xnode ){ var originalType = e.type, - type, pointerType, + type, pointerEventType, touches, events, - altKey, ctrlKey, metaKey, shiftKey, target, related, + altKey, ctrlKey, metaKey, shiftKey, target, related, force, elm, i, n, time, touch, ev; //this._event = e; this.type = type = X_Event_RenameTo[ originalType ] || originalType; - console.log( 'original : ' + originalType + ' > ' + type ); + switch( type ){ + case 'message' : + this.data = e.data; + this.origin = e.origin; + this.source = e.source; + break; + case 'progress' : + this.lengthComputable = e.lengthComputable; + this.loaded = e.loaded; + this.total = e.total; + break; + }; + + //console.log( 'original : ' + originalType + ' > ' + type ); // http://msdn.microsoft.com/ja-jp/library/ie/dn304886%28v=vs.85%29.aspx // ポインター イベントの更新 if( e.pointerType ){ @@ -86,15 +99,17 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ this.offsetX = e.offsetX; this.offsetY = e.offsetY; } else - if( pointerType = X_Event_toPointer[ originalType ] ){ + if( pointerEventType = X_Event_toPointer[ originalType ] ){ // Touch or Mouse + //console.log( originalType + ' => ' + pointerEventType ); /* e.constructor === window.TouchEvent -> e.touches for iOS3.13 */ if( touches = e.changedTouches ){ + //console.log( originalType + ' => ' + pointerEventType ); if( touches.length === 0 ){ alert( 'e.changedTouches.length === 0' ); }; - xnode._cancelMouse = pointerType; + xnode._cancelMouse = pointerEventType; events = []; altKey = e.altKey; @@ -102,20 +117,21 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ metaKey = e.metaKey; shiftKey = e.shiftKey; time = X_Timer_now(); + force = originalType === 'touchend' || originalType === 'touchcancel' ? 0 : 0.5; for( i = touches.length; i; ){ touch = touches[ --i ]; target = touch.target; related = touch.relatedTarget; events[ i ] = { - type : pointerType, + type : pointerEventType, pointerType : 'touch', target : X_Node_getXNode( target.nodeType === 3 ? target.parentNode : target ),// defeat Safari bug // xnodetouch.target, currentTarget : xnode, - relatedTarget : X_Node_getXNode( related.nodeType === 3 ? related.parentNode : related ), // xnode + relatedTarget : related && X_Node_getXNode( related.nodeType === 3 ? related.parentNode : related ), // xnode iOS3 には relatedTarget がない isPrimary : true, hwTimestamp : time, timestamp : time, - buttons : e.button, + button : e.button, buttons : e.buttons || e.button, altKey : altKey, ctrlKey : ctrlKey, @@ -133,7 +149,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ radiusX : touch.radiusX || 0, radiusY : touch.radiusY || 0, rotationAngle : touch.rotationAngle || 0, - pressure : touch.force || touch.webkitForce || ( isEnd ? 0 : 0.5 ), + pressure : touch.force || touch.webkitForce || force, width : touch.width || 0, height : touch.height || 0 }; @@ -141,14 +157,14 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ return events.length === 1 ? events[ 0 ] : events; } else { - if( xnode._cancelMouse === pointerType ){ + if( xnode._cancelMouse === pointerEventType ){ delete xnode._cancelMouse; console.log( '**** xnode._cancelMouse ' + xnode._cancelMouse ); return []; }; // MouseEvent; - this.type = type; + this.type = pointerEventType; this.pointerType = 'mouse'; this.button = e.button !== undefined ? e.button : @@ -178,7 +194,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ // http://www.programming-magic.com/20090127231544/ // Opera で button==2の場合、コンテキストメニューイベントを発火 「ツール」->「設定」->「詳細設定」->「コンテンツ」->「Javascriptオプション」で「右クリックを制御するスクリプトを許可する」 - if( originalType === 'mousedown' && this.button === 2 && X.UA.Opera ){ + if( originalType === 'mousedown' && this.button === 2 && X_UA.Opera ){ events = [ X.Object.clone( this ), X.Object.clone( this ) ]; events[ 1 ].type = 'contextmenu'; return events; @@ -213,7 +229,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ if( e.deltaY !== undefined ){ this.deltaX = e.deltaX; this.deltaY = e.deltaY; - this.deltaZ = e.deltaZ; + this.deltaZ = e.deltaZ || 0; } else if( e.wheelDeltaY !== undefined ){ this.deltaX = e.wheelDeltaX / 120; @@ -244,7 +260,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ 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 がヒットしていないか? + if( this.target && !this.target._tag ) this.target = this.target.parent; // ie4 の fake Textnode がヒットしていないか? this.currentTarget = xnode; // xnode this.relatedTarget = X_Node_getXNode( e.formElement || e.toElement ); // xnode this.eventPhase = e.srcElement === element ? 2: 3; @@ -254,6 +270,19 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ this.ctrlKey = e.ctrlKey; this.shiftKey = e.shiftKey; + + switch( this.type ){ + case 'message' : + this.data = e.data; + this.origin = e.origin; + this.source = e.source; + break; + case 'progress' : + this.loaded = e.loaded; + this.total = e.total; + break; + }; + // http://www.programming-magic.com/20090127231544/ switch( originalType ){ case 'click' : @@ -274,6 +303,9 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ }; this.buttons = e.button; + this.deltaX = 0; + this.deltaY = e.wheelDelta / -120; + if( type = X_Event_toPointer[ originalType ] ){ this.type = type; this.clientX = e.clientX; @@ -289,7 +321,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ //event.pageY = DOMAssistant.def(e.pageY)? e.pageY : (event.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0)); //}; - if( 5 <= X.UA.IE ){ + if( 5 <= X_UA.IE ){ this.offsetX = e.offsetX; // イベントターゲット左上からの座標 this.offsetY = e.offsetY; }// else @@ -297,9 +329,6 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ // this.offsetX = e.x - e.srcElement.offsetLeft; // e.x はイベント発生要素の親要素を基準にした座標。 // this.offsetY = e.y - e.srcElement.offsetTop; //}; - - this.deltaX = 0; - this.deltaY = e.wheelDelta / -120; this.pointerId = 1; this.radiusX = 0; @@ -313,32 +342,25 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ }; }; -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; - - // TODO load -> readystatechange this.readyState === "loaded" || this.readyState === "complete" +/* X.Dom.Event._LOAD_FIX_TAGS = { IFRAME : true, SCRIPT : true//, //LINK : true -}; +}; */ // https://github.com/georgeadamson/jQuery.prefixfree-events/blob/master/jQuery.prefixfree-events.js // https://developer.mozilla.org/en-US/docs/Web/Events/wheel // if( document.onwheel === undefined ){ // DOMMoseScroll - 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+) + 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_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+?) + 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_Event_Rename[ 'wheel' ] = 'DOMMouseScroll'; }; @@ -386,11 +408,11 @@ if( window.onwebkittransitionend !== undefined && window.ontransitionend === und 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 ); + if( X_UA.Opera < 12 ){ + console.log( 'transitionend <= oTransitionEnd|ver.' + X_UA.Opera ); X_Event_Rename[ 'transitionend' ] = 'oTransitionEnd'; } else { - console.log( 'transitionend <= otransitionEnd|ver.' + X.UA.Opera ); + console.log( 'transitionend <= otransitionEnd|ver.' + X_UA.Opera ); X_Event_Rename[ 'transitionend' ] = 'otransitionEnd'; }; } else @@ -409,11 +431,12 @@ if( !navigator.pointerEnabled ){ // http://msdn.microsoft.com/ja-jp/library/ie/dn304886%28v=vs.85%29.aspx } else if( X_UA_HID.TOUCH ){ - X_Event_Rename[ 'pointerdown' ] = [ 'touchdown', 'mousedown' ]; - X_Event_Rename[ 'pointerup' ] = [ 'touchup', 'mouseup' ]; - X_Event_Rename[ 'pointermove' ] = [ 'touchmove', 'mousemove' ]; + // touch のみ(iOS でも脱獄したら?)、 touch と mouse(Android), mouse のみ + X_Event_Rename[ 'pointerdown' ] = [ 'touchstart', 'mousedown' ]; + X_Event_Rename[ 'pointerup' ] = [ 'touchend', 'mouseup' ]; + X_Event_Rename[ 'pointermove' ] = [ 'touchmove', 'mousemove' ]; X_Event_Rename[ 'pointercancel' ] = 'touchcancel'; - // X_Event_Rename[ 'click' ] = [ 'click', 'tap' ]; // ループになってしまう!直した! + // X_Event_Rename[ 'click' ] = [ 'touchstart', 'touchmove', 'touchend' ]; // ループになってしまう!直した!直ってない! } else { X_Event_Rename[ 'pointerdown' ] = 'mousedown'; X_Event_Rename[ 'pointerup' ] = 'mouseup'; @@ -421,48 +444,11 @@ if( !navigator.pointerEnabled ){ X_Event_Rename[ 'pointercancel' ] = 'mouseleave';//?? // Opera は ブラウザ設定から右クリックの通知を許可すると mousedown で e.button==2 が返る,キャンセルは可能?? - X.UA.Opera && ( + X_UA.Opera && ( X_Event_Rename[ 'contextmenu' ] = 'mousedown' ); + + /* + * buttons の無いブラウザには mouseup, mousedown を監視して、buttons フラグを更新し続ける + */ }; }; - -/* ----------------------------------------------- - * Document Ready - * Dean Edwards/Matthias Miller/John Resig - */ - -// SafariでJavaScriptのデバッグをする方法 -// safari1.3 可 -// http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html - -/* for ie9+/Mozilla/Opera9 */ -if( X_UA_EVENT.W3C ){ - Node._document.listenOnce( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); -} else -if( 6 <= X.UA.IE && X.inHead ){ - // if this script in Head - document.write( "