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,
{
'handleEvent' : function( e ){
- var href, i, name;
+ var href, i, name, active = false;
switch( e.type ){
case 'beforeunload' :
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 情報を提供するオブジェクト。
} 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' ] );
};