X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F05_util%2F01_XNinjaIframe.js;h=9964d5859b150062003659e923d4bce8a065a97c;hb=733b1bb359e89b077ad347a5737b4cd610f0a8cb;hp=8a026f004e4e1bf4f68ec8ef847011e2524e4b45;hpb=78f2b6b1bb07448d1c314775bf28a41b7111e386;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/05_util/01_XNinjaIframe.js b/0.6.x/js/05_util/01_XNinjaIframe.js index 8a026f0..9964d58 100644 --- a/0.6.x/js/05_util/01_XNinjaIframe.js +++ b/0.6.x/js/05_util/01_XNinjaIframe.js @@ -1,29 +1,36 @@ -/* +/** * http://msdn.microsoft.com/ja-jp/library/ie/hh180174%28v=vs.85%29.aspx * 孤立するとウィンドウ オブジェクトのプロパティが消去される + * + * http://qiita.com/sou/items/3380d4fa9b08b27bb387 + * モバイルブラウザでの iframe の挙動(Mobile Safari, Chrome for Android) + * + * @alias X.Util.NinjaIframe + * @class 隠し iframe 機能を提供します。 + * @constructor + * @constructs NinjaIframe + * @extends {Node} */ - -// TODO Node.inherits -X.Util.NinjaIframe = X.EventDispatcher.inherits( +var X_NinjaIframe = X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ]( 'NinjaIframe', { autoRefresh : 0, - xnodeIframe : null, - _iwin : null, - _html : '', + _contentHTML : '', _name : '', _ready : false, - Constructor : function( html ){ + 'Constructor' : function( html ){ this._name = 'hidden-iframe-' + X_Timer_now(); // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js - this.xnodeIframe = X_Node_body.create( - 'iframe', + X_Node_newByTag = true; + + this[ 'Super' ]( + 'IFRAME', { className : 'hidden-iframe', scrolling : 'no', @@ -35,102 +42,110 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits( } ); - X.ViewPort.listenOnce( X.Event.AFTER_UPDATE, this ); - // http://nanto.asablo.jp/blog/2011/12/08/6237308 // IE 6/7 で文書間通信を実現するための一案 - if( X_UA.IE < 9 ){ - this.xnodeIframe.attr( 'src', 'about:blank' ); + if( X_UA[ 'IE' ] < 9 ){ + this[ 'attr' ]( 'src', 'about:blank' ); }; // Safari 2.0.* bug: iframe's absolute position and src set. - if( !X_UA.Webkit ){ - this.xnodeIframe.css( { position : 'absolute' } ); + if( !X_UA[ 'Webkit' ] ){ + this[ 'css' ]( { position : 'absolute' } ); }; - if( html ) this._html = html; - }, - - handleEvent : function( e ){ - var raw = this.xnodeIframe._rawObject, - html, idoc; + if( html ) this._contentHTML = html; - switch( e.type ){ - case X.Event.AFTER_UPDATE : - this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ]; - // http://d.hatena.ne.jp/NeoCat/20080921/1221940658 - // こちらに名前をsetしないとtargetが動作しない - this._iwin.name = this._name; - - this.xnodeIframe.listen( [ X_UA.IE < 9 ? 'readystatechange' : 'load', 'error' ], this ); - - if( !( X_UA.IE < 9 ) ){ - this._html && X_Util_NinjaIframe_writeToIframe( this ); - this._ready = true; - return; - }; - - case 'readystatechange' : - if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) return X.Callback.STOP_PROPAGATION; - // ie9- - if( !this._ready ){ - this._html && X_Util_NinjaIframe_writeToIframe( this ); - this._ready = true; - return; - }; - // onload - case 'load' : - console.log( 'iframe load.' ); - this.asyncDispatch( X.Event.SUCCESS ); - break; - case 'error' : - this.asyncDispatch( X.Event.ERROR ); - break; - }; + this[ 'appendTo' ]( X_Node_body /* X_Node_systemNode */ ) + [ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Util_NinjaIframe_handleEvent ); - return X.Callback.STOP_PROPAGATION; + X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent ); }, - refresh : function( opt_html ){ - var raw = this.xnodeIframe._rawObject, + 'refresh' : function( opt_contentHTML ){ + var raw = this[ '_rawObject' ], idoc; this._ready = false; if( !this._iwin ){ - this._html = opt_html; + this._contentHTML = opt_contentHTML; return this; }; - if( X_UA.IE5 || X_UA.IE55 ){ + if( X_UA[ 'IE5x' ] ){ this._iwin.location.href = 'about:blank'; // reload() では、IE5.5(IETester)で2回目移行の操作でerrorが出る(doc取得やopen,writeで) } else { this._iwin.location.reload(); }; - if( !opt_html ) return this; + if( !opt_contentHTML && opt_contentHTML !== '' ) return this; - this._html = opt_html; - X_UA.IE < 9 || X_Util_NinjaIframe_writeToIframe( this ); + this._contentHTML = opt_contentHTML; + + if( !( X_UA[ 'IE' ] < 9 ) ){ + X_Util_NinjaIframe_writeToIframe( this ); + this._ready = true; + }; return this; - }, - - close : function(){ - X_ViewPort.unlisten( X.Event.AFTER_UPDATE, this ); - this.xnodeIframe.call( 'close' ); - this.xnodeIframe.destroy(); } } ); + +function X_Util_NinjaIframe_handleEvent( e ){ + var raw = this[ '_rawObject' ]; + + switch( e.type ){ + case X_EVENT_AFTER_UPDATE : + this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ]; + // http://d.hatena.ne.jp/NeoCat/20080921/1221940658 + // こちらに名前をsetしないとtargetが動作しない + if( X_UA[ 'IE' ] ) this._iwin.name = this._name; + + this[ 'listen' ]( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this, X_Util_NinjaIframe_handleEvent ); + + if( !( X_UA[ 'IE' ] < 9 ) ){ + ( this._contentHTML || this._contentHTML === '' ) && X_Util_NinjaIframe_writeToIframe( this ); + this._ready = true; + return; + }; + //break; これあると IE8 で駄目! + + case 'readystatechange' : + if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break; + // ie9- + if( !this._ready ){ + ( this._contentHTML || this._contentHTML === '' ) && X_Util_NinjaIframe_writeToIframe( this ); + this._ready = true; + break; + }; + // onload + case 'load' : + console.log( 'iframe load.' ); + this[ 'asyncDispatch' ]( 'ninjaload' ); + break; + + case 'error' : + this[ 'asyncDispatch' ]( 'ninjaerror' ); + break; + + case X_EVENT_KILL_INSTANCE : + X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent ); + this._iwin && this._iwin.close(); + break; + }; + + return X_CALLBACK_STOP_PROPAGATION; +}; + function X_Util_NinjaIframe_writeToIframe( that ){ - var raw = that.xnodeIframe._rawObject, + var raw = that[ '_rawObject' ], idoc = raw.contentDocument || that._iwin.document, - html = that._html; - - delete that._html; - that._ready = true; + html = that._contentHTML; + + that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明 + delete that._contentHTML; idoc.open(); idoc.writeln( html );