X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F06_net%2F02_XNetJSONP.js;fp=0.6.x%2Fjs%2F06_net%2F02_XNetJSONP.js;h=806396c92ab96bc3faef6b98bec501a94975ab63;hb=dd02887497fa95f13d112b7fc2e5e7aefd0ffb08;hp=13bd9e528211ff7dcb4c80704254252fad9c5008;hpb=7f26e99d39211b5749c4ad62a84855404c7390a3;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/06_net/02_XNetJSONP.js b/0.6.x/js/06_net/02_XNetJSONP.js index 13bd9e5..806396c 100644 --- a/0.6.x/js/06_net/02_XNetJSONP.js +++ b/0.6.x/js/06_net/02_XNetJSONP.js @@ -37,7 +37,9 @@ X.Net.JSONP = { var X_NET_JSONP_ACCESS_KEY = Math.random(), - X_NET_JSONP_NinjaIframe; + X_NET_JSONP_NinjaIframe, + + X_Net_JSONP_onloadCount; function X_NET_JSONP_loadScriptInNinjaIframe( url ){ @@ -48,35 +50,56 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){ X_NET_JSONP_NinjaIframe || ( X_NET_JSONP_NinjaIframe = new X.Util.NinjaIframe() ); // TODO ' 化 恐らくアンチウイルスソフトが反応しないための対策 - + // TODO postMessage の利用 + + // numonLoad + + if( X_UA.Opera ){ + html = [ + ( window[ 'JSON' ] ? '' : '' ), + '', + '', + '' + ]; + X_Net_JSONP_onloadCount = 2; + } else if( X_UA.IE8 ){ html = [ // http://blog.livedoor.jp/dankogai/archives/51503830.html // Ajax - IE8にもJSON入ってます。使えるとは限らないけど // Compatibility mode (別名Quirks mode) では、JSONオブジェクトは無効になります。iframeもだめです - /* 以下のコードは XP ie8 では動くけど、win8 IE11(8モード)で動かない 開発の便宜を取って,setTimeout を挟む - '', - '' */ '', '' + + /* 以下のコードは XP ie8 では動くけど、win8 IE11(8モード)で動かない 開発の便宜を取って,setTimeout を挟む + '', + '' */ ]; + X_Net_JSONP_onloadCount = 2; } else if( X_UA.IE9 ){ html = [ '', '' ]; + X_Net_JSONP_onloadCount = 2; } else if( window[ 'JSON' ] ){ html = [ @@ -86,30 +109,35 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){ '', '' ]; + X_Net_JSONP_onloadCount = 1; } else if( X_UA.IE4 || X_UA.MacIE ){ html = [ '', '', '' ]; + X_Net_JSONP_onloadCount = 3; } else if( X_UA.IE < 8 ){ // ie5-7 html = [ '', '', '' ]; + X_Net_JSONP_onloadCount = 3; } else { html = [ '', '' ]; + X_Net_JSONP_onloadCount = 1; }; X_NET_JSONP_NinjaIframe @@ -130,14 +159,18 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){ function X_NET_JSONP_iframeListener( e ){ switch( e.type ){ case X.Event.SUCCESS : - console.log( 'iframe onload' ); - + console.log( 'iframe onload, but' ); + if( ++X_NET_JSONPWrapper._onloadCount < X_Net_JSONP_onloadCount ) return; + // TODO callback が無ければ error + X_NET_JSONPWrapper.asyncDispatch( 1000, X.Event.ERROR ); break; case X.Event.ERROR : console.log( 'iframe onerror' ); - X_NET_JSONPWrapper.asyncDispatch( 0, X.Event.ERROR ); + X_NET_JSONPWrapper.asyncDispatch( X.Event.ERROR ); break; }; + X_NET_JSONP_NinjaIframe.unlisten(); + return X.Callback.UN_LISTEN; }; @@ -145,51 +178,24 @@ X_NET_JSONPWrapper = X_Class_override( new X.EventDispatcher(), { - _operaImage : null, // X.Net.Image(); _busy : false, _canceled : false, + _onloadCount : 0, load : function( url, data, timeout ){ //createURL - if( X_NET_JSONP_operaImageHandleEvent ){ - this._operaImage = X.Net.Image( url, false ) - .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent ); - } else { - X_NET_JSONP_loadScriptInNinjaIframe( url ); - }; + X_NET_JSONP_loadScriptInNinjaIframe( url ); this._busy = true; }, cancel : function(){ - if( this._operaImage ){ - this._operaImage - .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent ) - .cancel(); - delete this._operaImage; - } else { - this._canceled = true; - }; + this._canceled = true; }, reset : function(){ this._busy = this._canceled = false; + this._onloadCount = 0; } } ); - -function X_NET_JSONP_operaImageHandleEvent( e ){ - switch( e.type ){ - case X.Event.SUCCESS : - case X.Event.ERROR : - X_NET_JSONP_loadScriptInNinjaIframe( e.src ); - break; - case X.Event.TIMEOUT : - X_NET_JSONPWrapper._operaImage - .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent ) - .reset(); - X_NET_JSONPWrapper.asyncDispatch( 0, X.Event.ERROR ); - break; - }; -}; -if( !X_UA.Opera ) X_NET_JSONP_operaImageHandleEvent = null; \ No newline at end of file