OSDN Git Service

Version 0.6.87, fix SuperConstructor @ X.Class & force convert to PointerEvent @...
[pettanr/clientJs.git] / 0.6.x / js / 01_dom / 12_XDomEvent.js
index fd81b01..183090e 100644 (file)
  * 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
@@ -203,28 +338,52 @@ X.Dom.Event._LOAD_FIX_TAGS = {
        //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
@@ -276,18 +435,43 @@ if( window.onmoztransitionend !== undefined && window.ontransitionend === undefi
        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
@@ -308,14 +492,14 @@ if( X.Dom.EVENT_W3C ){
 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
@@ -323,9 +507,9 @@ if( 6 <= X.UA.IE && X.inHead ){
 // 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