OSDN Git Service

add Node.createAt && Node.createTestAt.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 24 Sep 2014 22:07:46 +0000 (07:07 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 24 Sep 2014 22:07:46 +0000 (07:07 +0900)
0.6.x/js/00_core/04_XClass.js
0.6.x/js/00_core/05_XTimer.js
0.6.x/js/01_dom/11_XDomNode.js
0.6.x/js/03_util/01_XNinjaIframe.js
0.6.x/js/04_net/00_XNet.js
0.6.x/js/04_net/01_XNetXHR.js
0.6.x/js/04_net/02_XNetJSONP.js
0.6.x/js/04_net/04_XNetImage.js

index 3438f9b..28fc4ad 100644 (file)
@@ -1,7 +1,7 @@
 /**\r
  * Class を定義し システムの管理下に置く.\r
  * 全てのクラスと pool が有効の場合インスタンスへの参照が保持される.\r
- *  1. X.Class.create( opt_settings, opt_name, opt_props ) でクラスを登録.\r
+ *  1. X.Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) でクラスを登録.\r
  *  2. コンストラクタ となるメソッドは、Constructor : function( arg ){ ... }, に書く.\r
  *  3. 通常通り new で インスタンス生成\r
  *  4. kill() でオブジェクトをクリーンして削除、pool が有効の場合は pool される.\r
@@ -101,18 +101,18 @@ X.Class = {
                klass.subClassOf   = X_Class_subClassOf;\r
                \r
                if( X_Class_useObjectCreate ){\r
-                       klass.prototype = X.Class._override( X.Class._override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
+                       klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
                        klass.prototype.constructor = klass;\r
                } else\r
                if( X_Class_use_proto_ ){\r
-                       X.Class._override( klass.prototype, props, true );\r
+                       X_Class_override( klass.prototype, props, true );\r
                        if( X_Class_traits ){\r
                                klass.prototype.__proto__ = X_Class_traits;\r
                        } else {\r
-                               X.Class._override( klass.prototype, X_Class_CommonProps, false );\r
+                               X_Class_override( klass.prototype, X_Class_CommonProps, false );\r
                        };\r
                } else {\r
-                       klass.prototype = X.Class._override( X.Class._override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
+                       klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
                        klass.prototype.constructor = klass;\r
                };\r
                klass.name = displayName;\r
@@ -252,7 +252,7 @@ function X_Class_superClassOf( klass ){
 };\r
 \r
 function X_Class_subClassOf( klass ){\r
-       return X.Class._superClassOf.call( klass, this );\r
+       return X_Class_superClassOf.call( klass, this );\r
 };\r
        \r
 /* サブクラスを作るメソッド  \r
@@ -382,7 +382,7 @@ var X_Class_CommonProps = {
                if( def.privateClass ){\r
                        i = def.userList.indexOf( instance );\r
                        if( i !== -1 ){\r
-                               data            = X.Class._getPrivate( instance );\r
+                               data            = X_Class_getPrivate( instance );\r
                                X_Class_killPrivateFlag = true;\r
                                if( data._dispatching && data.instanceOf( X.EventDispatcher ) ){\r
                                        data._killReserved = true;\r
@@ -396,7 +396,7 @@ var X_Class_CommonProps = {
        },\r
        \r
        // TODO Super\r
-       // SuperCall\r
+       // superCall\r
        \r
        instanceOf : function( klass ){\r
                var Super = this;\r
@@ -461,7 +461,7 @@ function X_Class_actualConstructor( args ){
 \r
 function X_Class_superConstructor(){\r
        var s = X_Class_getClassDef( this ).SuperConstructor;\r
-       s && s.apply( this, arguments );\r
+       return s && s.apply( this, arguments );\r
 };\r
 \r
 console.log( 'X.Core.Class' );\r
index 8f2c169..0ab0bd4 100644 (file)
@@ -186,7 +186,7 @@ X.Timer = {
 // --- implements ---------------------------------------------------------- //\r
 // ------------------------------------------------------------------------- //\r
 \r
-if( X.UA.IE < 5 || X.UA.MacIE ){\r
+if( X.UA.IE4 || X.UA.MacIE ){\r
        X.Timer[ '_' ] = X_Timer_onTimeout;\r
        X_Timer_onTimeout = 'X.Timer._()';\r
 };\r
index 3f29cd1..4c443e1 100644 (file)
@@ -288,7 +288,9 @@ Node.prototype.create = function( tag, opt_attrs, opt_css ){
        return xnode;\r
 };\r
 Node.prototype.createAt = function( index, tag, opt_attrs, opt_css ){\r
-       // TODO\r
+       var xnode = Node.create( tag, opt_attrs, opt_css );\r
+       this.appendAt( index, xnode );\r
+       return xnode;\r
 };\r
 \r
 /* --------------------------------------\r
@@ -308,7 +310,9 @@ Node.prototype.createText = function( text ){
        return xnode;\r
 };\r
 Node.prototype.createTextAt = function( index, text ){\r
-       // TODO\r
+       var xtext = Node.createText( text );\r
+       this.appendAt( index, xtext );\r
+       return xtext;\r
 };\r
 \r
 /* --------------------------------------\r
index c583e28..0a06496 100644 (file)
@@ -49,8 +49,6 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits(
                        \r
                        switch( e.type ){\r
                                case X.Dom.Event.AFTER_UPDATE :\r
-                                       //\r
-                                       console.log( 'X.Dom.Event.AFTER_UPDATE' );\r
                                        this._iwin = raw.contentWindow || raw.contentDocument && raw.contentDocument.parentWindow || window.frames[ this._name ];\r
                                        \r
                                        this.xnodeIframe.listen( X.UA.IE < 9 ? [ 'readystatechange', 'error' ] : [ 'load', 'error' ], this );\r
@@ -62,8 +60,6 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits(
                                        };\r
                                        \r
                                case 'readystatechange' :\r
-                                       //alert( 'iframe readystatechange. ' + raw.readyState );\r
-                                       \r
                                        if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) return X.Callback.STOP_PROPAGATION;\r
                                        // ie9-\r
                                        if( !this._ready ){\r
index 88db71b..9ed0aea 100644 (file)
@@ -24,7 +24,7 @@ X.Net = {
                return new X_NET_Queue( X_NET_TYPE_JSONP, url );\r
        },\r
        \r
-       image : function( url, useIframe ){\r
+       image : function( url, needSize, useIframe ){\r
                return new X_NET_Queue( X_NET_TYPE_IMAGE, url );\r
        },\r
        \r
@@ -104,6 +104,7 @@ function X_NET_proxyDispatch( e ){
                        break;\r
                case X.Event.SUCCESS :\r
                case X.Event.ERROR :\r
+               case X.Event.TIMEOUT :\r
                case X.Event.CANCELED :\r
                        console.log( 'q: ' + e.type );\r
                        this.dispatch( e );\r
@@ -123,7 +124,7 @@ function X_NET_shiftQueue(){
        if( X_NET_currentQueue ){\r
                if( X_NET_currentWrapper._busy ) return;\r
                X_NET_currentWrapper\r
-                       .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue, X_NET_proxyDispatch )\r
+                       .unlisten( [ X.Event.PROGRESS, X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_currentQueue, X_NET_proxyDispatch )\r
                        .reset();\r
                X_NET_currentQueue = X_NET_currentWrapper = null;\r
        };\r
@@ -147,7 +148,7 @@ function X_NET_shiftQueue(){
                        break;\r
        };\r
        \r
-       X_NET_currentWrapper.listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
+       X_NET_currentWrapper.listen( [X.Event.PROGRESS, X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
        \r
        X_NET_currentWrapper.load( queue.data );\r
 };\r
index c839724..901c881 100644 (file)
@@ -22,20 +22,21 @@ new ActiveXObject( 'Msxml2.XMLHTTP.5.0' ); // バージョン5.0 は bugfix が
 var X_Net_XHR_W3C      = window[ 'XMLHttpRequest' ] && new XMLHttpRequest(),\r
        X_Net_XHR_X_DOMAIN = window[ 'XDomainRequest' ] && new XDomainRequest(),\r
        X_Net_XHR_VERSION  = 0,\r
-       X_Net_XHR_ACTIVE_X = 5 <= X.UA.IE && X.UA.IE < 8 && X.UA.ActiveX && ( new Function( [\r
+       X_Net_XHR_ACTIVE_X = !X.UA.IE4 && X.UA.IE < 8 && X.UA.ActiveX && ( new Function( [\r
                'var x=".XMLHTTP",',\r
                        'm="MSXML2"+x,',\r
-                       'v=[m+".6.0",m+".3.0",m+".5.0",m+".4.0",m,"Microsoft"+x],',\r
+                       'n=[m+".6.0",m+".3.0",m+".5.0",m+".4.0",m,"Microsoft"+x],',\r
+                       'v=[6,3,5,4,2,1],',\r
                        'i=-1;',\r
                'for(;i<5;){',\r
                        'try{',\r
-                               'return[++i,new ActiveXObject(v[i])];',\r
-                       '}catch(e){}',\r
+                               'return[v[++i],new ActiveXObject(n[i])]',\r
+                       '}catch(e){return false}',\r
                '}'\r
        ].join( '' ) ) )();\r
 \r
 if( X_Net_XHR_ACTIVE_X ){\r
-       X_Net_XHR_VERSION  = [ 6, 3, 5, 4, 2, 1 ][ X_Net_XHR_ACTIVE_X[ 0 ] ];\r
+       X_Net_XHR_VERSION  = X_Net_XHR_ACTIVE_X[ 0 ];\r
        X_Net_XHR_ACTIVE_X = X_Net_XHR_ACTIVE_X[ 1 ];\r
 };\r
 \r
@@ -76,18 +77,18 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                new X.EventDispatcher(),\r
                {\r
                                                \r
-                       _rawObject    : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
-                       _isXHR        : true,\r
-                       _isXDR        : false, // for ie8\r
+                       _rawObject : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
+                       _isXHR     : true,  // X.EventDispatcher で使用 for ie8-\r
+                       _isXDR     : false, // for ie8\r
                        \r
-                       _method       : '',\r
-                       _type         : '',\r
-                       _busy         : false,\r
-                       _canceled     : false,\r
-                       _lastProgress : 0,\r
+                       _method    : '',\r
+                       _type      : '',\r
+                       _busy      : false,\r
+                       _canceled  : false,\r
+                       _percent   : 0,\r
                        \r
                        load : function( obj ){\r
-                               var raw      = X_NET_XHRWrapper._rawObject,\r
+                               var raw      = this._rawObject,\r
                                        method   = obj[ 'method' ],\r
                                        url      = obj[ 'url' ],\r
                                        async    = obj[ 'async' ],\r
@@ -107,19 +108,23 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                        };\r
                                };\r
                                \r
+                               // TODO ie7 http://127.0.0.1 に対しては ActiveX を使う, onerror は不可\r
+                               \r
                                if( X_Net_XHR_X_DOMAIN ){\r
                                        if( false /* isXDomain( url ) */ ){ // isXDomain\r
-                                               //if( raw !== X_Net_XHR_X_DOMAIN ){\r
+                                               if( !this._isXDR ){\r
                                                        X_EventDispatcher_migrateEvent( this );\r
-                                                       X_NET_XHRWrapper._rawObject = X_Net_XHR_X_DOMAIN;\r
+                                                       this._rawObject = X_Net_XHR_X_DOMAIN;\r
                                                        X_EventDispatcher_restoreEvent( this );\r
-                                               //};\r
+                                                       this._isXDR = true;\r
+                                               };\r
                                        } else {\r
-                                               //if( raw === X_Net_XHR_X_DOMAIN ){\r
+                                               if( this._isXDR ){\r
                                                        X_EventDispatcher_migrateEvent( this );\r
-                                                       X_NET_XHRWrapper._rawObject = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
+                                                       this._rawObject = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
                                                        X_EventDispatcher_restoreEvent( this);\r
-                                               //};\r
+                                                       this._isXDR = false;\r
+                                               };\r
                                        };\r
                                };\r
                                //if( raw.timeout !== undefined ) raw.timeout = timeout || -1;\r
@@ -142,25 +147,22 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                raw.send( postbody || '' );\r
                        },\r
                        \r
-                       cancel : X.Net.XHR.CANCELABLE ?\r
-                               function(){\r
-                                       //X_NET_XHRWrapper._rawObject.abort()\r
-                               } :\r
-                               function(){\r
-                                       this._canceled = true;\r
-                               },\r
+                       cancel : function(){\r
+                               X.Net.XHR.CANCELABLE && this._rawObject.abort();\r
+                               this._canceled = true;\r
+                       },\r
                        \r
                        reset : function(){\r
-                               this._method       = this._type = null;\r
-                               this._canceled     = this._busy = false;\r
-                               this._lastProgress = 0;\r
+                               this._method   = this._type = '';\r
+                               this._canceled = this._busy = false;\r
+                               this._percent  = 0;\r
                        },\r
                        \r
                        handleEvent : function( e ){\r
-                               var raw  = X_NET_XHRWrapper._rawObject,\r
+                               var raw  = this._rawObject,\r
                                        live = !this._canceled,\r
                                        status, data;\r
-                               console.log( '-- ' + e.type );\r
+\r
                                switch( e.type ){\r
                                        /*\r
                                         * http://memopad.bitter.jp/w3c/ajax/ajax_xmlhttprequest_onreadystatechange.html\r
@@ -177,41 +179,37 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                        http://www.semblog.org/msano/archives/000407.html\r
                                        * */            \r
                                        case 'readystatechange' :\r
-                                               if( !X.Net.XHR.PROGRESS ){\r
+                                               //if( !X.Net.XHR.PROGRESS ){\r
                                                        switch( raw.readyState ){\r
                                                                case 0 :\r
                                                                case 1 :\r
                                                                        return;\r
-                                                               case 2 : // 0.01%\r
-                                                                       live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : 0.01 } );\r
+                                                               case 2 : // 0% ajaxstart\r
+                                                                       live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : 0 } );\r
                                                                        return;\r
                                                                case 3 :\r
-                                                                       live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._lastProgress < 99.9 ? 99.9 : ( this._lastProgress + 100 ) / 2 } );\r
+                                                                       live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._percent < 99.9 ? 99.9 : ( this._percent + 100 ) / 2 } );\r
                                                                        // 99.9%\r
                                                                        return;\r
                                                                case 4 :\r
-                                                                       if( this._lastProgress === 100 ) return; // Opera8 readystatechange が2重に発生\r
+                                                                       if( this._percent === 100 ) return; // Opera8 readystatechange が2重に発生\r
                                                                        // 100%\r
                                                                        break; // load へ\r
                                                                default :\r
                                                                        // error\r
                                                                        return;\r
                                                        };                                              \r
-                                               };\r
+                                               //};\r
        \r
                                        case 'load' :\r
                                                \r
-                                               if( !live ){\r
-                                                       this.reset();\r
-                                                       return;\r
-                                               };\r
-                                               if( this._lastProgress === 100 ) return;\r
-                                               \r
-                                               \r
-                                               this._lastProgress = 100;\r
+                                               if( !live ) return this.reset();\r
+                                               if( this._percent === 100 ) return;\r
                                                \r
                                                \r
-                                               status = raw.status;\r
+                                               this._percent = 100;\r
+                                               this._busy    = false;\r
+                                               status        = raw.status;\r
                                                \r
                                                // https://code.google.com/p/fakeworker-js/source/browse/src/javascript/fakeworker.js\r
                                                if(\r
@@ -247,24 +245,18 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                                                        data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
                                                                        break;\r
                                                        };\r
-                                                       \r
-                                                       //console.log( 'status ' + status );\r
-                                                       //console.dir( raw );\r
-                                                       \r
-                                                       this._busy = false;\r
+\r
                                                        this.asyncDispatch( 0, { type : X.Event.SUCCESS, status : status || 200, data : data } );                                                       \r
                                                } else {\r
-                                                       console.log( 'status ' + status );\r
-                                                       this._busy = false;\r
-                                                       //console.dir( raw );\r
                                                        live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status || 0, percent : 100 } );\r
                                                };\r
                                                break;\r
                                        \r
                                        case 'progress' :\r
+                                               // TODO X.Dom.Event でコピーしていないのでまだ動かない、、、\r
                                                if( e.lengthComputable ){\r
-                                                       this._lastProgress = e.loaded / e.total;\r
-                                                       live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._lastProgress } );\r
+                                                       this._percent = e.loaded / e.total;\r
+                                                       live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._percent } );\r
                                                };\r
                                                break;\r
                                        \r
@@ -287,7 +279,7 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                        \r
                        onUploadProgress : X.Net.XHR.UL_PROGRESS && function( e ){\r
                                var raw  = X_NET_XHRWrapper._rawObject.upload,\r
-                                       live = !this._canceled,\r
+                                       live = !X_NET_XHRWrapper._canceled,\r
                                        states, data;\r
                        }\r
                },\r
@@ -296,15 +288,15 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
        // 同期リクエストでなければならない場合, unload, beforeunload時\r
 \r
 \r
-       // ie8 ã\81§ã\81¯ timeout ã\81\8cæ\9c\89å\8a¹, MSXML ã\81®ã\83\90ã\83¼ã\82¸ã\83§ã\83³ã\81§æ±ºå®\9aã\81\99ã\81¹ã\81\8d?\r
+       // ie8 ã\81§ã\81¯ timeout ã\81\8cæ\9c\89å\8a¹, MSXML ã\81®ã\83\90ã\83¼ã\82¸ã\83§ã\83³ã\81¯é\96¢ä¿\82ã\81ªã\81\95ã\81\9dã\81\86ã\80\81ã\80\81ã\80\81\r
        if( X.UA.IE8 ){\r
                X_NET_XHRWrapper.listen( [ 'readystatechange', 'error', 'abort', 'timeout' ] );\r
        } else\r
        if( X.UA.IE7 ){\r
-               X_NET_XHRWrapper.listen( [ 'readystatechange', 'error' ] );\r
+               X_NET_XHRWrapper.listen( [ 'readystatechange', 'error' ] ); // ie7 ActiveX の場合、error は不可\r
        } else\r
        if( X_Net_XHR_ACTIVE_X ){ // win ie5-6\r
-               X_NET_XHRWrapper.listen( [ 'readystatechange' ] );\r
+               X_NET_XHRWrapper.listen( 'readystatechange' );\r
        } else \r
        if( X.Net.XHR.PROGRESS ){\r
                X_NET_XHRWrapper.listen( [ 'load', 'progress', 'error', 'abort', 'timeout' ] );\r
index f8df0bd..f1f65cb 100644 (file)
@@ -2,19 +2,23 @@
  * Operaでも非同期リクエストが並列処理できる img-JSONP
  * http://developer.cybozu.co.jp/takesako/2007/06/opera_img-jsonp.html
  * 
+ * iframe を使った jsonp の読み込みエラー判定の記事、
+ * JSONPのエラーを判断する は web archive でも観れない
+ * http://d.hatena.ne.jp/yuushimizu/20090128/1233146321
+ * TODO JSONPの動的取得+エラー処理
+ * http://d.hatena.ne.jp/NeoCat/20110206/1296934235
+ * 
  * IE9でiframe内で遷移した場合window.parentのメソッドを呼べない 
  * http://kozo002.blogspot.jp/2012/07/ie9iframewindowparent.html
- */
-
-/*
- * IE6(IETester) で動かない,localhost
+ * 
+ * IE6(IETester,localhost) で動かない,
  * 
  * TODO postMessage
  */
 
 X.Net.JSONP = {
        cb : function( accessKey, jsonString, time, opt_json2FileSize ){
-                       if( accessKey !== X_NET_JSONP_ACCESS_KEY ) return;
+                       if( accessKey !== X_NET_JSONP_ACCESS_KEY || !X_NET_JSONPWrapper._busy ) return;
                        
                        X_NET_JSONPWrapper._busy = false;
                        
@@ -33,22 +37,6 @@ var X_NET_JSONP_ACCESS_KEY = Math.random(),
        X_NET_JSONP_NinjaIframe;
 
 
-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 :
-               case X.Event.CANCELED :
-                       X_NET_JSONPWrapper._operaImage.unlisten().reset();
-                       X_NET_JSONPWrapper.asyncDispatch( 0, X.Event.ERROR );
-                       break;
-       };
-};
-if( !X.UA.Opera ) X_NET_JSONP_operaImageHandleEvent = null;
-
-
 function X_NET_JSONP_loadScriptInNinjaIframe( url ){
        var json2Path     = 'js/libs/json2.js',
                json2FileSize = 18103,
@@ -56,6 +44,8 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){
        
        X_NET_JSONP_NinjaIframe || ( X_NET_JSONP_NinjaIframe = new X.Util.NinjaIframe() );
        
+       // TODO '<scr'+'ipt> 化 恐らくアンチウイルスソフトが反応しないための対策
+       
        if( X.UA.IE8 ){
                html = [
                        // http://blog.livedoor.jp/dankogai/archives/51503830.html              
@@ -68,7 +58,7 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){
                        '<script src="', url, '"></script>' */
                        '<script id="jp"></script>',
                        '<script>',
-                               'nw=0;',
+                               'nw=0;', // なぜか必要,,,
                                'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',parent.JSON.stringify(o),-nw)}',
                                'function tm(){jp.src="', url ,'";nw=+new Date}',
                                'setTimeout(tm,16);',
@@ -89,12 +79,12 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){
                html = [        
                        '<script>',
                                'nw=+new Date;',
-                               'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw)}',
+                               'function cb(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw);nw=0}}',
                        '</script>',
                        '<script src="', url, '"></script>'
                ];
        } else
-       if( X.UA.IE < 5 || X.UA.MacIE ){
+       if( X.UA.IE4 || X.UA.MacIE ){
                html = [
                        '<script id="jn"></script>',
                        '<script id="jp"></script>',
@@ -120,7 +110,7 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){
        } else {
                html = [
                        '<script>',
-                               'function cb(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ')}',
+                               'function cb(o){if(nw){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ');nw=0}}',
                                'nw=+new Date;',
                        '</script>',
                        '<script src="', json2Path, '"></script>',
@@ -160,7 +150,7 @@ X_NET_JSONPWrapper = X.Class._override(
                        //createURL
                        if( X_NET_JSONP_operaImageHandleEvent ){
                                this._operaImage = X.Net.Image( url )
-                                       .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR ], X_NET_JSONP_operaImageHandleEvent );
+                                       .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent );
                        } else {
                                X_NET_JSONP_loadScriptInNinjaIframe( url );
                        };
@@ -171,7 +161,7 @@ X_NET_JSONPWrapper = X.Class._override(
                cancel : function(){
                        if( this._operaImage ){
                                this._operaImage
-                                       .unlisten()
+                                       .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent )
                                        .abort();
                                delete this._operaImage;
                        } else {
@@ -185,3 +175,18 @@ X_NET_JSONPWrapper = X.Class._override(
        }
 );
 
+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
index 40c4b7e..94eae12 100644 (file)
@@ -6,7 +6,10 @@
  * \r
  */\r
 \r
-var X_Net_Image_hasImage = !!window[ 'Image' ];\r
+var X_Net_Image_hasImage  = !!window[ 'Image' ],\r
+       X_Net_Image_image     = X_Net_Image_hasImage && new window[ 'Image' ](),\r
+       X_Net_Image_isElement = X.Type.isHTMLElement( X_Net_Image_image );\r
+       \r
 \r
 if( !X_Net_Image_hasImage ){\r
        alert( 'no Image!' );\r
@@ -17,27 +20,27 @@ if( !X_Net_Image_hasImage ){
  * new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。\r
  * Image は、X.EventDispatcher で、<img> は X.Dom.Node で。\r
  */\r
-X_NET_ImageWrapper = ( X_Net_Image_hasImage ? X.EventDispatcher : X.Dom.Node ).inherits(\r
+X_NET_ImageWrapper = ( !X_Net_Image_isElement ? X.EventDispatcher : X.Dom.Node ).inherits(\r
        'X.Net.Image',\r
        X.Class.POOL_OBJECT,\r
        {\r
-               _rawObject : X_Net_Image_hasImage && new Image,\r
+               _rawObject : X_Net_Image_image,\r
                \r
                tick       : 0,\r
                timerID    : 0,\r
                finish     : false,\r
-               abspath    : null,\r
-               delay      : null,\r
+               abspath    : '',\r
+               delay      : 0,\r
                timeout    : 0,\r
                \r
                Constructor : X_Net_Image_hasImage ?\r
                        (function(){\r
-                               this.listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.KILL_INSTANCE ] );\r
+                               this.listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.KILL_INSTANCE ] );\r
                        }) :\r
                        (function(){\r
                                this.SuperConstructor( document.createElement( 'img' ) )\r
                                        .appendTo( X.Dom.Node._systemNode )\r
-                                       .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.KILL_INSTANCE ] );\r
+                                       .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.KILL_INSTANCE ] );\r
                        }),\r
                \r
                load : function( abspath, opt_delay, opt_timeout ){\r
@@ -68,7 +71,7 @@ X_NET_ImageWrapper = ( X_Net_Image_hasImage ? X.EventDispatcher : X.Dom.Node ).i
                                                this.timerID = this.asyncDispatch( 0, { type : X.Event.ERROR } );\r
                                                return;\r
                                        };\r
-                                       size = X.Dom.Image.getActualDimension( X.UA.IE < 9 && X_Net_Image_hasImage ? this.abspath : this );\r
+                                       size = X.Dom.Image.getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
                                        this.timerID = this.asyncDispatch( 0, {\r
                                                type : X.Event.SUCCESS,\r
                                                src  : this.abspath,\r
@@ -78,11 +81,12 @@ X_NET_ImageWrapper = ( X_Net_Image_hasImage ? X.EventDispatcher : X.Dom.Node ).i
                                        break;\r
                                case X.Event.SUCCESS :\r
                                case X.Event.ERROR :\r
+                               case X.Event.TIMEOUT :\r
                                        this.timerID && X.Timer.remove( this.timerID );\r
                                        this.timerID = this.asyncDispatch( 0, X.Event.COMPLETE );\r
                                        break;\r
                                case X.Event.KILL_INSTANCE :\r
-                                       this.timerID && X.Timer.remove( this.timerID );\r
+                                       this.reset();\r
                                        !X_Net_Image_hasImage && this.destroy(); // if xnode\r
                                        this.unlisten();\r
                                        break;\r
@@ -110,7 +114,7 @@ X_NET_ImageWrapper = ( X_Net_Image_hasImage ? X.EventDispatcher : X.Dom.Node ).i
                        this.timerID && X.Timer.remove( this.timerID );\r
                        this.timerID  = 0;\r
                        this.finished = false;\r
-                       this.abspath  = null;                   \r
+                       this.abspath  = '';\r
                }\r
        }\r
 );\r