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框架加载页面实现的更多相关文章
- iframe框架加载完成后执行函数
var iframe = document.createElement("iframe"); iframe.src = "http://www.baidu.com/&qu ...
- jQuery - 动态创建iframe并加载页面
<html> <head> <script language="JavaScript" src="jquery-1.11.1.min.js& ...
- 酷版移动端iframe改变src,重新加载页面问题探究
最近在酷版上我要做一个内嵌别人的网页的在线服务页面,于是必须用到iframe,以前我以为移动端不支持iframe呢,原来这样都可以....(呵呵,长见识了!我还是只菜鸟) 直接入正题,说说我遇到的困难 ...
- 页面框架加载完自动执行函数$(function(){});
页面中有一些大的资源文件,如图片,声音等,如果一个事件绑定写在这些加载资源代码的下方,那么要等资源加载完才会绑定,这样体验不够好. 于是想不等资源加载完,只要框架加载完成就绑定事件,就可以把代码放在以 ...
- jquery-事件之页面框架加载后自动执行
jQuery事件之页面框架加载后自动执行 1)概述 HTML执行是按自上而下编译,而<script>一般写在body结束之前.如果在HTML加载的过程中卡住, 比如加载图片等,没有显示出来 ...
- ExtJS 4.1 TabPanel动态加载页面并执行脚本【转】
ExtJS 4.1 TabPanel动态加载页面并执行脚本 按照官方示例,可以动态加载页面,可是脚本不执行,于是查SDK.google,发现scripts需要设置为true,于是设置该属性,整个代码如 ...
- layer iframe加载单个图片或者加载页面
加载单个图片 layer.open({ type: , title: false, closeBtn: , area: '150px', skin: 'layui-layer-nobg', //没有背 ...
- Exploit Kit——hacker入侵web,某iframe中将加载RIG EK登录页面,最终下载并执行Monero矿工
RIG Exploit Kit使用PROPagate注入技术传播Monero Miner from:https://www.4hou.com/technology/12310.html 导语:Fire ...
- python-scrapy框架爬取某瓣电视剧信息--异步加载页面
前期准备,首先要有python环境+scrapy环境+pycharm环境 一.建立爬虫所需的环境,在命令行输入: scrapy startproject doubantv #命名自定义就好 会生成一个 ...
随机推荐
- 中小型数据库 RMAN CATALOG 备份恢复方案(一)
对于数据库的稳定性,高可用,跨平台以及海量数据库的处理,Oracle 数据库通常是大型数据库和大企业的首选.尽管如此,仍然不乏很多中小企业想要品尝一下Oracle腥味,因此在Oracle环境中也有不少 ...
- cocos2d-x for android:SimpleGame分析
cocos2d-x for android:SimpleGame分析 作为cocos2d-x的标配DEMO,SimpleGame可算是给入门学cocos2d-x的俺们这些新手门学习的对象了,那么来分析 ...
- nodejs模拟http-post文件的方法示例
var fs = require("fs"); var http = require('http'); function PostFileToServer(sFileName, d ...
- Hbase shell详情
HBase 为用户提供了一个非常方便的使用方式, 我们称之为“HBase Shell”.HBase Shell 提供了大多数的 HBase 命令, 通过 HBase Shell 用户可以方便地创建.删 ...
- Php 笔记1-----request和 response
不能大于2KB 第一次学习 php, 因为以前习惯了 .net, 所以 刚开始总是按照.net的 思路去思考, 怎么获取 客户端发过来的 request对象啊, 怎么设置response啊.. ...
- CMDB反思3
CMDB模型设计1 http://blog.vsharing.com/xqscool/A1274634.html 分类的问题上比较有感悟.在之前编写新版的CMDB模型的时候,曾将刀片机.x86服务器. ...
- 用python3破解wingIDE
值得注意的是,python2的整除/在python3中变成了//,sha方法细化成了sha1和sha256,所以破解文件需要更改加密方式和整除部分的编码方式,经过修改后,这个文件可以完美演算出破解码, ...
- C.xml
pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...
- Oracle 取两个表中数据的交集并集差异集合
Oracle 取两个表中数据的交集 关键字: Oracle 取两个表中数据的交集 INTERSECT Oracle 作为一个大型的关系数据库,日常应用中往往需要提取两个表的交集数据 例如现有如下表,要 ...
- nagios-解决监控页面上的乱码
1. 前景 在nagios的监控页面上发现返回来的信息为乱码,如下图所示: 查看相关日志,发现正常显示汉字,如下: 2. 解决方法(以下两个步骤缺一不可) 主要原因分析如下: 在nagios服务器上发 ...