`

Ext日期时间

阅读更多
http://shuimomo.blog.51cto.com/1141396/1293750

截止目前最新的Ext-4.2.1.883版本,分别提供日期组件(xtype:'datefield')和时间组件(xtype:'timefield'),却没有提供日期+时分秒组件。
搜索到的牛人扩展组件代码贴下:

1、新建时间选择器上的时分秒输入框类TimePickerField.js
/**
* 时间输入框, 三个整数框分别输入时,分,秒.
* @author wangzilong
* update Ext - 4.1 2012/04/27
*/
Ext.define('MyApp.ux.TimePickerField', {
      extend: 'Ext.form.field.Base',
      alias: 'widget.timepicker',
      alternateClassName: 'Ext.form.field.TimePickerField',
      requires: ['Ext.form.field.Number'],
      // 隐藏BaseField的输入框 , hidden basefield's input
      inputType: 'hidden',
      style: 'padding:4px 0 0 0;margin-bottom:0px',
      /**
       * @cfg {String} value
       * initValue, format: 'H:i:s'
       */
      value: null,
      /**
      * @cfg {Object} spinnerCfg
      * 数字输入框参数, number input config
      */
      spinnerCfg: {
          width: 40
      },
      /** Override. */
      initComponent: function() {
          var me = this;
          me.value = me.value || Ext.Date.format(new Date(), 'H:i:s');
          me.callParent();// called setValue
          me.spinners = [];
          var cfg = Ext.apply({}, me.spinnerCfg, {
                readOnly: me.readOnly,
                disabled: me.disabled,
                style: 'float: left',
                listeners: {
                    change: {
                        fn: me.onSpinnerChange,
                        scope: me
                    }
                }
            });
          me.hoursSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, {
                  minValue: 0,
                  maxValue: 23
              }));
          me.minutesSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, {
                  minValue: 0,
                  maxValue: 59
              }));
          // TODO 使用timeformat 判断是否创建秒输入框, maybe second field is not always need.
          me.secondsSpinner = Ext.create('Ext.form.field.Number', Ext.apply({}, cfg, {
                  minValue: 0,
                  maxValue: 59
              }));
          me.spinners.push(me.hoursSpinner, me.minutesSpinner, me.secondsSpinner);
      },
      /**
          * @private
          * Override.
          */
      onRender: function() {
          var me = this, spinnerWrapDom, spinnerWrap;
          me.callParent(arguments);
          // render to original BaseField input td
          // spinnerWrap = Ext.get(Ext.DomQuery.selectNode('div', this.el.dom)); // 4.0.2
          spinnerWrapDom = Ext.dom.Query.select('td', this.getEl().dom)[1]; // 4.0 ->4.1 div->td
          spinnerWrap = Ext.get(spinnerWrapDom);
          me.callSpinnersFunction('render', spinnerWrap);
          Ext.core.DomHelper.append(spinnerWrap, {
                tag: 'div',
                cls: 'x-form-clear-left'
            });
          this.setRawValue(this.value);
      },
      _valueSplit: function(v) {
          if(Ext.isDate(v)) {
              v = Ext.Date.format(v, 'H:i:s');
          }
          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.getValue(), this.getRawValue());
      },
      // 依次调用各输入框函数, call each spinner's function
      callSpinnersFunction: function(funName, args) {
          for(var i = 0; i < this.spinners.length; i++) {
              this.spinners[i][funName](args);
          }
      },
      // @private get time as object,
      getRawValue: function() {
          if(!this.rendered) {
              var date = this.value || new Date();
              return this._valueSplit(date);
          } else {
              return {
                  h: this.hoursSpinner.getValue(),
                  m: this.minutesSpinner.getValue(),
                  s: this.secondsSpinner.getValue()
              };
          }
      },
      // private
      setRawValue: function(value) {
          value = this._valueSplit(value);
          if(this.hoursSpinner) {
              this.hoursSpinner.setValue(value.h);
              this.minutesSpinner.setValue(value.m);
              this.secondsSpinner.setValue(value.s);
          }
      },
      // overwrite
      getValue: function() {
          var v = this.getRawValue();
          return Ext.String.leftPad(v.h, 2, '0') + ':' + Ext.String.leftPad(v.m, 2, '0') + ':'
            + Ext.String.leftPad(v.s, 2, '0');
      },
      // overwrite
      setValue: function(value) {
          this.value = Ext.isDate(value) ? Ext.Date.format(value, 'H:i:s') : value;
          if(!this.rendered) {
              return;
          }
          this.setRawValue(this.value);
          this.validate();
      },
      // overwrite
      disable: function() {
          this.callParent(arguments);
          this.callSpinnersFunction('disable', arguments);
      },
      // overwrite
      enable: function() {
          this.callParent(arguments);
          this.callSpinnersFunction('enable', arguments);
      },
      // overwrite
      setReadOnly: function() {
          this.callParent(arguments);
          this.callSpinnersFunction('setReadOnly', arguments);
      },
      // overwrite
      clearInvalid: function() {
          this.callParent(arguments);
          this.callSpinnersFunction('clearInvalid', arguments);
      },
      // overwrite
      isValid: function(preventMark) {
          return this.hoursSpinner.isValid(preventMark) && this.minutesSpinner.isValid(preventMark)
            && this.secondsSpinner.isValid(preventMark);
      },
      // overwrite
      validate: function() {
          return this.hoursSpinner.validate() && this.minutesSpinner.validate() && this.secondsSpinner.validate();
      }
  });

2、将日期选择器datepicker组件扩展成日期时分秒选择器datetimepicker:

Ext.define('MyApp.ux.DateTimePicker', {
      extend: 'Ext.picker.Date',
      alias: 'widget.datetimepicker',
      todayText: '现在',
      timeLabel: '时间',
      requires: ['MyApp.ux.TimePickerField'],
      initComponent: function() {
          // keep time part for value
          var value = this.value || new Date();
          this.callParent();
          this.value = value;
      },
      onRender: function(container, position) {
          if(!this.timefield) {
              this.timefield = Ext.create('MyApp.ux.TimePickerField', {
                    fieldLabel: this.timeLabel,
                    labelWidth: 40,
                    value: Ext.Date.format(this.value, 'H:i:s')
                });
          }
          this.timefield.ownerCt = this;
          this.timefield.on('change', this.timeChange, this);
          this.callParent(arguments);
          var table = Ext.get(Ext.DomQuery.selectNode('table', this.el.dom));
          var tfEl = Ext.core.DomHelper.insertAfter(table, {
                tag: 'div',
                style: 'border:0px;',
                children: [{
                      tag: 'div',
                      cls: 'x-datepicker-footer ux-timefield'
                  }]
            }, true);
          this.timefield.render(this.el.child('div div.ux-timefield'));
          var p = this.getEl().parent('div.x-layer');
          if(p) {
              p.setStyle("height", p.getHeight() + 31);
          }
      },
      // listener 时间域修改, timefield change
      timeChange: function(tf, time, rawtime) {
          // if(!this.todayKeyListener) { // before render
          this.value = this.fillDateTime(this.value);
          // } else {
          // this.setValue(this.value);
          // }
      },
      // @private
      fillDateTime: function(value) {
          if(this.timefield) {
              var rawtime = this.timefield.getRawValue();
              value.setHours(rawtime.h);
              value.setMinutes(rawtime.m);
              value.setSeconds(rawtime.s);
          }
          return value;
      },
      // @private
      changeTimeFiledValue: function(value) {
          this.timefield.un('change', this.timeChange, this);
          this.timefield.setValue(this.value);
          this.timefield.on('change', this.timeChange, this);
      },
      /* TODO 时间值与输入框绑定, 考虑: 创建this.timeValue 将日期和时间分开保存. */
      // overwrite
      setValue: function(value) {
          this.value = value;
          this.changeTimeFiledValue(value);
          return this.update(this.value);
      },
      // overwrite
      getValue: function() {
          return this.fillDateTime(this.value);
      },
      // overwrite : fill time before setValue
      handleDateClick: function(e, t) {
          var me = this,
              handler = me.handler;
          e.stopEvent();
          if(!me.disabled && t.dateValue && !Ext.fly(t.parentNode).hasCls(me.disabledCellCls)) {
              me.doCancelFocus = me.focusOnSelect === false;
              me.setValue(this.fillDateTime(new Date(t.dateValue))); // overwrite: fill time before setValue
              delete me.doCancelFocus;
              me.fireEvent('select', me, me.value);
              if(handler) {
                  handler.call(me.scope || me, me, me.value);
              }
              me.onSelect();
          }
      },
      // overwrite : fill time before setValue
      selectToday: function() {
          var me = this,
              btn = me.todayBtn,
              handler = me.handler;
          if(btn && !btn.disabled) {
              // me.setValue(Ext.Date.clearTime(new Date())); //src
              me.setValue(new Date());// overwrite: fill time before setValue
              me.fireEvent('select', me, me.value);
              if(handler) {
                  handler.call(me.scope || me, me, me.value);
              }
              me.onSelect();
          }
          return me;
      }
  });

2、引用日期时分秒选择器datetimepicker,将日期datefield组件扩展成日期时分秒datetimefield组件:

Ext.Loader.setConfig({enabled:true});
Ext.Loader.setPath('MyApp', '../houtai/js');
Ext.define('MyApp.ux.DateTimeField', {
      extend: 'Ext.form.field.Date',
      alias: 'widget.datetimefield',
      requires: ['MyApp.ux.DateTimePicker'],
      initComponent: function() {
          this.format = this.format;
          this.callParent();
      },
      // overwrite
      createPicker: function() {
          var me = this,
              format = Ext.String.format;
          return Ext.create('MyApp.ux.DateTimePicker', {
                ownerCt: me.ownerCt,
                renderTo: document.body,
                floating: true,
                hidden: true,
                focusOnShow: true,
                minDate: me.minValue,
                maxDate: me.maxValue,
                disabledDatesRE: me.disabledDatesRE,
                disabledDatesText: me.disabledDatesText,
                disabledDays: me.disabledDays,
                disabledDaysText: me.disabledDaysText,
                format: me.format,
                showToday: me.showToday,
                startDay: me.startDay,
                minText: format(me.minText, me.formatDate(me.minValue)),
                maxText: format(me.maxText, me.formatDate(me.maxValue)),
                listeners: {
                    scope: me,
                    select: me.onSelect
                },
                keyNavConfig: {
                    esc: function() {
                        me.collapse();
                    }
                }
            });
      }
  });
3、在form中使用xtype:datetimefield,首先引入扩展类:

requires:'MyApp.ux.DateTimeField',
具体使用:

{
                                xtype:'datetimefield',
                                width : 300,
                                labelWidth : 80,
                                endDateField:'etime',
                                vtype:'daterange',
                                fieldLabel: '记录时间下限',
                                format: 'Y-m-d H:i:s ',
                                name:'stime'
                            },
                            {
                                xtype:'datetimefield',
                                width : 300,
                                labelWidth : 80,
                                startDateField:'stime',
                                vtype:'daterange',
                                fieldLabel: '记录时间上限',
                                format: 'Y-m-d H:i:s ',
                                name:'etime'
                            },

4、页面效果:
152016382.jpg
152018806.jpg
5、使用体验:
可实现日期时分秒的选择输入,但操作体验略差强人意。如:选择器上只有'现在'按钮,若增加‘确定’按钮,点击后选择器消失,日期时分秒值填入框体就好了。现在选非'现在'的精确时间,最后需以点击日期结束,框体中的年月日时分秒才与选择器中完全一致。
分享到:
评论

相关推荐

    ext 日期时间控件

    "EXT日期时间控件"是一个专门用于显示和编辑日期及时间的控件,它可以精确到时、分、秒,满足了对时间精确度有较高要求的应用场景。EXT的时间控件不仅提供了基本的日期和时间选择功能,还支持自定义格式化、日期范围...

    ext日期时间控件2

    EXT日期时间控件2是一款基于EXT JavaScript库的高级UI组件,专为网页应用设计,用于提供用户友好的日期和时间选择功能。EXT是一个强大的前端框架,由Sencha公司开发,广泛应用于构建富互联网应用程序(RIA)。EXT的...

    Ext日期时间控件 Spinner控件 Ext代码 Extjs Grid

    在本文中,我们将深入探讨`ExtJS`框架中的两个关键组件——`Ext日期时间控件`和`Spinner控件`,以及它们在`Grid`中的应用。`ExtJS`是一款强大的JavaScript库,专用于构建富客户端应用程序,尤其适用于创建复杂的、...

    Ext日期时间(时分秒)控件

    标题中的“Ext日期时间(时分秒)控件”指的是在Web开发中使用的一种特定的用户界面组件,它允许用户选择或输入日期和时间。在本文中,我们将会深入探讨这个主题,包括ExtJS框架中的DateTime控件的使用、功能以及如何...

    ext日期时间控件 (支持Extjs 3.0以上版本.)

    用过Extjs的人都晓得,Ext自身的DateField只支持日期选择,而TimeField却实现的又很简单。真的是苦了一帮子英雄好汉啊!此控件由本人原创,扩展了DateField。在Extjs3.0.0、3.2.1、3.3.0版本下都测试通过。且在IE6、...

    EXT日期加时间控件

    EXT日期加时间控件 EXT日期加时间控件

    Ext6时间日期整合.zip

    5. **集成到项目**:在实际项目中,将DateTimePicker和DateTimeField整合到表单或界面中,可能涉及到与后端API的交互,如将用户选择的日期时间传递给服务器,或者从服务器获取数据并填充到DateTimeField中。...

    Ext时间日期选择控件,精确到秒

    标题“Ext时间日期选择控件,精确到秒”指出了该控件允许用户选择时间到秒级别,这对于需要精确时间记录的应用场景(如日程安排、定时任务等)非常关键。EXTJS提供了多种时间日期选择控件,如`MyTimeField.js`、`...

    ext5.0带时间的日期选择

    标签中的"ext5.0 日期 时间选择"暗示了这个实现可能与EXT5.0的日期和时间处理有关,EXT5.0提供了`Ext.Date`对象,包含了多种日期操作和格式化方法,这些方法可以用来处理用户选择的日期和时间。 在压缩包内的"日期...

    ext 下拉日期时间控件

    本控件名为"EXT下拉日期时间控件",具有高度可定制性和灵活性,能够满足开发者对日期时间选择的精确需求。 该控件的独特之处在于它可以将日期和时间精确到秒,这意味着用户可以选择一个特定的日期,然后在时间部分...

    EXT日期格式说明

    EXT日期格式是一种在编程和数据处理中常用的日期和时间表示方式。它允许开发者精确地定义日期和时间的显示格式,从而提高代码的可读性和一致性。EXT日期格式使用各种字符来代表日期和时间的不同部分,以下是一些主要...

    ext里可以选择年月日时分秒的控件

    这里,`showTime`和`showSeconds`属性分别控制是否显示时间和秒,`format`属性则定义了日期时间的显示格式,可以根据需求进行调整。 在实际应用中,你可能还需要监听`select`事件来获取用户选定的日期和时间,以便...

    Ext3 日期范围插件

    标题中的“Ext3 日期范围插件”指的是在Linux操作系统中,Ext3文件系统的一种扩展功能,它允许用户对文件和目录设置特定的访问日期范围限制。Ext3是第三版扩展文件系统,是Linux下的一个日志式文件系统,广泛用于...

    ext日期控件时分秒

    综上所述,EXT JS中的日期控件扩展是解决日期时间选择问题的关键,开发者需要理解EXT JS的组件体系,熟练运用继承和扩展机制,以创建或定制满足特定需求的DateTimeField控件。这不仅提高了用户体验,也丰富了EXT JS...

    EXT js 4带时间的日期控件

    3. **使用时间选择器插件**:EXT JS 提供了一个时间选择器插件(`Ext.picker.DateTimePicker`),可以与日期控件一起使用,为用户提供一个完整的日期和时间选择器。我们可以在控件的配置中添加`useTimePicker: true`...

    Ext做的时间段选择控件

    自己第一次用Ext做的时间段选择控件,是参考公司了另一同事的控件修改的希望对大家有用。

    ext4 年月时间控件 年月日时间控件 年月日时分秒时间控件

    在EXTJS4中,时间控件是用于用户交互并输入日期和时间的界面元素,它提供了多种选择方式,包括年月选择、年月日选择以及年月日时分秒选择。这些控件在Web应用程序中非常常见,尤其适用于需要用户输入特定日期或时间...

    Ext4.x时间日期选择器

    1. **多语言支持**:使日期时间选择器能够适应不同的地区和语言设置。 2. **自定义格式化**:允许用户根据需要定制日期和时间的显示格式。 3. **日期范围限制**:设定可选日期范围,防止用户选择超出规定范围的日期...

    Ext2的日期组件只选择年月

    标题 "Ext2的日期组件只选择年月" 暗示了我们正在讨论一个特定的JavaScript库,可能是ExtJS的旧版本(版本2),其中的一个日期选择组件。这个组件允许用户仅选择年份和月份,而不是完整的日期。ExtJS是一个流行的富...

Global site tag (gtag.js) - Google Analytics