X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;ds=sidebyside;f=0.6.x%2Fjs%2F02_dom%2F03_XDomEvent.js;h=3b1c59e903ec11a063d8d9b5ff5d90505a574e19;hb=db13457fcd6dcd4a6a55043426d78f898e16db0a;hp=6accbb6b14620b9c9530a1c82b583acaf3762267;hpb=f0f12aa05fdf010ce024e96abe09fea8100fc4b1;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 6accbb6..3b1c59e 100644 --- a/0.6.x/js/02_dom/03_XDomEvent.js +++ b/0.6.x/js/02_dom/03_XDomEvent.js @@ -18,18 +18,30 @@ 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, 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.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 ){ @@ -88,9 +100,11 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ } else if( pointerType = X_Event_toPointer[ originalType ] ){ // Touch or Mouse + //console.log( originalType + ' => ' + pointerType ); /* e.constructor === window.TouchEvent -> e.touches for iOS3.13 */ if( touches = e.changedTouches ){ + //console.log( originalType + ' => ' + pointerType ); if( touches.length === 0 ){ alert( 'e.changedTouches.length === 0' ); }; @@ -102,6 +116,7 @@ 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; @@ -111,11 +126,11 @@ if( !X.UA.IE || 9 <= X.UA.IE ){ 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 +148,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 }; @@ -178,7 +193,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; @@ -254,6 +269,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 +302,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 +320,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 +328,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; @@ -322,23 +350,24 @@ 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 +415,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 +438,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,7 +451,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 フラグを更新し続ける + */ }; };