Extjs miframe的使用

Iframe 有的时候还是须要的,比如在Tab中嵌入报表、嵌入其它系统的界面。下面代码是项目中一段

ExtJs 3.1.1

使用IFrame须要一个ExtJS的一个插件ManagedIFrame(miframe.js),用了这个插件可以使用 xtype:'iframepanel' 

代码段:

 1:  var p_center = new Ext.TabPanel({
 2:          region: "center",
 3:          resizeTabs: true, // turn on tab resizing
 4:          minTabWidth: 115,
 5:          tabWidth: 135,
 6:          enableTabScroll: true,
 7:          width: 600,
 8:          activeTab: 0,
 9:          height: 250,
10:                     items:[{
11:                          xtype: 'iframepanel',
12:                          title:'系?统?容?量?分?配?',
13:                           id:"form_chapteradmin",
14:                            loadMask:{msg:'Loading Quote...'},
15:                            deferredRender: false, 
16:                            //bodyStyle:'padding:10px',
17:                            frameConfig:{name:'chatperadminForm'},
18:                            border:false,
19:                            //frame:true,
20:                            defaultSrc: 'http://mhl-pc/ReportServer?%List&rs:Command=Render:toolbar=false'
21:                        }],
22:          defaults: { autoScroll: true }
23:      });
24:   

 

图:

Snap1


另一个列子的使用,其中miframe.js的源代码也贴出
view plain
<pre name="code" class="html"><script type="text/javascript" src="miframe.js"></script>  
  
  
<script type="text/javascript">  
 Ext.onReady(function(){  
  var pane = new Ext.Panel({  
   name:'my panel',  
   renderTo:'newid',  
   items:[{  
    xtype:'iframepanel',  
    title:'有滚动条的iframe',  
    defaultSrc:'iframe.html',  
    defaultHeight:'200'  
   }]  
  });  
  
  var pane1 = new Ext.Panel({  
   name:'my panel',  
   renderTo:'noscr',  
   items:[{  
    xtype:'iframepanel',  
    title:'这个iframe',  
    defaultSrc:'iframe.html'  
   }]  
  });  
 });  
</script>  
</head>  
<body>  
<div id="newid"></div>  
<div id="noscr"></div>  
  
   
  
miframe.js  如下:  
  
   
  
//====================================================================================  
  
   
  
/*  
  * Usage:<br>  
   * <pre><code>  
   * // Harness it from an existing Iframe from markup  
   * var i = new Ext.ux.ManagedIFrame("myIframe");  
   * // Replace the iFrames document structure with the response from the requested URL.  
   * i.load("http://myserver.com/index.php", "param1=1¶m2=2");  
   * //Notes:  this is not the same as setting the Iframes src property !  
   * // Content loaded in this fashion does not share the same document namespaces as it's parent --  
   * // meaning, there (by default) will be no Ext namespace defined in it since the document is  
   * // overwritten after each call to the update method, and no styleSheets.  
  * </code></pre>  
  * <br>  
   * @cfg {Boolean/Object} autoCreate True to auto generate the IFRAME element, or a {@link Ext.DomHelper} config of the IFRAME to create  
   * @cfg {String} html Any markup to be applied to the IFRAME's document content when rendered.  
    * @constructor  
    * Create new Updater directly.  
    * @param {Mixed} el, Config object The iframe element or it's id to harness or a valid config object.  
    * @param {Config} forceNew (optional) By default the constructor checks to see if the passed element already has an Updater and if it does it returns the same instance. This will skip that check (useful for extending this class).  
 */  
   
 Ext.ux.ManagedIFrame = function(){  
        
     var args=Array.prototype.slice.call(arguments, 0)  
         ,el = Ext.get(args[0])  
         ,config = args[0];  
     if(el && el.dom && el.dom.tagName == 'IFRAME'){  
         config = args[1] || {};  
     }else{  
        config = args[0] || args[1] || {};  
        el = config.autoCreate?  
   Ext.get(Ext.DomHelper.append(document.body, Ext.apply({tag:'iframe',scrolling:'YES', src:(Ext.isIE&&Ext.isSecure)?Ext.SSL_SECURE_URL:''},config.autoCreate))):null;  
     }  
       
     if(!el || el.dom.tagName != 'IFRAME') return el;  
        
     !!el.dom.name.length || (elel.dom.name = el.dom.id); //make sure there is a valid frame name  
    
        this.addEvents({       
         /**  
           * @event documentloaded  
           * Fires when the iFrame's Document(DOM) has reach a state where the DOM may be manipulated  
           * @param {Ext.ux.ManagedIFrame} this  
           */  
        "documentloaded" : true  
      
     });  
               
        if(config.listeners){  
   this.listeners=config.listeners;  
   Ext.ux.ManagedIFrame.superclass.constructor.call(this);  
     
        }  
           
         Ext.apply(el,this);  // apply this class interface ( pseudo Decorator )  
           
         el.addClass('x-managed-iframe');  
     
   //el.dom.scrolling="auto";//--------------------------------  
     
           
         var content = config.html || config.content || false;  
           
      if(content){  
    el.update.defer(100,el,[content]);//allow the iframe to quiesce for Gecko  
         }  
           
         return el;  
       
    };          
   
    Ext.extend(Ext.ux.ManagedIFrame , Ext.util.Observable,  
       {   
         
       /*  
   Write(replacing) string content into the IFrames document structure  
  * @param {String} content The new content  
         * @param {Boolean} loadScripts (optional) true to also render and process embedded scripts  
         * @param {Function} callback (optional) Callback when update is complete.   
     */  
     update : function(content,loadScripts,callback){  
           
         loadScriptsloadScripts = loadScripts || this.getUpdateManager().loadScripts || false;  
            
      this._windowContext = null;  
      content = Ext.DomHelper.markup(content||'');  
                               
      var doc = this.getDocument();  
      if(doc){  
        doc.open();  
      
        doc.write(loadScripts===true?  
             content:content.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, ""));  
          
        //create an 'eval'able context for the iframe and this.execScript  
        doc.write ('<script type="text/javascript">(function(){'+  
                 "var MSIE/*@cc_on=1@*/;"+ // IE sniff  
                 "parent.Ext.get('"+this.dom.id +"')._windowContext=MSIE?this:{eval:function(s){return eval(s);}}"+  
             "})();<\/script>" );  
                
               
        doc.close();  
      
        if(!!content.length){  
           this.checkDOM(false,callback);   
        } else if(callback){  
         callback();  
        }  
      }  
      
      return this;  
     },  
     _windowContext : null,  
     /*  
   Return the Iframes document object  
     */  
     getDocument:function(){  
      return this.getWindow().document;  
     },  
       
     /*  
   Return the Iframes window object  
     */  
     getWindow:function(){  
         var dom= this.dom;  
      return dom?dom.contentWindow||window.frames[dom.name]:window;  
     },  
       
     /*  
   Print the contents of the Iframes (if we own the document)  
     */  
     print:function(){   
         if(this._windowContext){  
           try{        
    var win = this.getWindow();  
      
    if(Ext.isIE){  
     win.focus();  
    }   
    win.print();  
           }catch(ex){  
    throw 'print: invalid document context';  
           }  
         }       
     },  
     //private  
     destroy:function(){  
         
         this.removeAllListeners();  
           
         if(this.dom && this.dom.src) {  
           this.dom.src = 'javascript:false';  
         }    
           
                   
     }  
     /*  
       Execute a javascript code block(string) within the context of the Iframes window object.  
       * @param {String} block A valid ('eval'able) script source block.  
       * <p> Note: execScript will only work after a successful update (document.write);  
     */  
     ,execScript: function(block){  
         if(this._windowContext){  
             return this._windowContext.eval( block );  
         } else {  
          throw 'execScript:no script context';  
         }  
     }  
     /* Private   
   Poll the Iframes document structure to determine DOM ready state,  
   and raise the 'documentloaded' event when applicable.  
     */  
     ,checkDOM : function(win,callback){  
             //initialise the counter  
      var n = 0   
         ,winwin = win||this.getWindow()  
         ,manager = this;  
        
        var t =function() //DOM polling  
       {  
        var domReady=false;  
        //if DOM methods are supported, and the body element exists  
        //(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1]   
        //in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)  
          
        domReady  = (win.document && typeof win.document.getElementsByTagName != 'undefined'   
            && ( win.document.getElementsByTagName('body')[0] != null || win.document.body != null ));  
          
        //if the timer has reached 70 (timeout after ~10.5 seconds)  
        //in practice, shouldn't take longer than 7 iterations [in kde 3   
        //in second place was IE6, which takes 2 or 3 iterations roughly 5% of the time]  
        if(n++ < 70 && !domReady)  
        {  
         //try again  
         t.defer(150);  
         return;  
        }  
        if(callback)callback();  
        manager.fireEvent("documentloaded",manager); //fallback  
               };  
      t();  
        }  
 });  
   
 /*  
  * @class Ext.ux.ManagedIFramePanel   
  * Version:  0.11  
  *     Made Panel state-aware.  
  * Version:  0.1  
  * Author: Doug Hendricks 12/2007 doug[always-At]theactivegroup.com  
  *  
  *    
 */  
 ExtExt.ux.ManagedIframePanel = Ext.extend(Ext.Panel, {  
    /**  
     * @cfg {String/Object/Function} bodyCfg  
     Custom bodyCfg used to embed the ManagedIframe.       
    */  
 //alert(defaultHeight);  
    bodyCfg:{tag:'div'  
      ,cls:'x-panel-body'  
      ,children:[{tag:'iframe',frameBorder:0,width:'100%',height:this.defaultHeight||'200',cls:'x-managed-iframe',scrolling:'auto'}]  
    },  
      
      
    //id:null,  
      
    /**  
         * Cached Iframe.src url to use for refreshes. Overwritten every time setSrc() is called unless "discardUrl" param is set to true.  
         * @type String  
     */  
    defaultSrc:null,  
  
    /**  
         * @cfg {String/Object/Function} iframeStyle  
         * Custom CSS styles to be applied to the body's ux.ManagedIframe element in the format expected by {@link Ext.Element#applyStyles}  
         * (defaults to {overflow:'auto'}).  
     */  
    iframeStyle: {overflow:'auto'},  
      
    animCollapse:false,   
      
    initComponent : function(){   
         Ext.ux.ManagedIframePanel.superclass.initComponent.call(this);   
         this.addEvents("documentloaded");  
           
         if(this.defaultSrc){  
        this.on('render',  function(){this.setSrc();}, this, {delay:10});  
          
        }  
         },  
           
      // private  
     onDestroy : function(){  
         if(this.iframe){  
             delete this.iframe.ownerCt;  
             Ext.destroy(this.iframe);  
         }  
                    
         Ext.ux.ManagedIframePanel.superclass.onDestroy.call(this);  
     },     
      
     // private  
      onRender : function(ct, position){  
          
        Ext.ux.ManagedIframePanel.superclass.onRender.call(this, ct, position);   
          
        if(thisthis.iframe = this.body.child('iframe.x-managed-iframe')){  
            this.iframe = new Ext.ux.ManagedIFrame(this.iframe);  
          
            thisthis.iframe.ownerCt = this;    
            this.relayEvents(this.iframe, ["documentloaded"]);  
              
            if(this.iframeStyle){  
       this.iframe.applyStyles(this.iframeStyle);  
            }  
        }  
      },    
        // private  
     afterRender : function(){    
         if(this.html && this.iframe){  
              this.iframe.update(typeof this.html == 'object' ?  
                             Ext.DomHelper.markup(this.html) :  
                             this.html);  
              delete this.html;  
          }  
                               
          Ext.ux.ManagedIframePanel.superclass.afterRender.call(this);   
           
     },  
       
      //private    
     doAutoSrc : function(){  this.setSrc();  },  
       
         /**  
          * Sets the embedded Iframe src property.  
            
          * @param {String/Function} url (Optional) A string or reference to a Function that returns a URI string when called  
          * @param {Boolean} discardUrl (Optional) If not passed as <tt>false</tt> the URL of this action becomes the default URL for  
          * this panel, and will be subsequently used in future setSrc calls.  
          * Note:  invoke the function with no arguments to refresh the iframe based on the current defaultSrc value.  
         */  
     setSrc : function(url, discardUrl){  
                  
        var src = url || this.defaultSrc || (Ext.isIE&&Ext.isSecure?Ext.SSL_SECURE_URL:'');  
                
  if(this.rendered && this.iframe){ //rendered?  
              this.iframe._windowContext = null;  
              this.iframe.dom.src = (typeof src == 'function'?src()||'':src);  
     thisthis.iframe.dom.height=this.defaultHeight||'200';//add by mlc 2008-04-15  
        }  
  
          
        /*for(var i=0;i<prefs.length;i++){  
          if(this.id==prefs[i].text){  
           this.iframe.dom.src=prefs[i].items.defaultSrc;  
          }  
        }*/  
                 
        if(discardUrl !== true){ this.defaultSrc = src; }  
        this.saveState();  
     },  
       
     //Make it state-aware  
     getState: function(){  
  
        return Ext.apply(Ext.ux.ManagedIframePanel.superclass.getState.call(this) || {},  
             {defaultSrc  :this.defaultSrc });  
     }  
   
});   
Ext.reg('iframepanel', Ext.ux.ManagedIframePanel);  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值