X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F16_XViewPort.js;h=cdcdf722a87b84f36b903b8c7447ac7bbf83ef7e;hb=7d3b5c3962eea3585a009bfc290a71560b2e83b3;hp=226bf4f48cea7ddc423b1f300ed3dbeb5ff866a1;hpb=35b73e6051577fb7433bb11a074a3b5800550ac3;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/01_core/16_XViewPort.js b/0.6.x/js/01_core/16_XViewPort.js index 226bf4f..cdcdf72 100644 --- a/0.6.x/js/01_core/16_XViewPort.js +++ b/0.6.x/js/01_core/16_XViewPort.js @@ -6,11 +6,13 @@ var X_ViewPort_readyState, X_ViewPort_width, X_ViewPort_height, X_ViewPort_baseFontSize, + X_ViewPort_vScrollbarSize, + X_ViewPort_hScrollbarSize, - X_Dom_detectFontSize = !( X.UA.IE < 9 || X.UA.iOS ) && function(){ - var size = Node._fontSizeNode._rawObject.offsetHeight; + X_Dom_detectFontSize = !( X_UA.IE < 9 || X_UA.iOS ) && function(){ + var size = X_Node_fontSizeNode._rawObject.offsetHeight; if( X_ViewPort_baseFontSize !== size ){ - X_ViewPort_baseFontSize && X_ViewPort.asyncDispatch( { type : X.Event.BASE_FONT_RESIZED, fontSize : size, w : X_ViewPort_width, h : X_ViewPort_height } ); + X_ViewPort_baseFontSize && X_ViewPort.asyncDispatch( X.Event.BASE_FONT_RESIZED ); X_ViewPort_baseFontSize = size; }; }, @@ -18,46 +20,60 @@ var X_ViewPort_readyState, X_ViewPort_orientationFlag, X_Dom_orientationchange = window[ 'orientation' ] !== undefined && function( e ){ X_ViewPort_orientationFlag = true; - !X.UA.Android && X_ViewPort_resize(); + !X_UA.Android && X_ViewPort_resize(); //console.log( '-- orientationchange : ' + X.ViewPort.getSize[ 0 ] + ' ' + X.ViewPort.getSize[ 1 ] ); - }; + }, + + X_ViewPort_document = new X.EventDispatcher( document ), -X_ViewPort = X.Class._override( +X_ViewPort = X_Class_override( new X.EventDispatcher( window ), { handleEvent : function( e ){ - var href; + var href, i, name; + switch( e.type ){ case 'beforeunload' : - // ie では a href="javascript" な要素でも beforeunload が起こる href = e.target && e.target.attr && e.target.attr( 'href' ); if( href && href.indexOf && href.indexOf( 'javascript:' ) === 0 ) return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION; return X_ViewPort.dispatch( X.Event.BEFORE_UNLOAD ); + case 'unload' : X_ViewPort.dispatch( X.Event.UNLOAD ); + //alert('unload'); + X_ViewPort_document.kill(); + this.kill(); - X.ViewPort.unlisten(); - Node._document.unlisten(); - Node._html._actualRemove( true ); + //X_System.dispatch( X.Event.SHUT_DOWN ); break; + case 'visibilitychange' : - X_ViewPort.dispatch( { type : ( X_ViewPort_active = document[ 'hidden' ] ) ? X.Event.VIEW_DEACTIVATE : X.Event.VIEW_ACTIVATE } ); + X_ViewPort.dispatch( ( X_ViewPort_active = document[ 'hidden' ] ) ? X.Event.VIEW_DEACTIVATE : X.Event.VIEW_ACTIVATE ); + break; + case 'mozvisibilitychange' : + X_ViewPort.dispatch( ( X_ViewPort_active = document[ 'mozHidden' ] ) ? X.Event.VIEW_DEACTIVATE : X.Event.VIEW_ACTIVATE ); break; case 'webkitvisibilitychange' : - X_ViewPort.dispatch( { type : ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X.Event.VIEW_DEACTIVATE : X.Event.VIEW_ACTIVATE } ); + X_ViewPort.dispatch( ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X.Event.VIEW_DEACTIVATE : X.Event.VIEW_ACTIVATE ); break; + case 'pageshow' : case 'focus' : - X_ViewPort_active = true; - X_ViewPort.dispatch( X.Event.VIEW_ACTIVATE ); + if( !X_ViewPort_active ){ + X_ViewPort_active = true; + X_ViewPort.dispatch( X.Event.VIEW_ACTIVATE ); + }; break; + case 'pagehide' : case 'blur' : - X_ViewPort_active = false; - X_ViewPort.dispatch( X.Event.VIEW_DEACTIVATE ); + if( X_ViewPort_active ){ + X_ViewPort_active = false; + X_ViewPort.dispatch( X.Event.VIEW_DEACTIVATE ); + }; break; }; } @@ -73,8 +89,9 @@ X.ViewPort = { /* * X.Event.XDOM_READY 以後に listen した場合の対策 */ - X_ViewPort.asyncDispatch( { type : type, w : X_ViewPort_width, h : X_ViewPort_height } ); + X_ViewPort.asyncDispatch( type ); }; + // ie8-では keydown -> documentへ type && arg1 && X_ViewPort.listen( type, arg1, arg2, arg3 ); return X.ViewPort; }, @@ -85,7 +102,7 @@ X.ViewPort = { /* * X.Event.XDOM_READY 以後に listen した場合の対策 */ - X_ViewPort.asyncDispatch( { type : type, w : X_ViewPort_width, h : X_ViewPort_height } ); + X_ViewPort.asyncDispatch( type ); }; type && arg1 && X_ViewPort.listenOnce( type, arg1, arg2, arg3 ); return X.ViewPort; @@ -100,6 +117,7 @@ X.ViewPort = { return X_ViewPort.listening( type, arg1, arg2, arg3 ); }, + // hammer のテストファイルだけが使用 asyncDispatch : function(){ return X_ViewPort.asyncDispatch.apply( X_ViewPort, arguments ); }, @@ -127,8 +145,8 @@ X.ViewPort = { //http://onozaty.hatenablog.com/entry/20060803/p1 // Safari2.0.4では標準・互換どちらも document.body - Node._body._updateTimerID && Node._body._startUpdate(); - /*X.UA.Opera ? + X_Node_updateTimerID && X_Node_startUpdate(); + /*X_UA.Opera ? ( document.documentElement && document.documentElement.clientWidth ? new Function( 'return[document.documentElement.clientWidth,document.documentElement.clientHeight]' ) : new Function( 'return[document.body.clientWidth,document.body.clientHeight]' ) @@ -142,28 +160,28 @@ X.ViewPort = { getScrollPosition : window.pageXOffset !== undefined ? ( function(){ - Node._body._updateTimerID && Node._body._startUpdate(); + X_Node_updateTimerID && X_Node_startUpdate(); return[ window.pageXOffset, window.pageYOffset ]; } ) : window.scrollLeft !== undefined ? ( function(){ - Node._body._updateTimerID && Node._body._startUpdate(); + X_Node_updateTimerID && X_Node_startUpdate(); return[ window.scrollLeft, window.scrollTop ]; } ) : ( function(){ - Node._body._updateTimerID && Node._body._startUpdate(); + X_Node_updateTimerID && X_Node_startUpdate(); // body は Safari2- return[ X_ViewPort_rootElement.scrollLeft || document.body.scrollLeft, X_ViewPort_rootElement.scrollTop || document.body.scrollTop ]; } ), getScrollbarSize : function(){ - return [ X.Dom.BoxModel.vScrollbarSize, X.Dom.BoxModel.hScrollbarSize ]; + return [ X_ViewPort_vScrollbarSize, X_ViewPort_hScrollbarSize ]; }, getBaseFontSize : function(){ - if( Node._body._updateTimerID ){ - Node._body._startUpdate(); - return X_ViewPort_baseFontSize = Node._fontSizeNode._rawObject.offsetHeight; + if( X_Node_updateTimerID ){ + X_Node_startUpdate(); + return X_ViewPort_baseFontSize = X_Node_fontSizeNode._rawObject.offsetHeight; }; return X_ViewPort_baseFontSize; } @@ -199,7 +217,7 @@ X.ViewPort = { */ var X_ViewPort_resize = // iOS もループで回す,,,iOS3.1.3, iOS6 で確認 - X.UA.IE < 9 || X.UA.iOS ? + X_UA.IE < 9 || X_UA.iOS ? (function(){ var size; if( !X_ViewPort_lock ){ @@ -212,9 +230,9 @@ X.ViewPort = { }; }; - size = Node._fontSizeNode._rawObject.offsetHeight; + size = X_Node_fontSizeNode._rawObject.offsetHeight; if( X_ViewPort_baseFontSize !== size ){ - X_ViewPort_baseFontSize && X_ViewPort.asyncDispatch( { type : X.Event.BASE_FONT_RESIZED, fontSize : size, w : X_ViewPort_width, h : X_ViewPort_height } ); + X_ViewPort_baseFontSize && X_ViewPort.asyncDispatch( X.Event.BASE_FONT_RESIZED ); X_ViewPort_baseFontSize = size; }; @@ -235,7 +253,7 @@ X.ViewPort = { } else { console.log( '-- detectFinishResizing : ' + X_Timer_now() ); - X_ViewPort.asyncDispatch( { type : X.Event.VIEW_RESIZED, fontSize : X_ViewPort_baseFontSize, w : X_ViewPort_width, h : X_ViewPort_height } ); + X_ViewPort.asyncDispatch( X.Event.VIEW_RESIZED ); X_ViewPort_lock = false; if( X_ViewPort_orientationFlag ){ X_ViewPort_orientationFlag = false; @@ -247,11 +265,13 @@ X.ViewPort = { X_TEMP.onDomContentLoaded = function(){ var s, size, elmHtml, elmHead, elmBody, html, head, body; + console.log( '> X_TEMP.onDomContentLoaded rs:' + X_ViewPort_readyState ); + if( X_TEMP.SYSTEM_EVENT_PRE_INIT <= X_ViewPort_readyState ) return X_Callback_UN_LISTEN; X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_PRE_INIT; // DOMContentLoaded の無いブラウザで X_TEMP.onDomContentLoaded への参照が残り続けるのを回避 - X_TEMP.onDomContentLoaded && Node._document.unlisten( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); + X_TEMP.onDomContentLoaded && X_ViewPort_document.unlisten( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); delete X_TEMP.onDomContentLoaded; elmHtml = document.documentElement || @@ -266,92 +286,156 @@ X.ViewPort = { X_ViewPort_rootElement = document.compatMode !== 'CSS1Compat' ? elmBody : elmHtml || elmBody; - html = Node._html = elmHtml && new Node( elmHtml ); - - head = Node._head = elmHead && new Node( elmHead ); - - body = Node._body = new Node( elmBody ); + html = X.Doc.html = X_Node_html = elmHtml && new Node( elmHtml ); + html._flags |= X_Node_State.IN_TREE; - body._root = html._root = head._root = body;// _root は html だろ + head = X.Doc.head = X_Node_head = elmHead && new Node( elmHead ); + + body = X.Doc.body = X_Node_body = new Node( elmBody ); + body.parent = head.parent = html; - html._xnodes = [ head, body ]; - - Node.root = body; // 後方互換 + html._xnodes = [ head, body ]; - html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prevNode = html.nextNode = + html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prev = html.next = html.create = html.createText = html.createAt = html.createTextAt = html.append = html.appendAt = html.empty = html.html = html.text = - head.appendTo = head.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy = head.prevNode = head.nextNode = + head.appendTo = head.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy = head.empty = head.html = head.text = - body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = body.prevNode = body.nextNode = new Function( 'return this' ); + body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = new Function( 'return this' ); - X.ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){ + X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){ X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_XTREE; if( X_TEMP.X_Dom_useBuilder ) X_TEMP.X_Dom_useBuilder = !!document.body.children.length; !X_TEMP.X_Dom_useBuilder && X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_XTREE ); } ); - X.ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_XTREE, function(){ + X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_XTREE, function(){ X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_INIT; - //X.UA.Opera7 && alert( 'bc' ); - Node._body.appendAt( 0, - Node._systemNode = Node.create( 'div', { 'class' : 'hidden-system-node' } ), - Node._fontSizeNode = Node.create( 'div', { 'class' : 'hidden-system-node' } ).cssText( 'line-height:1;height:1em;' ).text( 'X' ) - )._startUpdate(); + //X_UA.Opera7 && alert( 'bc' ); + X_Node_body.appendAt( 0, + X_Node_systemNode = X_Doc_create( 'div', { 'class' : 'hidden-system-node' } ), + X_Node_fontSizeNode = X_Doc_create( 'div', { 'class' : 'hidden-system-node' } ).cssText( 'line-height:1;height:1em;' ).text( 'X' ) + ); + X_Node_startUpdate(); X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_INIT ); } ); - X.ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ - var size = X_ViewPort_getWindowSize(); + X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ + var size = X_ViewPort_getWindowSize(), + // http://jsdo.it/imaya/kTYg + body = document.body, + defaultOverflow = document.body.style.overflow, + w, h; + + body.style.overflow = 'hidden'; + w = body.clientWidth; + h = body.clientHeight; + + body.style.overflow = 'scroll'; + w -= body.clientWidth; + h -= body.clientHeight; + + if( !w ) w = body.offsetWidth - body.clientWidth; + if( !h ) h = body.offsetHeight - body.clientHeight; + body.style.overflow = defaultOverflow; + + X_ViewPort_vScrollbarSize = w; + X_ViewPort_hScrollbarSize = h; + if( h <= 0 ){ // ie6, ie11, firefox で 負の値が返る + console.log( 'invalid hScrollbarSize: ' + h ); + X_ViewPort_hScrollbarSize = w; + }; + + // if( X_Dom_orientationchange ){ - X.ViewPort.listen( 'orientationchange', X_Dom_orientationchange ); + X_EventDispatcher_systemListen( X_ViewPort, 'orientationchange', X_Dom_orientationchange ); }; if( X_Dom_detectFontSize ){ - X.ViewPort.listen( 'resize', X_ViewPort_resize ); + X_EventDispatcher_systemListen( X_ViewPort, 'resize', X_ViewPort_resize ); X.Timer.add( 333, X_Dom_detectFontSize ); } else { X.Timer.add( 333, X_ViewPort_resize ); }; - X_ViewPort_baseFontSize = Node._fontSizeNode._rawObject.offsetHeight; + X_ViewPort_baseFontSize = X_Node_fontSizeNode._rawObject.offsetHeight; X_ViewPort_readyState = X.Event.XDOM_READY; X_ViewPort.asyncDispatch( { type : X.Event.XDOM_READY, w : X_ViewPort_width = size[ 0 ], h : X_ViewPort_height = size[ 1 ] } ); } ); - console.log( X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_PRE_INIT ) ); + X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_PRE_INIT ); + - X.ViewPort - .listen( 'beforeunload', X_ViewPort ) - .listenOnce( 'unload', X_ViewPort ); + X_EventDispatcher_systemListen( X_ViewPort, [ 'beforeunload', 'unload' ] ); //ブラウザの戻るボタンで戻ったときに呼ばれるイベントとかキャッシュとかそこらへんのこと //http://d.hatena.ne.jp/koumiya/20080916/1221580149 - if( document[ 'hidden' ] !== undefined ) {// iOS 7+ - Node._document.listen( 'visibilitychange', X_ViewPort ); + if( document[ 'hidden' ] !== undefined ){// iOS 7+ + X_EventDispatcher_systemListen( X_ViewPort_document, 'visibilitychange', X_ViewPort ); } else - if( document[ 'webkitHidden' ] !== undefined ) { - Node._document.listen( 'webkitvisibilitychange', X_ViewPort ); + if( document[ 'mozHidden' ] !== undefined ){ + X_EventDispatcher_systemListen( X_ViewPort_document, 'mozvisibilitychange', X_ViewPort ); } else - if( X.UA.iOS && window[ 'onpageshow' ] !== undefined ) { - X.ViewPort.listen( 'pageshow', X_ViewPort ) - .listen( 'pagehide', X_ViewPort ); + if( document[ 'webkitHidden' ] !== undefined ){ + X_EventDispatcher_systemListen( X_ViewPort_document, 'webkitvisibilitychange', X_ViewPort ); + } else + if( X_UA.iOS && window[ 'onpageshow' ] !== undefined ){ + X_EventDispatcher_systemListen( X_ViewPort, [ 'pageshow', 'pagehide' ] ); } else { - X.ViewPort.listen( 'focus', X_ViewPort ) - .listen( 'blur', X_ViewPort ); + X_EventDispatcher_systemListen( X_ViewPort, [ 'focus', 'blur' ] ); }; return X_Callback_UN_LISTEN; }; function X_ViewPort_getWindowSize(){ - return X.UA.IE ? + return X_UA.IE ? [ X_ViewPort_rootElement.clientWidth, X_ViewPort_rootElement.clientHeight ] : [ window.innerWidth, window.innerHeight ]; }; console.log( 'X.Dom dom:w3c=' + X_UA_DOM.W3C + ' ev:w3c=' + X_UA_EVENT.W3C ); + +/* ----------------------------------------------- + * 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 ){ + X_ViewPort_document.listenOnce( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); +} else +if( 6 <= X_UA.IE && X.inHead ){ + // if this script in Head + document.write( "