- 浏览: 26429 次
- 性别:
- 来自: 铁力
-
文章分类
最新评论
改造dojo 日期控件
if (!dojo._hasResource["bad.form.DateBox"]) { //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["bad.form.DateBox"] = true; dojo.provide("bad.form.DateBox"); dojo.require("dijit._Calendar"); dojo.require("dijit.form.TimeTextBox"); dojo.require("bad.form._MonthPicker"); dojo.require("dojo.date.locale"); dojo.declare("bad.form.DateBox", [dijit.form.TimeTextBox], { /** @attr: 弹出窗口类型 */ _popupClass: "dijit._Calendar", /** @attr: {String}日期类型 * @example yyyy_MM_dd 其中MM要大写 */ datePattern: "", /** {String } */ _pattern: "", /**@attr: 年的开始位*/ _yearStart:"", /**@attr: 年的结束位*/ _yearEnd:"", /**@attr: 月的开始位*/ _monthStart:"", /**@attr: 月的结束位*/ _monthEnd:"", /**@attr: 日的开始位*/ _dateStart:"", /**@attr: 日的结束位*/ _dateEnd:"", /**@attr: 存储用户提示信息*/ _currentMessage: "请输入正确的日期", /**@attr: {Boolean} 是否显示day 为{false}时不显示,为{true}时显示 */ showDay: "", /**@attr: 日期可以显示的初始值*/ firstValue:'', /**@method将目前this.textbox.value进行格式化*/ formatInput: function() { var value=this.getFormatDate(); if(value instanceof Date) { this.setValue(value); } }, /** 当文本框失去焦点事件*/ _runBlur: function() { this.formatInput(); this.onChange(this.textbox.value); }, /** @method: 将参数或者目前显示的数字格式化,如果显示中数字位数超过6且显示天数,则将字符截取为yyyy(M)M(d)d * @return: {Date} * @remind: 可以自己添加返回值,比如判断现有的值无法转化,返回false,等等。 */ getFormatDate: function(value) { if(!value) { value = this.textbox.value; } if (typeof value == "string") { var numValue = ""; value.replace("-", ""); var stringArray = value.split(""); //取得value中的数字 for (var i = 0; (i < stringArray.length && (this.showDay ? numValue.length < 8 : numValue.length < 6)); i++) { if (!isNaN(stringArray[i])) { numValue += stringArray[i]; } } //如果显示day if (this.showDay) { if (numValue.length == 8) { return new Date(numValue.slice(this._yearStart, this._yearEnd), numValue.slice(this._monthStart, this._monthEnd) - 1, numValue.slice(this._dateStart, this._dateEnd)); } if (numValue.length == 7) { return new Date(numValue.slice(this._yearStart, this._yearEnd), numValue.slice(this._monthStart, this._monthEnd-1) - 1, numValue.slice(this._dateStart-1, this._dateEnd)); } if (numValue.length == 6) { return new Date(numValue.slice(this._yearStart, this._yearEnd), numValue.slice(this._monthStart,this._monthEnd-1) - 1, numValue.slice(this._dateStart-1, this._dateEnd-1)); } } else { if (numValue.length == 6) { return new Date(numValue.slice(this._yearStart, this._yearEnd), numValue.slice(this._monthStart, this._monthEnd) - 1); } if (numValue.length == 5) { return new Date(numValue.slice(this._yearStart, this._yearEnd), numValue.slice(this._monthStart,this._monthEnd-1) - 1); } } } }, /**@member: 扫描datePattern,获得年月(日)的位置*/ scanPattern: function() { this._pattern=""; for(var i=0;i<this.datePattern.length;i++) { switch(this.datePattern.charAt(i)) { case 'd': while(this.datePattern.charAt(i)=='d') { this._pattern+='d'; i++; } i--; break; case 'D': while(this.datePattern.charAt(i)=='D') { this._pattern+='d'; i++; } i--; break; case 'M': while(this.datePattern.charAt(i)=='M') { this._pattern+='M'; i++; } i--; break; case 'y': while(this.datePattern.charAt(i)=='y') { this._pattern+='y'; i++; } i--; break; case 'Y': while(this.datePattern.charAt(i)=='Y') { this._pattern+='y'; i++; } i--; break; default : break; //暂时不进行处理 } } for(var i=0;i<this._pattern.length;i++) { switch(this._pattern.charAt(i)) { case 'd': this._dateStart=i; while(this._pattern.charAt(i)=='d') { i++; } this._dateEnd=i; i--; break; case 'M': this._monthStart=i; while(this._pattern.charAt(i)=='M') { i++; } this._monthEnd=i; i--; break; case 'y': this._yearStart=i; while(this._pattern.charAt(i)=='y') { i++; } this._yearEnd=i; i--; break; default : break; //暂时不进行处理 } } console.log(this.datePattern+" "+this._yearStart+" "+this._yearEnd+" "+this._monthStart+" "+this._monthEnd+" "+this._dateStart+" "+this._dateEnd); }, _setPattern: function() { /* this._pattern=""; var size=this._yearEnd>this._monthEnd?(this._yearEnd>this._dateEnd? this._yearEnd:this._dateEnd):(this._monthEnd>this.dateEnd? this._monthEnd:this._dateEnd); console.log("length is "+size); for(var i=0;i<size;i++) { if(i>=this._yearStart&&i<this._yearEnd) { while(i<this._yearEnd) { this._pattern+="y"; i++; } i--; } else if(i>=this._monthStart&&i<this._monthEnd) { while(i<this._monthEnd) { this._pattern+="M"; i++; } i--; } else if(i>=this._dateStart&&i<this._dateEnd) { while(i<this._dateEnd) { this._pattern+="d"; i++; } i--; } } */ console.log("pattern is "+this._pattern); }, /**被绑定的onkeydown事件,火狐下回车事件有问题 * */ _onkeydown: function(key) { var c = String.fromCharCode(65); var code=this._getKeyCode(key); if(code==13) { var value=this.getFormatDate(); if(value instanceof Date) { var isie = (document.all) ? true : false; var eSrc =isie?key.srcElement:key.target; if(eSrc.tagName=="INPUT" && (eSrc.type=="text"||eSrc.type=="password")) { if(isie) { key.keyCode=9; } else { key.which=9; } if(this._opened) { this._close(); } } } } return true; }, _getKeyCode: function(e){ var isie = (document.all) ? true : false; var key=""; if (isie) { key = e.keyCode; } else { key = e.which; if (key == 120 || key == 228||key == 99 ||key == 0) { key = 8; } } return key; }, /** @method: 过滤字符加捕获回车*/ keycodefilter: function(key){ if (key.keyCode == dojo.keys.ENTER) { this.formatInput(); this.onChange(); } if(key.keyCode==dojo.keys.ESCAPE) { if(this._opened) { this._close(); } } }, /** @method: 验证,目前继承父类的验证方法*/ validate: function(){ this.inherited('validate', arguments); }, /** @method: 配置属性,继承父类的同名方法,目前主要是完成 this.datePattern默认配置将其配置为"yyyy-MM-dd" */ postMixInProperties: function() { this.inherited('postMixInProperties', arguments); this.constraints.selector = 'date'; this.datePattern=this.datePattern? this.datePattern:"yyyy-MM-dd"; this.showDay = (this.datePattern.indexOf("dd") != -1 || this.datePattern.indexOf("DD") != -1) ? true : false; //是否显示day this.constraints.datePattern = this.datePattern; if(!this.showDay) { this._popupClass="bad.form._MonthPicker"; } this.maxLength=this.datePattern.length; //输入长度不能超过验证长度 this.promptMessage="请输入形如"+this.datePattern; this.invalidMessage="请输入形如"+this.datePattern; }, /** @method: 继承父类同名方法,扫描格式,添加两个事件绑定,一个是键盘输入字符过滤,另一个是失去焦点对字符串进行格式化 如果有初值赋上初值*/ postCreate: function(){ this.inherited('postCreate', arguments); this.scanPattern(); this._setPattern(); dojo.connect(this.textbox, "onkeypress", this, this.keycodefilter); //绑定onkeypress事件 dojo.connect(this.textbox,"onkeydown",this,this._onkeydown); dojo.connect(this, "_onBlur", this, this._runBlur); //绑定失去焦点事件和字符格式化方法 this._lastValue=" "; if(this.firstValue) { this.setValue(this.firstValue); //赋上初值 } }, _onMouserOver: function(evt){ this.displayMessage(this._currentMessage); }, _onMouserOut: function(evt){ dijit.hideTooltip(this.domNode); }, /** @method: 验证,目前继承父类的验证方法 * @param: {Date}newValue * */ onChange: function(newValue) { this._lastValue=this.getValue(); this.inherited('onChange', arguments); }, /** @method: 将目前的显示值经过格式化返回 表单进行数据绑定会调用此方法获取当前值 @return: {Sring} 被格式化的值 */ getValue: function() { if(!this.textbox.value) { return ""; } return this.textbox.value; }, /** @method: 对this.textbox赋值 参数可以是Date对象或者String 若果能转换为Date对象,则显示值改变 * @param: {String}value or {Date}value * @return: {null} */ setValue: function(value) { //以下为没有弹出窗口对象时,新建一个弹出窗口对象并进行赋值防止出现NaN的情况 if(!this._picker) { this._open(); this._close(); } var v = []; if (value instanceof Date) { v[0] = value; } else if (typeof value == "string") { if(value.length==0) { this.textbox.value=""; return; } else if (value.length >= 6) { //setValue的类型为Date对象方能成功 v[0]=new Date(); v[0]=this.getFormatDate(value); } } console.log("v[0] is "+v[0]); console.log(v[0] instanceof Date&&v[0].getFullYear()); this.inherited("setValue", arguments, v); if(v[0] instanceof Date&&v[0].getFullYear()) { //var testValue=dojo.date.locale.format(v[0],this._pattern); if(this._lastValue!=this.textbox.value) { this._lastValue=this.textbox.value; console.log("_lastValue is "+this._lastValue); } } } }); }
原先改写了下dojo的日期控件,没太用心,做个反面例子。
代码如下,上级文件夹“包”叫bad.form,具体对象名字为“DateBox”
bad.form.DateBox
属性
属性名 |
类型 |
默认值 |
描述 |
Id |
String |
无 |
组件标识 |
jsId |
String |
无 |
通过jsId可以获得控件对象 |
_popupClass |
String |
"dijit._Calendar" |
弹出窗口类型 |
datePattern |
String |
“yyyy-MM-dd” |
设置日期格式 |
dateValue |
Date |
new Date()即此时此刻 |
日期值 |
备注
目前_popupClass可选类型为"dijit._Calendar"和”bad.form._MonthPicker”两种,前一种完整显示年月日,后一种只显示年月。
datePattern设置日期验证的格式以及正确日期的显示格式以及按回车键对现有字符串中数字进行格式化的格式。可以设为”*yyyy*MM*dd*”或者”*yyyy*MM*”其中*可以代表除英文字符以外的任意字符串,MM必须要大写,如果datePattern为”*yyyy*MM*”,则_popupClass会变为_popupClass。
方法
方法名 |
参数 |
返回值 |
描述 |
setValue |
{String or Date}value |
无 |
对控件赋值 |
getValue |
无 |
String |
获取控件的值 |
_open |
无 |
无 |
弹出窗口 |
_close |
无 |
无 |
关闭窗口 |
备注
setValue要求参数为Javascript的内置对象Date或者能转化为Date的String(如2000-10-11 00:00:00:0)
getValue默认返回形如"yyyy-MM-dd"的String,此方法可以重写,以需要的格式将值返回。
事件
事件名 | 参数 | 返回值 | 描述 |
onValueChange | {Date}newValue,{Date}oldValue | 无 | 值改变事件 |
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip