学习JS面向对象成果 借国庆发布个最新作品与大家交流


Posted in Javascript onOctober 03, 2009

首先引入一个jQuery的小问题
jQuery在设置透明度上是有问题的,首先看一下其代码:

Code

// IE uses filters for opacity 
if ( !jQuery.support.opacity && name == "opacity" ) { 
if ( set ) { 
// IE has trouble with opacity if it does not have layout 
// Force it by setting the zoom level 
elem.zoom = 1; 
// Set the alpha filter to set the opacity 
elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + 
(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); 
} 
return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? 
(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': 
""; 
}

在正常情况下,使用filter设置透明度是没有问题的,然而如果我们的元素原先就已经有了一个filter呢?假设原先是这样的:
filter: AlphaImageLoader(src="...");
在执行了jQuery的代码后,自然会变成这样:
filter: AlphaImageLoader(src="...");alpha(opacity=80)
注意到原来我们有一个分号了不?这样就使alpha成了一条CSS规则,而不是filter的一部分
解决的方法也很简单,在jQuery源码中再次将分号替换为空格即可
但是这同时也显示了一个问题,jQuery毕竟不是有非常良好的架构作为基础的库,其替换性和扩展性几乎可以说没有,为了这么一个小问题,除了改源码我竟然想不出从外部切入的修改方案,如果是prototype框架,只要直接将setOpacity函数替换就行了,因此如果jQuery在发现是IE的情况下,可以调用另一个函数,而不是继续在当前函数中内联逻辑,我们的修改就会方便许多
以下是修改后的代码

修改后的代码

// IE uses filters for opacity 
if ( !jQuery.support.opacity && name == "opacity" ) { 
if ( set ) { 
// IE has trouble with opacity if it does not have layout 
// Force it by setting the zoom level 
elem.zoom = 1; 
// Set the alpha filter to set the opacity 
elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ).replace(';', ' ') + 
(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ");"); 
} 
return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? 
(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': 
""; 
}

好了,介绍下新作
最近公司想把WEB系统做得像桌面一样,这确实是个蛮疯狂的想法,但是从我的角度来考虑,却觉得即刺激又有趣,这是我能够做到的事,同时又不是能够轻松做到的事,而作为一个努力向着优秀的方向前进的程序员,只有不断遭遇这种挑战,才能慢慢成长
因此在经过了四天时间的设计和开发之后,终于有了一个较为稳定的版本,由于其功能尚未达到最初的规划,因此称之为0.8版本(此次决定使用简单的版本管理,即所有小数点后不是0的版本都是beta版,直到1.0、2.0之类才称为稳定正式版)
我想从截图上已经看不出这套框架的效果了,因此在上传的压缩包中包含了一个Demo.htm页面,有兴趣的朋友可以下载以后亲自试用,而在这里仅放出框架的类图以供参考
学习JS面向对象成果 借国庆发布个最新作品与大家交流
总体思路
将WEB做成桌面形式从一开始就是一种挑战,这种挑战对我而言的乐趣已经远远超过了审视其是否合理的理智……

由于桌面的复杂性,导致必须使用面向对象的思想来进行构建,而面向思想中最重要的就是职责明确,在这样的思想的指导下,衍生出了上图所示的框架图

首先是所有控件的基类Control,只提供了生命周期的管理,即render和dispose,以及事件的管理,即bind、unbind和trigger

在Control的继承体系中,使用了类似ASP.NET的模型,本身render和dispose方法不提供重写(就如Page类的ProcessRequest方法不会让你随意重写),而是在适当的生命周期的节点开放出事件以供重写,这就包括了rendering、rendered、disposing、disposed四个最基本的事件,而其后的所有控件都是通过对这4个方法的重写来完成功能

随后的TaskBar表示任务栏,TaskIcon表示任务栏上的图标,这并没有什么可说,TaskBar只负责从容器的角度对所有的TaskIcon进行管理,而TaskIcon则负责具体的展现

值得一提的是GroupTaskIcon,事实上其内部维护的是一系列的TitledTaskIcon,以一种“组合”的方式,使得GroupTaskIcon不需要再针对每一个窗口重新制定HTML表现

在Window部分,原先的设定是不同的Window类有不同的加载内容的方法,如:

RemoteWindow从远程加载内容
ElementWindow从具体的HTML元素加载内容

然而这样就不得不面临一个问题,Window同时承载了行为、表现和容器的功能,因此n种行为和m种表现将生成n*m个子类,大大提高了控件体系的复杂度,如:

TabRemoteWindow, TabElementWindow
GorupRemoteWindow, GroupElementWindow

显然这4个类之间有着太多的重复性,不利于代码的复用,更不利于使用者的选择。

在这样的考虑之下,我将Window的“表现”部分分离了出来,形成了Renderer,Renderer负责在Window中渲染内容,这样就可以使用一系列的Renderer和一系列的Window的组合来进行开发。使用组合而非继承也是面向对象的一大原则。

具体的实现细节和更深一步的结构设计,现在也没有太好的头绪,还请允许我下一次再通过博客具体说明了

版本计划
当前发布的是0.8版本,事实上已经包含了部分0.9版本的功能,我将在0.9版本实现以下内容:

1、添加Timer类执行定时计划
2、添加Behavior库分离Window的行为
3、形成常量库,用于获取 等复杂的字符串
4、美化TaskBar及GroupTaskIcon
5、添加ExUI.Overlay提供遮罩层

0.9版本将在10月5日完成,算是给自己毕业后的第一个生日的礼物

随后的1.0版本将是一个稳定的版本,同时提供以下内容的改进:

1、添加DOM库生成DOM元素
2、Desktop支持ViewPort控制所有元素的位置以适应窗口大小的改变
3、DockWindow可收缩在桌面的四边,当鼠标移动到一空范围内时自动出现(类似QQ)

1.0版本的发布时间现在无法确定,因为我已经看到了接下去半年时间的长期加班生活……

下载
压缩包中包含了Demo.htm演示页面,Script文件夹下是所有需要使用的JS文件,其中除了jquery和json2以外都属于本次框架,Style文件夹下的core.css即为本次框架的核心CSS文件

DOC文件夹下是框架的文档,由jsdoc toolkit生成

由于原本是一个给公司演示的DEMO,但涉及到公司的业务数据又不能直接把演示页面拿出来,因此这里的Images文件夹等有些混乱,还请见谅

http://xiazai.3water.com/200910/yuanma/ExUI.rar

还请尝试过的朋友给个意见,这样的框架,是不是值得继续开发,或者走开源的道路是不是有那么一点希望,已经工作快半年了,也希望自己可以有真正拿得出手的作品 。

Javascript 相关文章推荐
纯CSS打造的导航菜单(附jquery版)
Aug 07 Javascript
Array的push与unshift方法性能比较分析
Mar 05 Javascript
JavaScript中number转换成string介绍
Dec 31 Javascript
jquery手风琴特效插件
Feb 04 Javascript
js限制文本框的输入内容代码分享(3类)
Aug 20 Javascript
不想让浏览器运行javascript脚本的方法
Nov 20 Javascript
jQuery插件简单学习实例教程
Jul 01 Javascript
详解网站中图片日常使用以及优化手法
Jan 09 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
Jun 21 Javascript
vue-router跳转时打开新页面的两种方法
Jul 29 Javascript
教你搭建按需加载的Vue组件库(小结)
Jul 29 Javascript
解决新建一个vue项目过程中遇到的问题
Oct 22 Javascript
JQuery与Ajax常用代码实现对比
Oct 03 #Javascript
Jquery 设置标题的自动翻转
Oct 03 #Javascript
点击下载链接 弹出页面实现代码
Oct 01 #Javascript
点击文章内容处弹出页面代码
Oct 01 #Javascript
js类的静态属性和实例属性的理解
Oct 01 #Javascript
XmlUtils JS操作XML工具类
Oct 01 #Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
Sep 29 #Javascript
You might like
php实现图片以base64显示的方法
2016/10/13 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
2018/09/01 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
python查询mysql中文乱码问题
2014/11/09 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
《争吵》教学反思
2014/02/15 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
创意婚礼策划方案
2014/05/18 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
2014年内勤工作总结
2014/11/24 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
环境建议书
2015/02/04 职场文书
付款证明格式范文
2015/06/19 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书