var X_ViewPort_readyState,
X_ViewPort_active = !!window.parent || !!document.activeElement, // parent は frameに読み込まれた場合のieのerror回避
+ X_ViewPort_activeTimerID,
X_ViewPort_rootElement,
X_ViewPort_lock,
X_ViewPort_width,
X_ViewPort_height,
+ X_ViewPort_scrollX = 0,
+ X_ViewPort_scrollY = 0,
X_ViewPort_baseFontSize,
X_ViewPort_vScrollbarSize,
X_ViewPort_hScrollbarSize,
{
'handleEvent' : function( e ){
- var href, i, name;
+ var href, i, name, active = false;
switch( e.type ){
case 'beforeunload' :
return X_ViewPort[ 'dispatch' ]( X_EVENT_BEFORE_UNLOAD );
case 'unload' :
+ //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');
X_ViewPort_document[ 'kill' ]();
case 'webkitvisibilitychange' :
X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE );
break;
-
- case 'pageshow' :
- case 'focus' :
- if( !X_ViewPort_active ){
- X_ViewPort_active = true;
- X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_ACTIVATE );
- };
- break;
- case 'pagehide' :
+
case 'blur' :
- if( X_ViewPort_active ){
- X_ViewPort_active = false;
- X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE );
+ case 'focusout' :
+ case 'pagehide' :
+ active = true;
+ case 'focus' :
+ case 'focusin' :
+ case 'pageshow' :
+ if( X_ViewPort_active === active ){
+ X_ViewPort_active = !active;
+ if( X_ViewPort_activeTimerID ){
+ X_ViewPort_activeTimerID = X_Timer_remove( X_ViewPort_activeTimerID );
+ } else {
+ X_ViewPort_activeTimerID = X_Timer_once( 1, X_ViewPort_changeFocus );
+ };
};
break;
};
}
);
+function X_ViewPort_changeFocus(){
+ X_ViewPort[ 'dispatch' ]( X_ViewPort_active ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE );
+ X_ViewPort_activeTimerID = 0;
+};
+
/**
* window に相当する ViewPort 情報を提供するオブジェクト。
window.pageXOffset !== undefined ?
( function(){
X_Node_updateTimerID && X_Node_startUpdate();
- return[ window.pageXOffset, window.pageYOffset ];
+ return[ X_ViewPort_scrollX = window.pageXOffset, X_ViewPort_scrollY = window.pageYOffset ];
} ) :
window.scrollLeft !== undefined ?
( function(){
X_Node_updateTimerID && X_Node_startUpdate();
- return[ window.scrollLeft, window.scrollTop ];
+ return[ X_ViewPort_scrollX = window.scrollLeft, X_ViewPort_scrollY = window.scrollTop ];
} ) :
( function(){
X_Node_updateTimerID && X_Node_startUpdate();
// body は Safari2-
- return[ X_ViewPort_rootElement.scrollLeft || document.body.scrollLeft, X_ViewPort_rootElement.scrollTop || document.body.scrollTop ];
+ return[ X_ViewPort_scrollX = X_ViewPort_rootElement.scrollLeft || document.body.scrollLeft, X_ViewPort_scrollY = X_ViewPort_rootElement.scrollTop || document.body.scrollTop ];
} ),
'getScrollbarSize' : function(){
X_ViewPort_rootElement = document.compatMode !== 'CSS1Compat' ? elmBody : elmHtml || elmBody;
- html = X[ 'Doc' ][ 'html' ] = X_Node_html = elmHtml && new Node( elmHtml )[ 'removeClass' ]( 'js-disabled' )[ 'addClass' ]( X_UA_classNameForHTML );
+ /**
+ * Node( documentElement )
+ * @alias X.Doc.html
+ * @type {Node}
+ */
+ X[ 'Doc' ][ 'html' ] = html = X_Node_html = elmHtml && new Node( elmHtml )[ 'removeClass' ]( 'js-disabled' )[ 'addClass' ]( X_UA_classNameForHTML );
html[ '_flags' ] |= X_Node_State.IN_TREE;
-
- head = X[ 'Doc' ][ 'head' ] = X_Node_head = elmHead && new Node( elmHead );
-
- body = X[ 'Doc' ][ 'body' ] = X_Node_body = new Node( elmBody );
+
+ /**
+ * Node( head )
+ * @alias X.Doc.head
+ * @type {Node}
+ */
+ X[ 'Doc' ][ 'head' ] = head = X_Node_head = elmHead && new Node( elmHead );
+
+ /**
+ * Node( documentElement )
+ * @alias X.Doc.body
+ * @type {Node}
+ */
+ X[ 'Doc' ][ 'body' ] = body = X_Node_body = new Node( elmBody );
body[ 'parent ' ] = head[ 'parent' ] = html;
html[ '_xnodes' ] = [ head, body ];
} else
if( X_UA[ 'iOS' ] && window[ 'onpageshow' ] !== undefined ){
X_EventDispatcher_systemListen( X_ViewPort, [ 'pageshow', 'pagehide' ] );
+ } else
+ 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 );
} else {
X_EventDispatcher_systemListen( X_ViewPort, [ 'focus', 'blur' ] );
};