OSDN Git Service

Version 0.6.168, fix X.UI.Repeater.
[pettanr/clientJs.git] / 0.6.x / js / 05_util / 01_XNinjaIframe.js
index a0ffddd..08f7d21 100644 (file)
@@ -1,29 +1,32 @@
 /*\r
  * http://msdn.microsoft.com/ja-jp/library/ie/hh180174%28v=vs.85%29.aspx\r
  * 孤立するとウィンドウ オブジェクトのプロパティが消去される\r
+ * \r
+ * http://qiita.com/sou/items/3380d4fa9b08b27bb387\r
+ * モバイルブラウザでの iframe の挙動(Mobile Safari, Chrome for Android)\r
  */\r
 \r
 // TODO Node.inherits\r
-X.Util.NinjaIframe = X.EventDispatcher.inherits(\r
+X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ](\r
        'NinjaIframe',\r
        {\r
                autoRefresh  : 0,\r
                \r
-               xnodeIframe  : null,\r
-               \r
                _iwin        : null,\r
                \r
                _contentHTML : '',\r
                _name        : '',\r
                _ready       : false,\r
                \r
-               Constructor : function( html ){\r
+               'Constructor' : function( html ){\r
                        \r
                        this._name = 'hidden-iframe-' + X_Timer_now();\r
                        // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js\r
 \r
-                       this.xnodeIframe = X_Node_body.create(\r
-                               'iframe',\r
+                       X_Node_newByTag = true;\r
+\r
+                       this[ 'Super' ](\r
+                               'IFRAME',\r
                                {\r
                                        className         : 'hidden-iframe',\r
                                        scrolling         : 'no',\r
@@ -35,62 +38,26 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits(
                                }\r
                        );\r
                        \r
-                       X_ViewPort.listenOnce( X_Event.AFTER_UPDATE, this );\r
-                       \r
                        // http://nanto.asablo.jp/blog/2011/12/08/6237308\r
                        // IE 6/7 で文書間通信を実現するための一案\r
                        if( X_UA[ 'IE' ] < 9 ){\r
-                               this.xnodeIframe.attr( 'src', 'about:blank' );\r
+                               this[ 'attr' ]( 'src', 'about:blank' );\r
                        };\r
                        // Safari 2.0.* bug: iframe's absolute position and src set.\r
                        if( !X_UA[ 'Webkit' ]  ){\r
-                               this.xnodeIframe.css( { position : 'absolute' } );\r
+                               this[ 'css' ]( { position : 'absolute' } );\r
                        };\r
                        \r
-                       if( html ) this._contentHTML = html;\r
-               },\r
-               \r
-               handleEvent : function( e ){\r
-                       var raw = this.xnodeIframe._rawObject;\r
+                       if( html ) this._contentHTML = html;                    \r
                        \r
-                       switch( e.type ){\r
-                               case X_Event.AFTER_UPDATE :\r
-                                       this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
-                                       // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
-                                       // こちらに名前をsetしないとtargetが動作しない\r
-                                       if( X_UA[ 'IE' ] ) this._iwin.name = this._name;\r
-                                       \r
-                                       this.xnodeIframe.listen( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this );\r
-                                       \r
-                                       if( !( X_UA[ 'IE' ] < 9 ) ){\r
-                                               this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
-                                               this._ready = true;\r
-                                               return;\r
-                                       };\r
-                                       \r
-                               case 'readystatechange' :\r
-                                       if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break;\r
-                                       // ie9-\r
-                                       if( !this._ready ){\r
-                                               this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
-                                               this._ready = true;\r
-                                               break;\r
-                                       };\r
-                                       // onload\r
-                               case 'load' :\r
-                                       console.log( 'iframe load.' );\r
-                                       this.asyncDispatch( X_Event.SUCCESS );\r
-                                       break;\r
-                               case 'error' :\r
-                                       this.asyncDispatch( X_Event.ERROR );\r
-                                       break;\r
-                       };\r
+                       this[ 'appendTo' ]( X_Node_body /* X_Node_systemNode */ )\r
+                               [ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Util_NinjaIframe_handleEvent );\r
                        \r
-                       return X.Callback.STOP_PROPAGATION;                     \r
+                       X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
                },\r
                \r
-               refresh : function( opt_contentHTML ){\r
-                       var raw = this.xnodeIframe._rawObject,\r
+               'refresh' : function( opt_contentHTML ){\r
+                       var raw = this[ '_rawObject' ],\r
                                idoc;\r
                                \r
                        this._ready = false;\r
@@ -106,30 +73,75 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits(
                                this._iwin.location.reload();\r
                        };\r
                        \r
-                       if( !opt_contentHTML ) return this;\r
+                       if( !opt_contentHTML && opt_contentHTML !== '' ) return this;\r
                        \r
                        this._contentHTML = opt_contentHTML;\r
-                       X_UA[ 'IE' ] < 9 || X_Util_NinjaIframe_writeToIframe( this );\r
+\r
+                       if( !( X_UA[ 'IE' ] < 9 ) ){\r
+                               X_Util_NinjaIframe_writeToIframe( this );\r
+                               this._ready = true;\r
+                       };\r
                        \r
                        return this;\r
-               },\r
-               \r
-               close : function(){\r
-                       X_ViewPort.unlisten( X_Event.AFTER_UPDATE, this );\r
-                       this.xnodeIframe.call( 'close' );\r
-                       this.xnodeIframe.destroy();\r
                }\r
                \r
        }\r
 );\r
 \r
+\r
+function X_Util_NinjaIframe_handleEvent( e ){\r
+       var raw = this[ '_rawObject' ];\r
+       \r
+       switch( e.type ){\r
+               case X_EVENT_AFTER_UPDATE :\r
+                       this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
+                       // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
+                       // こちらに名前をsetしないとtargetが動作しない\r
+                       if( X_UA[ 'IE' ] ) this._iwin.name = this._name;\r
+                       \r
+                       this[ 'listen' ]( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this, X_Util_NinjaIframe_handleEvent );\r
+                       \r
+                       if( !( X_UA[ 'IE' ] < 9 ) ){\r
+                               ( this._contentHTML || this._contentHTML === '' ) && X_Util_NinjaIframe_writeToIframe( this );\r
+                               this._ready = true;\r
+                               return;\r
+                       };\r
+                       //break; これあると IE8 で駄目!\r
+                       \r
+               case 'readystatechange' :\r
+                       if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break;\r
+                       // ie9-\r
+                       if( !this._ready ){\r
+                               ( this._contentHTML || this._contentHTML === '' ) && X_Util_NinjaIframe_writeToIframe( this );\r
+                               this._ready = true;\r
+                               break;\r
+                       };\r
+                       // onload\r
+               case 'load' :\r
+                       console.log( 'iframe load.' );\r
+                       this[ 'asyncDispatch' ]( 'ninjaload' );\r
+                       break;\r
+\r
+               case 'error' :\r
+                       this[ 'asyncDispatch' ]( 'ninjaerror' );\r
+                       break;\r
+               \r
+               case X_EVENT_KILL_INSTANCE :\r
+                       X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
+                       this._iwin && this._iwin.close();\r
+                       break;\r
+       };\r
+       \r
+       return X_Callback_STOP_PROPAGATION;\r
+};\r
+\r
 function X_Util_NinjaIframe_writeToIframe( that ){\r
-       var raw  = that.xnodeIframe._rawObject,\r
+       var raw  = that[ '_rawObject' ],\r
                idoc = raw.contentDocument || that._iwin.document,\r
                html = that._contentHTML;\r
-               \r
+       \r
+       that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明\r
        delete that._contentHTML;\r
-       that._ready = true;\r
 \r
        idoc.open();\r
        idoc.writeln( html );\r