- 浏览: 134852 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lchark:
lchark 写道
EXTJS日期时间选择控件(精确到秒) -
lchark:
lchark 写道
EXTJS日期时间选择控件(精确到秒) -
lchark:
楼主你好,我从extjs中午网看到extjs的时间控件功能,我 ...
EXTJS日期时间选择控件(精确到秒) -
小那么小j8:
nisersent 写道zss912317 写道请叫我东哥 写 ...
EXTJS日期时间选择控件(精确到秒) -
小那么小j8:
nisersent 写道zss912317 写道请叫我东哥 写 ...
EXTJS日期时间选择控件(精确到秒)
一。一些废话
近日来,有几个项目用到了EXTJS作为Web前端。也看到了一些童鞋苦苦在网上寻觅可以选择时间的控件,由于EXTJS版本差异较大,利用官方3.2的Demo制作了一个可以选择到秒的时间控件,该控件只能够用于ExtJs2.2以上的版本。经过测试ExtJs2.02版本不适用该控件,如果你还在使用2.02这个版本或者更老,请绕道。废话不说了,看代码:
二。文件明细:
Spinner.js
SpinnerField.js
DateTimeField.js
三。各文件详解
1.Spinner.js
EXTJS个版本略有不同,最后的文件解压后请覆盖源文件。这里不做详细介绍。
2.SpinnerField.js
EXTJS个版本略有不同,最后的文件解压后请覆盖源文件。这里不做详细介绍。
3.DateTimeField.js
// 命名空间归属 Ext.ns('Ext.ux.form'); // 在该命名空间内,开辟一个名为TimePickerField的区域,我们可以当他是一个时间选择器 Ext.ux.form.TimePickerField = function(config){ // 调用构造方法,也就是说定义了他的所属--this // this指的是什么呢?这里需要注意,首先这个东东属于这个类(对象),其次这个类(对象)在没有被调用之前或者实例之前是不会被构造的 // 那么这个this实际上是指我们实例化后的datetimefield Ext.ux.form.TimePickerField.superclass.constructor.call(this, config); } // 给刚刚定义的TimePickerField加点菜吧。 // 首先它继承与Ext.form.Field,是一个扩展 Ext.extend(Ext.ux.form.TimePickerField, Ext.form.Field, { defaultAutoCreate: { tag: 'div'// 定义了一个DIV标签 }, cls: 'x-form-timepickerfield',// 它的样式 hoursSpinner: null,// 属性:小时选择器 minutesSpinner: null,// 属性:分钟选择器 secondsSpinner: null,// 属性:秒选择器 spinnerCfg: { width: 40// 选择器的宽度定位40px }, // 约束:选择数值约束,如果小于最小值该如何,如果大于最大值该如何,这里的处理方式我详细说明一下(这个约束是触发的,我们输入的值或者我们点击上下箭头选择的值后都会进入该约束检查。) spinnerFixBoundries: function(value){ // 这里有可能会造成不解,我解释一下。 // 如果我们选择秒的时候,有一个向上的箭头和向下的箭头,如果我点击向上的箭头则秒数加1,点击向下的箭头则秒数减1。 // 如果我选择了59秒后,点击向上的箭头,由于时间秒数约束,不可能出现60,那我们要怎么办?会如何?当然是,58,59,0,1这样的序列 // 所以最大值定义为59,如果超过59那么秒数归零,就是这个逻辑。 if (value < this.field.minValue) { value = this.field.maxValue; } if (value > this.field.maxValue) { value = this.field.minValue; } // 这里返回了一个带有精度的值 return this.fixPrecision(value); }, // 渲染,这个没什么可说的了所有的渲染都差不多是位置和范围之类的 onRender: function(ct, position){ Ext.ux.form.TimePickerField.superclass.onRender.call(this, ct, position); this.rendered = false; this.date = new Date(); // 定义一个对象,他即将有三个属性,时分秒数值,往下看。 var values = {}; // 如果实例时已经被设定了初始值,那么将这些值赋予values这个对象中。 // 再将这些值表示在时分秒选择器中 if (this.value) { values = this._valueSplit(this.value); this.date.setHours(values.h); this.date.setMinutes(values.m); this.date.setSeconds(values.s); delete this.value; } // 如果实例时没被设定了初始值,简单了,时分秒选择器的初始值就不用改变了,只要values得到这些值备用即可 else { values = { h: this.date.getHours(), m: this.date.getMinutes(), s: this.date.getSeconds() }; } // 定义一个外围包裹,就是想把时分秒这三个选择器给包起来成为一组,下面会实例这三个选择器的,往下看。 var spinnerWrap = Ext.DomHelper.append(this.el, { tag: 'div' }); var cfg = Ext.apply({}, this.spinnerCfg, { renderTo: spinnerWrap, readOnly: this.readOnly, disabled: this.disabled, listeners: { spin: { fn: this.onSpinnerChange, scope: this }, valid: { fn: this.onSpinnerChange, scope: this }, afterrender: { fn: function(spinner){ spinner.wrap.applyStyles('float: left'); }, single: true } } }); // 接下来实例(Ext.ux.form.SpinnerField)了几个选择器,时分秒。 this.hoursSpinner = new Ext.ux.form.SpinnerField(Ext.apply({}, cfg, { minValue: 0, maxValue: 23, cls: 'first', value: values.h })); this.minutesSpinner = new Ext.ux.form.SpinnerField(Ext.apply({}, cfg, { minValue: 0, maxValue: 59, value: values.m })); this.secondsSpinner = new Ext.ux.form.SpinnerField(Ext.apply({}, cfg, { minValue: 0, maxValue: 59, value: values.s })); Ext.DomHelper.append(spinnerWrap, { tag: 'div', cls: 'x-form-clear-left' }); // 渲染完毕释放出去 this.rendered = true; }, // 如果实例时已经被设定了初始值,那么调用这个方法,将这些值赋予values这个对象中。 _valueSplit: function(v){ var split = v.split(':'); return { h: split.length > 0 ? split[0] : 0, m: split.length > 1 ? split[1] : 0, s: split.length > 2 ? split[2] : 0 }; }, // 注意了,这里加了一个动作的监听,也可以说是自己弄了一个自定义监听 onSpinnerChange: function(){ if (!this.rendered) { return; } // 这里注册了这个监听类别,指明了监听的对象 this.fireEvent('change', this, this.getRawValue()); }, // 禁用 disable: function(){ Ext.ux.form.TimePickerField.superclass.disable.call(this); this.hoursSpinner.disable(); this.minutesSpinner.disable(); this.secondsSpinner.disable(); }, // 解用 enable: function(){ Ext.ux.form.TimePickerField.superclass.enable.call(this); this.hoursSpinner.enable(); this.minutesSpinner.enable(); this.secondsSpinner.enable(); }, // 只读 setReadOnly: function(r){ Ext.ux.form.TimePickerField.superclass.setReadOnly.call(this, r); this.hoursSpinner.setReadOnly(r); this.minutesSpinner.setReadOnly(r); this.secondsSpinner.setReadOnly(r); }, // 清除所有的无效验证 clearInvalid: function(){ Ext.ux.form.TimePickerField.superclass.clearInvalid.call(this); this.hoursSpinner.clearInvalid(); this.minutesSpinner.clearInvalid(); this.secondsSpinner.clearInvalid(); }, // 拿到那个值,可以认为是vlaues对象 getRawValue: function(){ if (!this.hoursSpinner) { this.date = new Date(); return { h: this.date.getHours(), m: this.date.getMinutes(), s: this.date.getSeconds() }; } else { return { h: this.hoursSpinner.getValue(), m: this.minutesSpinner.getValue(), s: this.secondsSpinner.getValue() }; } }, // 赋值 setRawValue: function(v){ this.hoursSpinner.setValue(v.h); this.minutesSpinner.setValue(v.m); this.secondsSpinner.setValue(v.s); }, // 有效验证 isValid: function(preventMark){ return this.hoursSpinner.isValid(preventMark) && this.minutesSpinner.isValid(preventMark) && this.secondsSpinner.isValid(preventMark); }, // 验证 validate: function(){ return this.hoursSpinner.validate() && this.minutesSpinner.validate() && this.secondsSpinner.validate(); }, // 这里可以自己修改想要的格式,这个值将作为返回值到调用该类的元控件中也就是DateTimeField的实例 getValue: function(){ var v = this.getRawValue(); return String.leftPad(v.h, 2, '0') + ':' + String.leftPad(v.m, 2, '0') + ':' + String.leftPad(v.s, 2, '0'); }, setValue: function(value){ if (!this.rendered) { this.value = value; return; } value = this._valueSplit(value); this.setRawValue(value); this.validate(); } }); // 下面就没什么好说的了,就是将上面自定义的类(对象),成为一个总选择器一部分。 Ext.form.TimePickerField = Ext.ux.form.TimePickerField; Ext.reg('timepickerfield', Ext.form.TimePickerField); Ext.ns('Ext.ux.form'); Ext.DateTimePicker = Ext.extend(Ext.DatePicker, { timeFormat: 'g:i:s A', timeLabel: '时间', timeWidth: 100, initComponent: function(){ Ext.DateTimePicker.superclass.initComponent.call(this); this.id = Ext.id(); }, onRender: function(container, position){ Ext.DateTimePicker.superclass.onRender.apply(this, arguments); var table = Ext.get(Ext.DomQuery.selectNode('table tbody', container.dom)); var tfEl = Ext.DomHelper.insertBefore(table.last(), { tag: 'tr', children: [{ tag: 'td', cls: 'x-date-bottom', html: this.timeLabel, style: 'width:30;' }, { tag: 'td', cls: 'x-date-bottom ux-timefield', colspan: '2' }] }, true); this.tf.render(table.child('td.ux-timefield')); var p = this.getEl().parent('div.x-layer'); if (p) { p.setStyle("height", p.getHeight() + 31); } }, setValue: function(value){ var old = this.value; if (!this.tf) { this.tf = new Ext.ux.form.TimePickerField(); this.tf.ownerCt = this; } this.value = this.getDateTime(value); }, getDateTime: function(value){ if (this.tf) { var dt = new Date(); var timeval = this.tf.getValue(); value = Date.parseDate(value.format(this.dateFormat) + ' ' + this.tf.getValue(), this.format); } return value; }, selectToday: function(){ if (this.todayBtn && !this.todayBtn.disabled) { this.value = this.getDateTime(new Date()); this.fireEvent("select", this, this.value); } } }); Ext.reg('datetimepickerfield', Ext.DateTimePicker); if (parseInt(Ext.version.substr(0, 1), 10) > 2) { Ext.menu.DateTimeItem = Ext.DateTimePicker; Ext.override(Ext.menu.DateMenu, { initComponent: function(){ this.on('beforeshow', this.onBeforeShow, this); if (this.strict = (Ext.isIE7 && Ext.isStrict)) { this.on('show', this.onShow, this, { single: true, delay: 20 }); } Ext.apply(this, { plain: true, showSeparator: false, items: this.picker = new Ext.DatePicker(Ext.apply({ internalRender: this.strict || !Ext.isIE, ctCls: 'x-menu-date-item' }, this.initialConfig)) }); Ext.menu.DateMenu.superclass.initComponent.call(this); this.relayEvents(this.picker, ["select"]); this.on('select', this.menuHide, this); if (this.handler) { this.on('select', this.handler, this.scope || this); } } }); } else { Ext.menu.DateTimeItem = function(config){ Ext.menu.DateTimeItem.superclass.constructor.call(this, new Ext.DateTimePicker(config), config); this.picker = this.component; this.addEvents('select'); this.picker.on("render", function(picker){ picker.getEl().swallowEvent("click"); picker.container.addClass("x-menu-date-item"); }); this.picker.on("select", this.onSelect, this); }; Ext.extend(Ext.menu.DateTimeItem, Ext.menu.DateMenu, { onSelect: function(picker, date){ this.fireEvent("select", this, date, picker); Ext.menu.DateTimeItem.superclass.handleClick.call(this); } }); } Ext.menu.DateTimeMenu = function(config){ Ext.menu.DateTimeMenu.superclass.constructor.call(this, config); this.plain = true; var di = new Ext.menu.DateTimeItem(config); this.add(di); this.picker = di; this.relayEvents(di, ["select"]); this.on('beforeshow', function(){ if (this.picker) { this.picker.hideMonthPicker(true); } }, this); }; Ext.extend(Ext.menu.DateTimeMenu, Ext.menu.Menu, { cls: 'x-date-menu', beforeDestroy: function(){ this.picker.destroy(); }, hide: function(deep){ if (this.picker.tf.innerList) { if ((Ext.EventObject.within(this.picker.tf.innerList)) || (Ext.get(Ext.EventObject.getTarget()) == this.picker.tf.innerList)) return false; } if (this.el && this.isVisible()) { this.fireEvent("beforehide", this); if (this.activeItem) { this.activeItem.deactivate(); this.activeItem = null; } this.el.hide(); this.hidden = true; this.fireEvent("hide", this); } if (deep === true && this.parentMenu) { this.parentMenu.hide(true); } } }); Ext.ux.form.DateTimeField = Ext.extend(Ext.form.DateField, { dateFormat: 'Y-m-d', timeFormat: 'H:i:s', defaultAutoCreate: { tag: "input", type: "text", size: "20", autocomplete: "off" }, initComponent: function(){ Ext.ux.form.DateTimeField.superclass.initComponent.call(this); this.format = this.dateFormat + ' ' + this.timeFormat; this.afterMethod('afterRender', function(){ this.getEl().applyStyles('top:0'); }); }, getValue: function(){ return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ''; }, onTriggerClick: function(){ if (this.disabled) { return; } if (this.menu == null) { this.menu = new Ext.menu.DateTimeMenu(); } Ext.apply(this.menu.picker, { minDate: this.minValue, maxDate: this.maxValue, disabledDatesRE: this.ddMatch, disabledDatesText: this.disabledDatesText, disabledDays: this.disabledDays, disabledDaysText: this.disabledDaysText, format: this.format, timeFormat: this.timeFormat, dateFormat: this.dateFormat, showToday: this.showToday, minText: String.format(this.minText, this.formatDate(this.minValue)), maxText: String.format(this.maxText, this.formatDate(this.maxValue)) }); if (this.menuEvents) { this.menuEvents('on'); } else { this.menu.on(Ext.apply({}, this.menuListeners, { scope: this })); } this.menu.picker.setValue(this.getValue() || new Date()); this.menu.show(this.el, "tl-bl?"); } }); Ext.reg('datetimefield', Ext.ux.form.DateTimeField);
四。示例截图:
五。文件下载
- 优化后的时间选择控件精确到秒.zip (6.8 KB)
- 下载次数: 4690
评论
2 楼
qscchao
2012-11-20
很漂亮,请教一下该怎么用,我用的是Ext3的版本,用这个插件一直提示不正确。请教一下该怎么用
1 楼
jiangdianxiang2008
2012-10-11
支持,找这个找好久了,好用。
发表评论
-
心智模型学习:深度探究用户需求的why
2014-06-12 15:20 905心智模型学习:深度 ... -
EXTJS实现的TREEGRID(后台java,框架SpringMVC)
2012-10-11 18:15 14154一。一些废话 近日来 ... -
java反射详解
2012-08-10 12:13 1197转载: 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱 ... -
FLASH+XML柱形图(amCharts为基础拓展)
2011-12-08 14:39 5524FLASH+XML柱形图(amCharts ... -
JavaBean和反射
2012-10-17 10:42 1049<!-- [if gte mso 9]><x ... -
jsp中实现一个页面纯io流上传文件
2011-10-29 13:13 7223jsp中实现一个页面纯io流上传文件 下面是upLoag. ... -
或翻译文章才
2011-10-14 19:13 0http://wiki.springside.org.cn ... -
PL/SQL语句优化(2)
2011-09-30 11:06 0(11) 用Where子句替换HAVING子句: 避免使 ... -
PL/SQL性能优化(一)
2011-09-30 10:29 1179Oracle SQL性能优化 ( ... -
工作日志:远程调试的方法(Tomcat与JDPA)
2011-09-29 14:01 2602工作日志:远程调试JVM 归档时间:2011- ...
相关推荐
在“EXTJS时间控件精确秒”这个主题中,我们将深入探讨EXTJS如何实现时间控件的秒级精确选择,以及如何自定义和优化这一功能。 EXTJS的时间控件主要通过`Ext.form.field.Time`类来实现。这个类提供了一个标准的时间...
总之,EXTJS 5的时间日期选择控件提供了强大的功能,不仅支持精确到秒的选取,还具备良好的可定制性和用户体验。开发者可以通过这些控件轻松构建出符合业务需求的界面,提高应用的交互性和功能性。
ExtJs是一款强大的JavaScript框架,主要用于构建富...优化后的时间选择控件精确到秒,使得在需要精确时间信息的场景下表现得尤为出色。开发者可以根据项目的具体需求,灵活运用这些特性来提升应用的质量和用户体验。
该代码仅适用于ExtJs5.x, 使用方法: 在Extjs5.x.js文件后引入以下两文件,注意顺序和路径: 例如: <script type="text/javascript" src="ext/5.1/ext-all-debug.js"></script> ${src}/DateTimePicker.js"> ${src...
这种控件允许用户选择一个特定的日期和时间,通常用于表单中,以获取用户输入的精确时间戳。 3. **显示问题与解决**:在上述论坛帖子中提到的日期时间控件显示问题,可能涉及到样式、格式配置、时区处理或者与其他...
首先,ExtJS 5 的日期时间控件(DateTimeField)结合了日期选择器(DatePicker)和时间选择器(TimePicker),提供了一种统一的用户输入日期和时间的方式。这个控件通常用于需要用户输入精确日期和时间的场景,比如...
这个控件在许多应用程序中都非常实用,特别是在那些需要精确输入时间信息的场景,如日程管理、预约系统或任何需要精确到分钟的数据记录。 首先,我们来看EXTJS6中的日期控件(DateField)。日期控件允许用户选择一...
在ExtJS 4.0中,日期时间控件通常由两个独立的组件组成:一个用于日期选择,另一个用于时间选择。它们可以单独使用,也可以组合在一起,形成一个完整的日期时间选择器。以下是一些关于这个控件的关键知识点: 1. **...
标题中的"extjs3.0 日期时间控件"指的是ExtJS 3.0框架中的DateTimeField组件,这是一个组合了日期选择器和时间选择器的控件,允许用户以交互的方式选择精确的日期和时间。这个控件通常用于表单中,提供了一种直观且...
通过这个控件,用户可以方便地选择一个精确到秒的时间值,这对于需要精确时间输入的应用场景非常有用,如排程、日程管理或时间记录等。 EXTJS时间控件的核心是`Ext.picker.Date`类,它是日期选择器的基础。不过,要...
总之,“extjs3.2、3.3 时间控件 日期控件扩展”是关于如何在ExtJS 3.x版本中使用和自定义日期及时间选择器的知识点,涵盖了基本使用、扩展开发、实际应用等多个方面。通过深入理解这些概念,开发者可以创建出更加...
这个"extjs4能用的带时分秒的日期控件"可能就是一个定制的组件,它允许用户不仅选择日期,还能选择具体的时间,精确到小时、分钟和秒。 首先,ExtJS 4的日期时间控件一般会基于`Ext.form.field.Date`进行扩展,增加...
通过这样的方式,我们可以得到一个支持时分秒选择的EXTJS DateField扩展控件。这个控件在项目中可以提高数据输入的准确性,特别是在处理时间相关的业务逻辑时。同时,源码分析和自定义组件的编写也能加深对EXTJS框架...
这个控件通常会包含两个部分:日期选择器和时间选择器,允许用户精确地指定一个日期和时间。在ExtJS 2.0中,这个控件可能还不是非常复杂,但已经足够满足基本的日期时间选择需求。 描述中提到的"直接放在extjs的...
在EXTJS4中,时间控件是用于用户交互并输入日期和时间的界面元素,它提供了多种选择方式,包括年月选择、年月日选择以及年月日时分秒选择。这些控件在Web应用程序中非常常见,尤其适用于需要用户输入特定日期或时间...
为了满足更复杂的应用需求,本文将详细介绍如何对ExtJS 4.2的日期控件进行扩展,以实现包括年月日时分秒在内的完整日期时间选择功能。 #### 二、知识点解析 ##### 1. 扩展目的 通过扩展ExtJS 4.2的日期控件,我们...
在给定的场景下,"extjs6 datetimefield 扩展时间控件 分时秒控件"描述了一个针对EXTJS6的`datetimefield`组件的增强,目的是增加对小时、分钟和秒钟的单独选择功能。 EXTJS6是Sencha公司推出的一个强大的...
这个“EXTJS升级版时间控件”是一个增强型的时间选择器,它扩展了EXTJS原有的日期字段(`Ext.form.DateField`)功能,增加了更多的选项来满足用户在日期选择上的需求。 该控件的核心功能是在原有的时间选择基础上,...
时间微调控件则是专门针对时间值进行微调的组件,它通常会与日期选择器一起使用,让用户能够精确到分钟甚至秒来调整时间。在ExtJS中,这种功能可以通过扩展基础的微调控件或者使用内建的时间字段(TimeField)实现。...
在ExtJS 4.2版本中,开发者可以使用DateTime控件来处理日期和时间的选择与显示,这尤其适用于需要精确到时分秒的场景。这个控件是ExtJS对基础日期选择器的扩展,增加了对时间部分的细致控制。 DateTime控件在ExtJS ...