当前位置: 代码迷 >> Web前端 >> 《认真分析Ext》第N-1章 Ext的可视组件 第一节:Panel的实质是什么
  详细解决方案

《认真分析Ext》第N-1章 Ext的可视组件 第一节:Panel的实质是什么

热度:238   发布时间:2012-11-22 00:16:41.0
《仔仔细细分析Ext》第N-1章 Ext的可视组件 第一节:Panel的实质是什么?


??????????????????????????????????????????
?

导言:

???????? wegidit 部分是 Ext 最吸引人,也是最绚丽、最好看的部分。相当多的人就是冲 Ext 的这一点才开始学习使用 Ext 的(我也是)。

很多 js 库都曾尝试封装出自己的 UI 组件,毫无疑问, Ext 是封装得最好的一个。虽然,确实像大家一直抱怨的那样, Ext 可视组件的渲染效率方面还存在相当多的问题。

???????? UI 组件是 Ext 库里面最为庞大的部分,代码量很多。前面所有基础的封装在这里都要派上用场,与事件的绑定和处理、 CSS 的渲染、正则表达式过滤、 Ajax ,所有的要点都要在 UI 部分交汇,因此 UI 组件部分可以说是枝节丛生,纷繁复杂。

????????

?

我曾看过一本书,叫《密码传奇》,里面讲述了二战期间,德军与盟军的情报战。德军发明了一种叫 Enigma 的加密机器,虽然采用的算法并不高深,都是原始加密方法的改进、加强版。只是利用机械的力量,提高加密计算的次数。比如原始的加密,依靠人工计算,最多算几万次,那么现在让机器把相同的过程重复十万次。不要小看这种看似机械简单的重复,这种数量上的提升直接导致了加密水平上质的变化。直到战争结束,盟军都没有能够完全解开这种密码。

这里不是为了讲故事,而是为了着重提出书里面的一段话,大概意思是这样的:按照正向思维加密出来的密码,在破译者看来就是天书。如果加密的所要花费的时间是 1 天,那么解密需要的时间可能就是 1 个月、 1 年,甚至永远无法解开。

?

?

?

Ext 的代码库已经相当庞大,但是很可惜,我们不是代码库的开发人员,所以源码分析这个事情对于我们来说就类似一种解密的过程,是逆向思维。如果企图完全去领会 Ext 的开发者当时的思路,细扣每一行代码,实在不是一件容易的事情。因此,我想还是用演绎的方法来进行这部分内容的分析:先来分析一个典型的组件,然后可以推广到类似的组件。

这是我学习未知东西方法,把它也用在 Ext 的源码分析上来。虽然这种方法让我在学校的时候吃了不少亏,比如《高等数学》,学校希望的终极目的是你能解题目、能考试,而且能靠高分。但是我老是不明白:

像泰勒级数这种东西到底能用在什么地方?

泰勒当时是怎么想到怎么好的方法的?

他的思想当时处于一种什么样的状态?

这些东西它是怎么一步一步演变到如今这种状态的?

诸如此类 ……

这么追下去,整个的学期就完全费在了看“数学史”这类书上。至于考试,就只能勉强混个 70 分而已(耿耿于怀啊!)。

呵呵。

????????

????????

好了,扯远了,开始 Panel 的分析。

?

?

Ext.Panel DIV+CSS 的混合物

???????? 说到底,浏览器能识别和解析的是一些 Html 标签,因此无论 Ext UI 组件封装得有多严实,最终肯定是要创建出原始的 DOM 元素出来。基于这一点,我们的分析就找到了可以下手的地方。

????????

new 一个最简单的 Ext.Panel 对象出来,利用 FireBug ,看一下脚本创建出来的 DOM 元素到底是什么样子。

Ext.onReady(function(){

???????? var p=new Ext.Panel({

?????????????????? title:' 标题文字 ',

?????????????????? width:400,

?????????????????? height:300,

?????????????????? renderTo:Ext.getBody()

???????? })

})

好,这是一个最简单不过的 Panel ,来看它显示出来的样子:


?

打开 FireBug ,查看元素:

?



?
?

OK ,不是很意外,由一堆的 DIV CSS 组合出了这麽一个 Panel 对象。

?

为了验证一下,我们自己来写标签和 CSS ,看能不能直接生成出一个手工的 Panel 对象。好,我们不写脚本,直接的 Html 标签和 CSS ,外加一张小图片来合成 Panel

代码如下:

?

<html>
	<head>
		<title>Ext源码分析</title>
		<meta http-equiv="Content-Type" content="text/html"; charset="utf-8">
		<style type="text/css">
			.mydiv{
				border-style:solid;
				border-color:#99bbe8;
				border-width:0;
			}
			.myheader{
				overflow:hidden;
				zoom:1;
				color:#15428b;
				font:bold 11px tahoma,arial,verdana,sans-serif;
				padding:5px 3px 4px 5px;
				border:1px solid #99bbe8;
				line-height:15px;
				background:transparent url(white-top-bottom.gif) repeat-x 0 -1px;
			}
			
			.mybody{
				border:1px solid #99bbe8;
				border-top:0 none;
				overflow:hidden;
				background:white;
				position:relative;
			}
		</style>
	</head>
	<body>
		
		<div class="mydiv" style="width:400px">
			<div class="myheader">
				<span>这里是标题</span>
			</div>
			<div>
				<div class="mybody" style="width:398px;height:273px;">
					这是完全手工模拟出来的一个Panel
				</div>
			</div>
		</div>
		
	</body>
</html>
?

(里面用到的一张小图片请到附件查找,或者找Ext资源包下的同名的那张。)

外观:

?

?

怎么样,一模一样吧?

?

?

?

?

效率问题从何而来?

为上面的 Panel 添加两个小按钮,看看生成出来的标签又是什么样子。

外观:


实际生成的标签:

总体:

?



?
?

Tabel 里面的细节:

?



?

?

??????? 可以看出,我们仅仅为这个 Panel 添加了两个 Button ,出来一长串的标签。这还是最简单的 Panel ,放到正常的 Ext 应用里面,可以想象,脚本实际生成出来的 Html 标签肯定是数以万计(甚至 10 万到百万)这个数量级。

???????? 虽然目前的浏览器对 Html 标签的解析速度是相当之快,但是对于这个数量级的 Html 标签加上图片、 CSS 、事件绑定、回调函数处理 …… 这些杂七杂八的事情,其执行速度还有渲染的流畅程度必定会受到影响无疑。

???????? 比较客观地说,这种效率问题并不是 Ext 本身的问题,也不是靠 Ext 做多大的改进和代码优化所能彻底解决的,只能期待 JavaScript 引擎在这方面能做出更多的努力(或许是一种编译型的 javascript ?)。

?

?

解析跟进

???????? 以上解释了 Panel 和这一堆可视化的组件“是什么?”的问题。那么自然而然,接下来就得解释“为什么?”和“怎么办?”的问题。毕竟,明白道理不是最终目的,最终目的是能把这些道理为我所用,能多快好省地解决项目里面实实在在的问题才是终极彼岸。

?????? 后面的分析还是针对 Panel ,这样可以避免一些重复劳动。

总结起来,后面的部分需要解决这些问题:

1、 ? Panel 里面的这一堆的 Div 是怎么创建出来的?

2、 ? CSS 是怎么与 Div 或者 Tabel 这些原生的标签绑定在一起的?

3、 ? 怎么绑定、处理事件的?

4、 ? 怎么来扩展自己的小组件,或者改动甚至优化原有组件的实现呢?

5、 ? 使用组件、扩展组件过程中常见的问题甚至 Bug 有哪些?怎么解决?

?

(如果以上任何一个问题你恰好研究过,记得跟我联系,帮助一下。也省得我犯重复发明轮子的愚蠢错误。群 88403922

?

?

?

1 楼 yiminghe 2009-06-20  
做为兴趣,重复发明轮子没有错,希望你能更深入的分析
2 楼 yangfudong 2009-06-20  
楼主继续努力。
3 楼 zbm2001 2009-06-23  
且不说 N个table + 嵌套 本身的栅格化渲染效率问题,
光是EXT插入一个按钮就生成海量的table系及其他附带元素,就很是个问题。

我对EXT的这部分一直是持完全保留的意见。
4 楼 艾建锋 2009-07-01  
还研究数学史那。我大学的时候 研究古代史了,老觉得老祖宗的文明太有魅力了。整天趴图书管里看 中国古代史
5 楼 wzjijh 2009-07-04  
JS是如何使网页变得那么漂亮的,偶也非常好奇~

所以我也要步楼主的后尘,学习一下EXT的源码咯~

支持一下楼主~
6 楼 会飞的狗 2009-08-02  
大漠,包子来支持你了。
早就应该开始分析源码了,翻译API没有啥意义。
7 楼 zuoye 2009-09-06  
支持大漠,期待下文