- 浏览: 106756 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
u011227256:
...
Spring Framework 3.0.5+Spring Security 3.0.5+ mybatis 3.0.5+ Struts 2.2.3整合代码 -
请教我送温暖:
非常感谢,解决了一个大问题
java 下载图片代码 -
rochou:
为什么login.jsp里面的form表单没有submit动作 ...
Spring Framework 3.0.5+Spring Security 3.0.5+ mybatis 3.0.5+ Struts 2.2.3整合代码 -
testspringmail:
http://czpae86.iteye.com/blog/1 ...
extjs 4.0 做的 Excel 小功能 -
junjun16818:
yuncpu 写道openSessionInView这里用的是 ...
Spring Framework 3.0.5+Spring Security 3.0.5+ mybatis 3.0.5+ Struts 2.2.3整合代码
最近看了几本javascrpt方面的书(javascript高级程序设计,javascript设计模式),内容中讲到很多面向对象式开发也提到很多优秀的javascript框架,
我很是费解为什么就没有提到过Extjs,难道YUI跟Extjs有那么大得深仇大恨?。
转入正题,我特别喜欢Extjs4 的类体系,所以就自己模仿的写了一个,我只是简单了解过extjs并没有深入去学习,所以有些地方可能不对还望大家指出。
在我的类体系中可以声明接口、抽象类、类,声明方式与extjs类似
下面是Extjs的类声明
Ext.define('Ext.panel.Panel', {
extend: 'Ext.panel.AbstractPanel'
// .....
})
下面是代码 :ClassManager.js
var Design = Design || {}; (function(Class) { /*先定义一些工具方法*/ var widgetMap = {}; var util = { /* 复制对象的属性,如果他们不存在 */ applyIf: function(c1, c2) { if(typeof c1 == "object" && typeof c2 == "object"){ for(var key in c2) { if(!c1[key]){ c1[key] = c2[key]; } } } }, /* 复制对象的属性*/ apply: function(c1, c2) { if(typeof c1 == "object" && typeof c2 == "object"){ for(var key in c2) { c1[key] = c2[key]; } } return c1; }, isObject: function(o) { return (typeof o == "object"); }, isArray: function(o) { return (o instanceof Array); }, isFunction: function(o) { return (typeof o == "function"); }, isString: function(o) { return (typeof o == "string"); }, isNumber: function(o) { return (typeof o == "number"); }, /* 根据字符串类型获取一个类 */ getClass: function(name) { if(typeof name !== "string") return name var v = name.split('.'), o = window[v[0]], i = 1, len = v.length; for(; i < len ; i++) { if(!o) return o o = o[v[i]] ; } return o; }, /* 定义名字空间 */ namespace: function(name) { if(typeof name !== "string") return name var v = name.split('.'), o = window[v[0]] = window[v[0]] || {}, i = 1, len = v.length; for(; i < len ; i++) { o = o[v[i]] = o[v[i]] || {}; } return o; }, ns: function(){ return this.namespace.apply(this,arguments); } } /* 接口类 下面接口类是设计模式书中的一个例子 copy过来的 */ var Interface = function(name, methods) { var i = 0, len = methods.length; this.name = name; this.methods = []; for (; i < len; i++) { this.methods.push(methods[i]); } } /* 检测接口方法是否被实现 */ Interface.ensureImplements = function(object) { var i = 1, len = arguments.length, j = 0, menthodsLen; for (; i < len; i++) { for (methodsLen = arguments[i].methods.length; j < methodsLen; j++) { var method = arguments[i].methods[j]; if (!object[method] || typeof object[method] !== 'function') { throw new Error("类" + object.className + "未实现" + arguments[i].name + " 接口方法 " + method); } } } } /* 类式继承 */ function extend(subClass,superClass) { var F = function(){}; F.prototype = superClass.prototype; subClass.prototype = new F(); util.applyIf(subClass.prototype,new F()) subClass.prototype.constructor = subClass; if (superClass.prototype.constructor == Object.prototype.constructor) { superClass.prototype.constructor = superClass; } /* 为子类添加静态属性 superclass 指向父类 */ subClass.superclass = superClass.prototype; /* 为子类添加一个方法 callParent 调用父类的当前函数 */ subClass.prototype.callParent = function(cfg) { var method,methodName; method = this.callParent.caller; for (var key in this) { if (this[key] === method) { methodName = key } } superClass.prototype[methodName].apply(this,cfg) } } /* 添加别名到 widgetMap 对象中 */ function setWidget(name,cls) { var n = name; if (name.indexOf('widget.') > -1) { n = name.substring(7,name.length); } widgetMap[n] = cls; } var pub = { /* 使用字符串格式名称创建类 */ create: function(name, cfg) { var clazz = util.getClass(name); return new clazz(cfg); }, /* 使用别名创建一个类 */ widget: function(name, cfg) { var clazz = widgetMap[name]; return new clazz(cfg); }, /* 声明一个类 */ define: function(name ,cfg) { /* 获取当前字符串name的变量 */ var nameArr = ('window.'+name).split('.'), lastName = nameArr.pop(), beginName = nameArr.join('.'), thatClass = util.ns(beginName), parentClass = util.ns(cfg.extend), implement = cfg.implement; /* 当前类型为接口时 创建接口并返回 */ if (cfg.classType == "interface") { thatClass[lastName] = new Interface(name, cfg.methods); return; } /* 创建对象 cfg.constructor 为构造函数 */ if (cfg.constructor !== Object) { thatClass = thatClass[lastName] = cfg.constructor; delete cfg.constructor; } else { thatClass = thatClass[lastName] = function() { if (parentClass) { parentClass.prototype.constructor.apply(this,arguments) } }; } /* 当cfg里配置了父类时继承 */ if (parentClass) { if (parentClass.prototype.events && cfg.events) { util.applyIf(cfg.events,parentClass.prototype.events); } extend(thatClass,parentClass); } util.apply(thatClass.prototype, cfg); thatClass.prototype.className = name; /* 当配置了接口时,检查是否有没有实现的方法,如有没实现的方法将会抛出异常 */ if (implement) { if (!util.isArray(implement)) { implement = [implement] } var i = 0, len = implement.length; for (; i < len; i++) { if (typeof implement[i] == 'string') { Interface.ensureImplements(thatClass.prototype,util.ns(implement[i])); } else if (typeof implement[i] == 'object') { Interface.ensureImplements(thatClass.prototype,implement[i]); } else { throw new Error("interface error implements type string and object"); } } } /* 当父类为抽象类时检测是否有为实现的方法 */ if (parentClass && parentClass.classType == "abstract") { for (var i = 0, len = parentClass.methods.length; i < len; i++) { var method = parentClass.methods[i]; if(!cfg[method] || typeof cfg[method] !== 'function'){ throw new Error(name+" 未实现 "+ method +" 方法, 抽象类" + parentClass.className); } } } /* 当前类为抽象类时添加几个静态属性 作为检测时使用 */ if (cfg.classType == "abstract") { thatClass.classType = "abstract"; thatClass.methods = cfg.methods; } /* 当配置alias属性为当前类配置别名 调用setWidget(name,class) 将别名与当前类添加到map中 */ if (cfg.alias) { if (util.isArray(cfg.alias)) { cfg.alias.forEach( function(it) { if (util.isString(it)) { setWidget(it, thatClass); } else { throw new Error("define argument 'alias' type Error"); } } ); } else if (util.isString(cfg.alias)) { setWidget(cfg.alias, thatClass); } else { throw new Error("define argument 'alias' type Error"); } } } } util.applyIf(Class,pub); util.applyIf(Class,util); })(Design);
html 页面
<script src = "ClassManager.js" ></script> <script> Design.define('Design.interface.Component', { classType: 'interface', methods: ['initComponent', 'getItems'] }); Design.define('Design.panel.AbstractPanel', { classType: 'abstract', getElement: function() { return Document.createElement('div'); }, methods: ['getValue', 'setValue'] }); Design.define('Design.panel.Panel', { alias: 'panel', /*别名*/ extend: 'Design.panel.AbstractPanel', /* 继承抽象类 */ implement: 'Design.interface.Component', /* 继承接口 */ constructor: function(cfg) { /*构造函数*/ this.name = cfg.name; }, getName: function() { /*类内方法*/ return this.name; }, initComponent: function(){ /* 必须实现的接口方法 没有这个方法将会抛出异常 */ }, getItems: function() { /* 必须实现的接口方法 没有这个方法将会抛出异常 */ }, getValue: function() { /* 必须实现的抽象方法 没有这个方法将会抛出异常 */ }, setValue: function() { /* 必须实现的抽象方法 没有这个方法将会抛出异常 */ } }); /* 创建Panel类 */ var panel = new Design.panel.Panel({ name: 'zwl' }); /* 使用字符串类名创建 */ panel = Design.create('Design.panel.Panel',{ name: 'zwl' }); /* 使用别名创建 */ panel = Design.widget('panel',{ name: 'zwl' }); alert(panel.getName()); </script>
现在这个类系统已经完成 上面是一个测试的例子。现在还有一个问题,如果把Design.interface.Component 、 Design.panel.AbstractPanel Design.panel.Panel 分离出到js文件,
我们还需要在页面导入下面这几个文件.
<script src = "app/interface/Component.js" ></script>
<script src = "app/panel/AbstractPanel.js" ></script>
<script src = "app/panel/Panel.js" ></script>
如果类的数量一旦多起来,将要导入很多个js文件。这样的话 我的类系统太弱了,接下来添加一个动态导入js文件的功能
创建一个名叫Loader的js文件 代码如下
(function(Class) {
/* 文件路径与转换名 */
var path = {name: 'Design', replaceName: ''};
/* */
var requireCount = 0;
var addEvent = function(el,type, fn) {
if (window.addEventListener){
el.addEventListener(type, fn, false);
}
else if (window.attachEvent) {
el.attachEvent('on' + type, fn);
}
}
Class.onReady = function(callback) {
addEvent(window, 'load', function(){
/*每隔一段时间会判断是否还在加载类文件 在加载完成后调用回调*/
var intervalId = setInterval(function(){
if(requireCount === 0) {
clearInterval(intervalId);
callback();
}
},5)
});
};
/* 导入类方法 */
var require = function(urls, onLoad) {
if (!Class.isArray(urls)) {
urls = [urls];
}
var url,
count = 0,
i = 0,
len = urls.length;
for (; i < len; i++) {
(function(i){
count++ ;
url = urls[i];
requireCount++;
if (url.indexOf(path.name) === 0) {
url = path.replaceName + url.substring(path.name.length, url.length);
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url.replace(/\./g,'/')+'.js';
script.onload = function() {
count--;
/*每隔一段时间会判断这个文件中得类是否已经声明完 如对象存在再调用回调*/
var intervalId = setInterval(function(){
if (Class.getClass(urls[i])) {
requireCount--;
clearInterval(intervalId);
if (count == 0 && onLoad) {
onLoad.call(window);
}
}
},5)
};
script.onerror = function() {
throw new Error(" require Errors url = " + url);
};
script.onreadystatechange = function() {
if (this.readyState === 'loaded' || this.readyState === 'complete') {
}
};
document.getElementsByTagName('head')[0].appendChild(script);
})(i)
}
};
var pub = {
/*设置路径*/
setPath: function(o, n) {
path.name = o;
path.replaceName = n;
}
}
Class.Loader = pub;
Class.require = require;
})(Design);
最后在define方法最前面添加一段代码
var pub = { define: function(name ,cfg) { /* 如果父类与接口不存在将阻止声明类 先加载父类与接口加载完成后再声明类 */ var requireList = []; if (cfg.extend && !util.getClass(cfg.extend)) { requireList.push(cfg.extend); } if (cfg.implement && !util.getClass(cfg.implement)) { requireList = requireList.concat(cfg.implement); } var loaderCount = requireList.length; for (var i = 0, len = requireList.length; i < len; i++) { Class.require(requireList[i], function() { loaderCount--; if (loaderCount == 0) { pub.define(name, cfg); } }); } if (requireList.length) { return; } //........ } }
html 页面
<script src = "ClassManager.js" ></script> <script src = "Loader.js" ></script> <script> Design.Loader.setPath('Design', 'apps'); // 配置路径 Design.panel.Panel 会转换成 apps/panel/Panel.js 既js文件的路径 Design.require(['Design.panel.Panel']); // 在onReady之前会 加载3个js文件 Design.onReady(function(){ /* 使用别名创建 */ panel = Design.widget('panel',{ name: 'zwl' }); alert(panel.getName()); }); </script>
- Design.zip (6.4 KB)
- 下载次数: 12
发表评论
-
Ext Tree与 store 操作
2011-09-10 21:59 9075//获取 json 文件的数据 var tre ... -
ExtJs Ajax提交
2011-06-29 09:30 1399//使用success属性和failure作为回调函数Ext. ... -
js反射机制
2011-06-29 09:27 167什么是反射机制反射 ... -
js中字符串转为json格式
2011-06-29 09:26 895function strToJson(str){ ... -
Ext Grid常用控件的配置与方法
2011-06-24 09:53 2926Ext Grid常用控件的配置与方法 1、 ... -
extjs 4.0 做的 Excel 小功能
2011-06-23 13:29 4043公司出的 三级程序程序员试题 题目如下 实现 ... -
Extjs 4.0 上传图片 + struts2
2011-06-14 12:01 2482有了上传图片控件后 在action 中必须写上以下代码 ... -
extjs 创建多个实例
2011-04-26 10:38 1329Ext.onReady(function() { ... -
Extjs portal 使用方法
2011-04-26 10:27 6034Ext.onReady(function(){ ... -
Ext.Loader使用(js延迟加载)
2011-04-13 15:47 22731. 这篇博文要记录什 ... -
ajax 例子
2011-04-11 16:47 977前台jsp function post(){ ... -
jqurey ajax 提交后台
2011-02-17 17:50 967$.post("personAjaxActio ... -
自己写的滚动条
2011-02-12 12:12 885见源代码 -
js 判断游览器类型 + 版本
2011-02-12 10:30 1027var Sys = {}; var u ... -
操作div 的滚动条
2011-02-12 10:29 1160document.getElementById('news') ...
相关推荐
JESD79-2F DDR2 JESD79-3F DDR3 JESD79-4D DDR4 JESD79-5C DDR5 JESD209-2F LPDDR2 JESD209-3C LPDDR3 JESD209-4E LPDDR4 JESD209-4-1A LPDDR4X JESD209-5C LPDDR5(X)
COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,comsol二维光子晶体角态。 单胞能带,超胞能带,边界态以及角态计算。 ,comsol;二维光子晶体;角态;单胞能带;超胞能带;边界态计算,基于Comsol的二维光子晶体角态及能带边界计算研究
六自由度机械臂抓取动作仿真与代码解析:抓取动画、关节参数变化及轨迹图解详解,六自由度机械臂抓取动作仿真指南:掌握两套代码实现动画与轨迹图模拟学习攻略,六自由度机械臂抓取动作仿真-8 两套关于抓取动作的代码,包括抓取动画、关节角、角速度、角加速度的变化仿真、以及抓取轨迹图 简单易懂好上手~ ,六自由度机械臂;抓取动作仿真;抓取动画;关节角变化;角速度角加速度;抓取轨迹图;两套代码;简单易懂好上手,六自由度机械臂抓取动作仿真演示:代码与轨迹图解
ITC网络广播工具软件
Multisim四位密码锁电路仿真设计:设定、开锁与声光报警功能演示资料包,Multisim四位密码锁电路仿真设计:设定、输入、开锁与报警功能详解,附源文件、原理说明书与演示视频,multisim四位密码锁电路仿真设计 功能: 1.通过拨码开关1进行初始密码设定。 2.通过拨码开关2输入密码,实现开锁判断。 3.如果密码正确,LED绿灯亮,表示开锁。 4.如果密码不正确,LED红灯亮,蜂鸣器鸣叫,声光报警。 资料包含:仿真源文件+原理说明书+演示视频 ,四位密码锁电路、Multisim仿真设计、初始密码设定;拨码开关输入;开锁判断;LED灯显示;声光报警;仿真源文件;原理说明书;演示视频,Multisim四位密码锁电路仿真设计:初始密码设置与智能解锁功能的声光报警展示
俗话说,摸鱼摸的好,上班没烦恼,毕竟谁能拒绝带薪拉屎呢(手动狗头) 这是一个云开发职场打工人专属上班摸鱼划水微信小程序源码,没有后台 直接导入微信开发者工具即可运行,UI简约大气漂亮,只需登录微信公众平台配置完合法域名即可轻松上线。 用户进入摸鱼小程序,可以自由设置薪资,上班时间、下班时间、发薪日、 月工作天数以提醒自己摸鱼,全民打酱油,让自己成为摸鱼冠军,《商鞅摸鱼哲学》 摸鱼不是自我放纵,而是个人实力的积蓄,我们的小目标是晚睡晚起 小程序中的今日待办会提醒用户带薪拉屎和闲逛,下方展示的是距离休息日的天数,距离下一次发工资的天数和节日的天数。
【毕业设计】基于Java的开发的一个集合校园二手交易、拼车、失物招领等功能的app_pgj
个人记录:PICkit3离线烧录流程 使用软件:MPLAB X IDE v5.30 记录时间:20250215
基于Matlab代码的电力系统状态估计与实验仿真研究:扩展卡尔曼滤波和无迹卡尔曼滤波在电力系统动态状态估计中的应用及效果分析,Matlab仿真实验研究:基于扩展卡尔曼滤波器与无迹卡尔曼滤波器对电力系统状态估计的影响及验证,状态估计 电力系统状态估计 Matlab代码 实验仿真研究 电力系统由于测量值和传输误差,还有测量噪声的影响,会对状态估计产生影响。 因此,需要对嘈杂的测量进行滤波,以获得准确的电力系统运行动态。 本文使用扩展卡尔曼滤波器(EKF)和无迹卡尔曼滤波器(UKF)来估计电力系统的动态状态。 扩展卡尔曼滤波EKF、无迹卡尔曼滤波UKF 利用扩展的无迹卡尔曼滤波器估计了动力系统的动态状态。 对WECC 3机9总线系统和新英格兰10机39总线系统进行了案例研究。 结果表明EKF和UKF都能准确地估计电力系统的动态状态。 ,核心关键词:状态估计; 电力系统状态估计; Matlab代码; 实验仿真; 测量值误差; 测量噪声; 扩展卡尔曼滤波器(EKF); 无迹卡尔曼滤波器(UKF); 动力系统; 动态状态估计; WECC 3机9总线系统; 新英格兰10机39总线系统。,Matlab
springboot在线考试--
台达DVP EH3与MS300 PLC&变频器通讯程序的全面解决方案,台达DVP EH3与MS300通讯程序:稳定可靠的频率控制与启停管理系统,台达DVP EH3与台达MS300通讯程序(TDEH-9) 可直接用于实际的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等。 程序采用轮询,可靠稳定 器件:台达DVP EH3系列PLC,台达MS300系列变频器,昆仑通态7022Ni 功能:实现频率设定,启停控制,实际频率读取,加减速时间设定。 资料:带注释程序,触摸屏程序,接线和设置说明,后续有技术咨询。 ,核心关键词:台达DVP EH3; 台达MS300; 通讯程序(TDEH-9); 轮询; 稳定; 频率设定; 启停控制; 实际频率读取; 加减速时间设定; 触摸屏程序; 接线方式; 设置说明; 技术咨询。,台达PLC与变频器通讯程序(带注释、触摸屏控制)
项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 个人账户管理:支持用户注册、登录与个人信息编辑;提供密码找回及账号安全保护措施。 声纹采集:利用麦克风设备录制用户的声纹样本;支持多种录音格式和质量调整,确保采集到清晰、准确的声纹数据。 声纹模板库管理:建立和维护一个安全的声纹模板库;支持声纹模板的添加、删除、更新和查询操作。 声纹比对与识别:运用深度学习算法对输入的声纹数据进行特征提取和匹配;实现快速、准确的声纹身份验证。 多场景应用支持:适用于多种场景,如门禁系统、移动支付、远程登录等;可根据实际需求定制开发相应的应用场景。 实时监控与报警:实时监控系统运行状态,包括声纹识别成功率、处理速度等指标;当出现异常情况时,及时发出报警信息。 数据分析与报告生成:收集并分析声纹识别过程中的数据,如识别准确率、处理时间等;根据用户需求输出包含详细图表说明的专业级文档供下载打印保存。 社区互动交流:设立论坛版块鼓励用户分享心得体会讨论热点话题;定期邀请行业专家举办线上讲座传授实用技巧知识。 音乐筛选与推荐:集成音乐平台API,根据用户的浏览习惯和情绪状态推荐背景音乐,增强用户体验。 数据可视化:提供交互式的数据可视化面板,使非技术用户也能轻松理解复杂的数据集,从而做出更明智的决策。
三相与多相开绕组永磁同步电机仿真模型的先进控制策略探讨与实现,三相与多相开绕组永磁同步电机的Simulink仿真模型与先进控制策略研究,开绕组电机,开绕组永磁同步电机仿真模型、simulink仿真 共直流母线、独立直流母线,两相容错,三相容错控制,零序电流抑制,控制策略很多 三相开绕组永磁同步电机,六相开绕组永磁同步电机 五相开绕组永磁同步电机,五相开绕组电机 ,开绕组电机; 永磁同步电机仿真模型; simulink仿真; 共直流母线; 独立直流母线; 两相容错; 三相容错控制; 零序电流抑制; 控制策略; 六相开绕组永磁同步电机; 五相开绕组永磁同步电机,开绕组电机仿真研究:共直流母线与独立直流母线的容错控制策略
【毕业设计】基于Java的开发的网上汽车租赁管理系统_pgj
csv 模块是 Python 的标准库,无需额外安装。 运行结果如下图: ['姓名', '年龄', '城市'] ['张三', '25', '北京'] ['李四', '30', '上海'] ['王五', '22', '广州']
【毕业设计】基于Java+Springboot+Vue的宠物领养系统_pgj
让前端开发者学习“机器学习”!
【毕业设计】基于Java的实现的以宠物为主体的论坛式的APP
大模型应用工具实战2-有好玩的数字人