X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F21_XViewPort.js;h=5c469020eb9bc48b1fb4dacb8ea3c06ab30614c0;hb=HEAD;hp=02ec900b7bcec6273a3be503e07148ddccc16d66;hpb=f74335422a0ae2d66e3ce9bfa03f0c77a107e8d1;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/01_core/21_XViewPort.js b/0.6.x/js/01_core/21_XViewPort.js index 02ec900..5c46902 100644 --- a/0.6.x/js/01_core/21_XViewPort.js +++ b/0.6.x/js/01_core/21_XViewPort.js @@ -1,6 +1,6 @@ var X_ViewPort_readyState, - X_ViewPort_active = ( window.parent === window ) || !window.parent, // parent は frameに読み込まれた場合のieのerror回避 + X_ViewPort_active = ( window.parent === window ) || !window.parent, // parent は frameに読み込まれた場合のieのerror回避 X_ViewPort_activeTimerID, X_ViewPort_rootElement, X_ViewPort_lock, @@ -35,11 +35,11 @@ X_ViewPort = X_Class_override( { 'handleEvent' : function( e ){ - var href, i, name, active = false, xnode; + var href, i, name, active = false, elm, xnode; switch( e.type ){ case 'beforeunload' : - // ie では a href='javascript' な要素でも beforeunload が起こる + // ie では a href='javascript' な要素でも beforeunload が起こる href = e.target && e.target[ 'attr' ] && e.target[ 'attr' ]( 'href' ); if( X_Type_isString( href ) && !href.toLowerCase().indexOf( 'javascript:' ) ) return X_CALLBACK_PREVENT_DEFAULT | X_CALLBACK_STOP_PROPAGATION; @@ -49,10 +49,9 @@ X_ViewPort = X_Class_override( //https://developer.mozilla.org/ja/docs/Web/JavaScript/A_re-introduction_to_JavaScript //Firefox 1.5 の bfcache が無効になりますので、他に理由がない限り Firefox では unload リスナを登録するべきではないことに注意してください。 X_ViewPort[ 'dispatch' ]( X_EVENT_UNLOAD ); - //alert('unload'); + //alert('unload'); X_ViewPort_document[ 'kill' ](); X_ViewPort[ 'kill' ](); - //X_System[ 'dispatch' ]( X_EVENT_SHUT_DOWN ); break; @@ -75,8 +74,8 @@ X_ViewPort = X_Class_override( case 'blur' : case 'focusout' : - if( 5 < X_UA[ 'IE' ] && X_UA[ 'IE' ] < 9 ){ - xnode = X_Node_getXNode( document.activeElement ); + if( X_UA[ 'IE' ] < 9 && ( elm = FocusUtility_getFocusedElement() ) ){ + xnode = X_Node_getXNode( elm ); if( xnode ){ xnode[ 'listenOnce' ]( [ 'focus', 'blur' ], X_ViewPort_detectFocusForIE ); //break; @@ -108,18 +107,18 @@ X_ViewPort = X_Class_override( function X_ViewPort_detectFocusForIE( e ){ //console.log( 'iefix! ' + e.type + ':' + this.attr( 'tag' ) + ' isActive?:' + ( this[ '_rawObject' ] === document.activeElement ) ); - var elmActive = X_Script_try( X_Object_find, [ document, 'activeElement' ] ); + var elmActive = FocusUtility_getFocusedElement(); X_ViewPort_active = e.type === 'focus'; if( elmActive && this[ '_rawObject' ] !== elmActive ){ this[ 'unlisten' ]( X_ViewPort_active ? 'blur' : 'focus', X_ViewPort_detectFocusForIE ); - console.log( '>>>>>> activeElement 取得 不一致 ' + this._tag ); + console.log( '>>>>>> activeElement 取得 不一致 ' + this._tag ); } else if( !elmActive ){ - console.log( '******** activeElement 取得のエラー' ); + //console.log( '******** activeElement 取得のエラー' ); } else if( elmActive ){ - console.log( '>>>>>> activeElement 取得' ); + //console.log( '>>>>>> activeElement 取得' ); }; if( X_ViewPort_activeTimerID ){ @@ -269,6 +268,7 @@ X[ 'ViewPort' ] = { // http://orera.g.hatena.ne.jp/edvakf/20100515/1273908051 //http://onozaty.hatenablog.com/entry/20060803/p1 // Safari2.0.4では標準・互換どちらも document.body + // http://hisasann.com/housetect/2008/08/jqueryheightwidthopera95.html このdocument.body[ "client" + name ]はおそらくOpera9.5未満のバージョンで有効なんじゃないかな? X_Node_updateTimerID && X_Node_startUpdate(); /*X_UA[ 'Opera' ] ? @@ -366,7 +366,7 @@ X[ 'ViewPort' ] = { * http://sssslide.com/www.slideshare.net/hiroakiwakamatsu/ss-12718639 * * - * getBoundingClientRect で fontsize の調査 + * getBoundingClientRect で fontsize の調査 */ var X_ViewPort_resize = // iOS もループで回す,,,iOS3.1.3, iOS6 で確認 @@ -436,7 +436,7 @@ X[ 'ViewPort' ] = { * @alias X.Doc.html * @type {Node} */ - X[ 'Doc' ][ 'html' ] = html = X_Node_html = X_elmHtml && Node( X_elmHtml )[ 'removeClass' ]( 'js-disabled' )[ 'addClass' ]( X_UA_classNameForHTML ); + X[ 'Doc' ][ 'html' ] = html = X_Node_html = X_elmHtml && Node( X_elmHtml )[ 'removeClass' ]( 'js-disabled' )[ 'addClass' ]( X_UA_classNameForHTML.split( '.' ).join( '_' ) ); html[ '_flags' ] |= X_NodeFlags_IN_TREE; /** @@ -465,7 +465,6 @@ X[ 'ViewPort' ] = { X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, function(){ X_ViewPort_readyState = X_EVENT_XTREE_READY; - if( X_TEMP.X_Dom_useBuilder ) X_TEMP.X_Dom_useBuilder = !!X_elmBody.children.length; !X_TEMP.X_Dom_useBuilder && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY ); } ); @@ -505,18 +504,18 @@ X[ 'ViewPort' ] = { X_ViewPort_vScrollbarSize = w; X_ViewPort_hScrollbarSize = h; - if( h <= 0 ){ // ie6, ie11, firefox で 負の値が返る + if( h <= 0 ){ // ie6, ie11, firefox で 負の値が返る console.log( 'invalid hScrollbarSize: ' + h ); X_ViewPort_hScrollbarSize = w; }; // if( X_ViewPort_orientationchange ){ - X_EventDispatcher_systemListen( X_ViewPort, 'orientationchange', X_ViewPort_orientationchange ); + X_ViewPort[ 'listen' ]( 'orientationchange', X_ViewPort_orientationchange ); }; if( X_ViewPort_detectFontSize ){ - X_EventDispatcher_systemListen( X_ViewPort, 'resize', X_ViewPort_resize ); + X_ViewPort[ 'listen' ]( 'resize', X_ViewPort_resize ); X_Timer_add( 333, X_ViewPort_detectFontSize ); } else { X_Timer_add( 333, X_ViewPort_resize ); @@ -527,43 +526,52 @@ X[ 'ViewPort' ] = { X_ViewPort[ 'asyncDispatch' ]( X_ViewPort_readyState = X_EVENT_XDOM_READY ); } ); - X_ViewPort[ 'asyncDispatch' ]( X_EVENT_PRE_INIT ); - - - X_EventDispatcher_systemListen( X_ViewPort, [ 'beforeunload', 'unload' ] ); + if( X_TEMP.X_Dom_useBuilder ) X_TEMP.X_Dom_useBuilder = !!X_elmBody.children.length; + X_ViewPort[ 'asyncDispatch' ]( X_EVENT_PRE_INIT ); -//ブラウザの戻るボタンで戻ったときに呼ばれるイベントとかキャッシュとかそこらへんのこと -//http://d.hatena.ne.jp/koumiya/20080916/1221580149 + X_ViewPort[ 'listen' ]( [ 'beforeunload', 'unload' ] ); -console.log( '------------------->' ); + //ブラウザの戻るボタンで戻ったときに呼ばれるイベントとかキャッシュとかそこらへんのこと + //http://d.hatena.ne.jp/koumiya/20080916/1221580149 - if( document[ 'webkitHidden' ] !== undefined ){ - X_EventDispatcher_systemListen( X_ViewPort_document, 'webkitvisibilitychange', X_ViewPort ); - } else if( document[ 'hidden' ] !== undefined ){// iOS 7+ - X_EventDispatcher_systemListen( X_ViewPort_document, 'visibilitychange', X_ViewPort ); + X_ViewPort_document[ 'listen' ]( 'visibilitychange', X_ViewPort ); + } else + if( document[ 'webkitHidden' ] !== undefined ){ + X_ViewPort_document[ 'listen' ]( 'webkitvisibilitychange', X_ViewPort ); } else if( document[ 'msHidden' ] !== undefined ){ - X_EventDispatcher_systemListen( X_ViewPort_document, 'msvisibilitychange', X_ViewPort ); + X_ViewPort_document[ 'listen' ]( 'msvisibilitychange', X_ViewPort ); } else if( document[ 'mozHidden' ] !== undefined ){ - X_EventDispatcher_systemListen( X_ViewPort_document, 'mozvisibilitychange', X_ViewPort ); + // TODO Firefox + Android2 でブラウザにフォーカスが戻ったことが判らない... + X_ViewPort_document[ 'listen' ]( 'mozvisibilitychange', X_ViewPort ); }; if( window[ 'onpageshow' ] !== undefined ){ - X_EventDispatcher_systemListen( X_ViewPort, [ 'pageshow', 'pagehide' ] ); + X_ViewPort[ 'listen' ]( [ 'pageshow', 'pagehide' ] ); }; if( document[ 'onfocusin' ] !== undefined ){ // https://github.com/ai/visibilityjs/blob/master/lib/visibility.fallback.js - X_EventDispatcher_systemListen( X_ViewPort_document, [ 'focusin', 'focusout' ], X_ViewPort ); + X_ViewPort_document[ 'listen' ]( [ 'focusin', 'focusout' ], X_ViewPort ); + }; + + // TODO activeElement が無い対策 + if( !FocusUtility_docActiveElmSupport ){ + X_ViewPort[ 'listen' ]( 'focus', X_ViewPort_fixActiveElm ); }; - X_EventDispatcher_systemListen( X_ViewPort, [ 'focus', 'blur' ] ); + X_ViewPort[ 'listen' ]( [ 'focus', 'blur' ] ); return X_CALLBACK_UN_LISTEN; }; + function X_ViewPort_fixActiveElm( e ){ + // textNode を修正して elm にする処理は EventDisptcher に入っている + FocusUtility_fixActiveElm = e.target[ '_rawObject' ]; + }; + function X_ViewPort_getWindowSize(){ return X_UA[ 'IE' ] ? // Opera10.1 では ズーム時に表示領域のサイズが取れない! [ X_ViewPort_rootElement.clientWidth, X_ViewPort_rootElement.clientHeight ] : @@ -588,7 +596,7 @@ console.log( 'X.Dom dom:w3c=' + X_UA_DOM.W3C + ' ev:w3c=' + X_UA_EVENT.W3C ); if( X_UA_EVENT.W3C ){ X_ViewPort_document[ 'listenOnce' ]( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); } else -if( 6 <= X_UA[ 'IE' ] && X[ 'inHead' ] && !X_UA[ 'ieExeComError' ] ){ // standalone の除外 -> && !X_UA[ 'ieExeComError' ] +if( 6 <= X_UA[ 'IE' ] && X[ 'inHead' ] /* && !X_UA[ 'ieExeComError' ] */ ){ // standalone の除外 -> && !X_UA[ 'ieExeComError' ] // if this script in Head //document.write( '' ); //X_TEMP._script = document.getElementById( '__ieonload' );