ExtJs非Iframe框架加载页面实现

在用Ext开发App应用时,一般的框架都是左边为菜单栏,中间为tab页方式的显示区域。而tab页面大多采用的嵌入一个iframe来显示内容。但是采用iframe方式有一个很大的弊端就是每次在加载一个新的iframe时都要将Ext的核心js,css文件重新加载。由于Ext是一个庞大的类库,这些文件的体积都很庞大,仅仅是ext-all.js就有400多k,所以用iframe方式加载就大大降低了效率。为了能解决这个问题,我推荐使用Ext.Panel的autoload模式进行加载页面。用这种模式加载就可以避免Ext核心文件重新加载的问题。可以很好的提高程序的运行效率。以下我简单介绍一下实现的过程和原理,以及我在开发是遇到的问题和如何解决这些问题。

这种模式的几个技术点在于

1.菜单的点击事件实现? 
  2.将要加载的页面该如何编写? 
  3.如何让加载页面的控件的高度和宽度自适应,比如Panel,grid?

菜单事件的实现
  这个函数需要三个参数,
  a.模块编号,这个编号是自定义的,别且一定要唯一。在菜单点击事件中要把这个编号传过来,作为tab子页的id
  b.模块的url,tab子页autoload的url
  c.模块的名称,tab子页的title
  代码如下:
  
   function addtab(id,link,name){
      var tabId = "tab-"+id; //为id稍作修改。
      var tabTitle = name;
      var tabLink = link;
    
      var centerpanel = Ext.getCmp(‘displayCenterPanel‘);
      var tab = centerpanel.getComponent(tabId);//得到tab组建
    
      var subMainId = ‘tab-‘ + id + ‘-main‘;
    
      if(!tab){
    
        tab = centerpanel.add(
            new Ext.Panel({
                id:tabId,
                title:tabTitle,
                    //autoLoad:{url:tablink, scripts:true,nocache:true},
                autoScroll:true,
                iconCls:‘tabIconCss‘,
                layout: ‘fit‘,
                border:false,
                closable:true
            })
        );
        
        centerpanel.setActiveTab(tab);

tab.load({
            url: tabLink,
            method:‘post‘,
            params: {subMainId: subMainId},
            scope: this, // optional scope for the callback
            discardUrl: true,
            nocache: true,
            text: "页面加载中,请稍候……",
            timeout: 9000,
            scripts: true
        });
             
    }else{
        centerpanel.setActiveTab(tab);
    }    
}

将要加载的页面该如何编写
   <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
   <%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld"%>
   <%
        String mainName = (String)request.getParameter("subWcid");
    %>
<script>
        /*
                用到的js文件
                1、../js/appjs/frontMg/exposure/exposure.grid.js
                2、../js/appjs/frontMg/exposure/exposure.search.js
                3、../js/appjs/frontMg/exposure/exposure.view.js
                4、../js/appjs/frontMg/exposure/exposure.win.js
                5、../js/appjs/frontMg/exposure/exposure.js
        */
        var mainName = "<%=mainName%>";
        var Front_exposure_ButtonIds = ‘<s:property value="funccode"/>‘;
</script>

<div id="<%=mainName%>-p" style="height:100%"></div>

<script language="javascript" type="text/javascript" src="../js/appjs/frontMg/exposure/exposure2.js"></script>

加载页面的控件的高度和宽度自适应
   由于这种使用autoload模式加载进来的页面是不能随着浏览器的大小变化而变化的。所以我们要实现浏览器的大小变化函数,即window.onresize事件。
   但是在实现这个事件的时候,一定要加上setTimeout来控制它,让其延迟一会儿执行,否则是不能达到我们的效果。
  //控制tab页面容器大小的函数 
  function allComResize(){

var modelidarr = modelids.split(",");
    var len = modelidarr.length;

if(len==0){
        return false;
    }
    
    var w = Ext.getCmp(‘displayCenterPanel‘).getActiveTab().getInnerWidth();  
    var h = Ext.getCmp(‘displayCenterPanel‘).getActiveTab().getInnerHeight(); 
      
    for(var i=0; i<len;i++){
        var tmpmodelid = modelidarr;

var subPage = Ext.getCmp("tab-"+tmpmodelid+"-main");

if(subPage){

subPage.setWidth(w);
                subPage.setHeight(h);
        }
        
    }

}
  //通过window.onresize事件来执行allComResize函数控制tab容器的大小
   var oTime;
window.onresize = function()
{
    if (oTime)
    {
        clearTimeout(oTime);
    }
    oTime = setTimeout("allComResize()", 100); //延迟100毫秒执行
}

 

原文地址:http://www.phpchina.com/bbs/viewthread.php?tid=97424

ExtJs非Iframe框架加载页面实现

时间: 2024-08-13 00:34:49

ExtJs非Iframe框架加载页面实现的相关文章

iframe框架加载完成后执行函数

var iframe = document.createElement("iframe"); iframe.src = "http://www.baidu.com/"; if (!/*@[email protected]*/0) { //if not IE iframe.onload = function(){ alert("框架加载完毕."); }; } else { iframe.onreadystatechange = function()

artdialog 异步加载页面 生成验证码

artdialog  异步加载一个页面 需求:例如现在好多网站的登录或注册 都是点击弹出一个层出来 然后在上面登录.注册 这个登录可能在网站的每个页面都会有,但是我们又不能在每个页面都这一段html加载出来不显示,到需要用的时候,在给shou出来,这样做于情于理都说!不!!过!!!去!!!!!! 恰好以前接触过artdialog  不多说上代码,(注意思维,代码是死的方法是活,解决需求不一定非要这个方法 ) 1.页面html代码 1 <head runat="server">

动态加载页面数据的小工具 javascript + jQuery (持续更新)

使用该控件,可以根据url,参数,加载html记录模板(包含json参数对应,以及具体记录位置Index根据参数描述加载对应的属性,并可以根据简单的判断分支加载对应html或者控件)至列表容器内(JQuery选择器字符串)注: 该控件在使用前需引入JQuery框架支持,使用该控件,可极大的减少Ajax列表数据动态加载开发工作的实际工作量. 使用方式: 首先,添加控件引用,并加入Jquery支持 <script src="js/jquery.js"></script&g

Ace admin 如何实现类似于freamset加载页面

如上标题所述,ace admin做后台页面的时候,可以实现类似于用freamset的功能,但是ace admin做的比freamset更好,他可以用异步加载的形式展示,而加载的页面的内容可以尽可能的少(或者说按需加载). 这个主要是使用了pjax的功能,pjax的实现原理如下: history API中有几个新特性,分别是history.pushState和history.replaceState,我们把pushState+AJAX进行封装,合起来简单点叫,就是PJAX~ 虽说实现技术上没什么新

使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根据不同菜单定位到不同页面,而整体布局不会变化 这种布局结构对于单纯的HTML不具备这种嵌入各部分内容的能力,所以就需要我们自己来寻找或者解决这种问题,由于jquery的兼容性和使用广度比较不错,这里 使用jquery的load方法来处理这种页面布局框架. 二.load方法详解 1.定义 $(sele

弹出窗口,加载页面

弹出窗口,加载页面.要求jquery,加入jquery-ui可实现弹出窗口拖动. 1 var _divMask; 2 var _divBox; 3 4 function ShowMask() { 5 var divMask = $('<div></div>') 6 .attr("id", "divMask") 7 .css({ 8 "position": "absolute", 9 "left

屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能加载页面

发现在家里的时候用Android App里的WebView打开网站很慢,会有十几秒甚至更长时间的卡住. 但是在电脑上打开同样的网页却很快. 查找这个问题的过程比较曲折,记录下来. 抓取Android网络数据 为了调试这个问题,首先要抓取Android的网络包数据.开始时,是想用Wireshark来抓包的,但是很麻烦,tcpdump在手机要root权限. 于是转换思路,能不能在Android上设置代理,来抓包? 但是fiddler没有linux版本,于是转用BurpSuite了. 设置Androi

爬虫再探实战(三)———爬取动态加载页面——selenium

自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的知识.目标——抓取页面所有的高考录取分数信息. 对于动态加载,开始的时候是看到Selenium+Phantomjs的强大,直接就学的这个.打开网页查看网页源码(注意不是检查元素)会发现要爬取的信息并不在源码里面.也就是说,从网页源码无法通过解析得到数据.Selenium+Phantomjs的强大一方

在meta标签添加代码实现每次请求都要求重新加载页面而不是读取缓存

<!-- 禁止浏览器从本地缓存中调阅页面.--> <meta http-equiv="pragram" content="no-cache"> <!--网页不保存在缓存中,每次访问都刷新页面.--> <meta http-equiv="cache-control" content="no-cache, must-revalidate"> <!--同上面意思差不多,必须重新加