`

Ext中日期区间选择组件

阅读更多
在Ext的应用中,我们常用到要按照日期区间进行查询,通常的做法是写两个日期组件进行成布局来实现,我觉得这样做虽然功能是实现了,但是用户体验不够好,与是编写了如下的日期区间选择组件,代码如下:
/**
 * 日期区间查询组件
 * @class Ext.form.uxDateAreaField
 * @extends Ext.Container
 */
Ext.form.uxDateAreaField = Ext.extend(Ext.Container,{
	
	single : true,//是否只提交一个参数
	paramName : [null,null],
	format : 'Y-m-d',//日期格式化
	separator : ',',//是一个参数提交时,两个日期之间扮隔符
	allowBlank : true,
	disabled : false,
	blankText : '开始日期与结束日期不能为空',
	msgTarget : 'qtip',//提示信息的样式
	invalidText : '开始日期不能大于结束日期',
	invalidClass : 'x-form-invalid',
	disabledClass : 'x-item-disabled',
	preventMark : false,//true阻止组件被标记为不可用
	
	//private
	cls : 'x-form-text x-form-field',
	//private
	isFormField : true,
	
	//private
	activeField : null,
	
	initComponent : function(){
		
		Ext.form.uxDateAreaField.superclass.initComponent.call(this);
		
		this.startName = this.single?null:(this.paramName[0] || (this.name + 'Start'));
		this.endName = this.single?null:(this.paramName[1] || (this.name + 'End'));
		
		this.menu = new Ext.menu.DateMenu({
			scope : this,
			handler : function(picker,date){
				if(!Ext.isEmpty(this.activeField)){
					this.activeField.setValue(date.format(this.format));
					var b = this.validateValue();
					if(b && !Ext.isEmpty(this.hiddenField)){
						this.hiddenField.setValue(this.getValue());
					}
				}
			
			}
		});
		
		//起始日期
		this.startField = new Ext.form.TextField({
			style : 'border:none;text-align:center;margin-left:-3px;',
			cls : 'ux-datearea-field',
			name : this.startName,
			disabled : this.disabled,
			listeners : {
				scope : this,
				'focus' : function(field){
					this.activeField = field;
					this.addClass('x-form-focus');
					this.menu.show(field.el, "tl-bl?");
				},
				'blur' : function(){
					this.removeClass('x-form-focus');
					this.validateValue();
				},
				'render' : function(field){
					field.removeClass('x-form-text');
					if(this.single/* || Ext.isEmpty(this.name)*/){
			        	field.el.dom.name = null;
			        }else{
			        	this.remove(this.hiddenField);
			        }
				}
			}
		});
		
		//显示的分隔符
		this.displayField = new Ext.form.DisplayField({
			cls : 'ux-datearea-field',
			style : 'padding-top: 3px;line-height:normal;',
			width : 16,
			value : '到'
		});
		
		this.endField = this.startField.cloneConfig({
			name : this.endName
		});
		
		this.hiddenField = new Ext.form.Hidden({
			ref : 'containerField',
			name : this.name,
			disabled : this.disabled
		});
		
		this.add(this.startField,this.displayField,this.endField,this.hiddenField);
		this.setDisabled(this.disabled);
		this.on('resize',function(){
			this.fixWidth();
			this.el.setStyle({
				'padding-top' : '0px',
				'height' : Ext.isIE?'22px':'21px'
			});
		},this);
	},
	
	disable : function(){
        if(this.rendered){
        	this.addClass(this.disabledClass);
            this.startField.disable();
			this.endField.disable();
        }
        this.disabled = true;
        return this;
    },
    
    enable : function(){
        if(this.rendered){
            this.removeClass(this.disabledClass);
            this.startField.enable();
			this.endField.enable();
        }
        this.disabled = false;
        return this;
    },
	
	//private
	validateValue : function(){
		var startValue = this.startField.getValue();
		var endValue = this.endField.getValue();
		if(!Ext.isEmpty(startValue) && !Ext.isEmpty(endValue)){
			if(startValue > endValue){
				this.markInvalid();
				return false;
			}else{
				this.clearInvalid();
				return true;
			}
		}else if(!this.allowBlank){
			this.markInvalid(this.blankText);
			return false;
		}
		return true;
	},
	
	validate : function(){
        if(!this.disabled){
            return this.validateValue();
        }
        return true;
    },
	
	//private
	fixWidth : function(){
		var calcWidth = (this.el.getComputedWidth() - 24)/2;
		this.startField.setWidth(calcWidth + 3);
		this.endField.setWidth(calcWidth + 3);
	},
	
	//private
	getMessageHandler : function(){
        return Ext.form.MessageTargets[this.msgTarget];
    },
    
    //设置值
    getValue : function(){
    	var start = this.startField.getValue();
    	var end = this.endField.getValue();
		if(this.single){
			return start + this.separator + end;
		}else{
			return [start,end];
		}
    },
    
    //取值
    setValue : function(v){
    	this.value = v;
        if(this.rendered){
            if(Ext.isEmpty(v)){
            	this.startField.setValue('');
	            this.endField.setValue('');
	            if(!this.allowBlank){
	            	this.validateValue();
	            }
            }else{
            	if(Ext.isString(v)){
	            	var valueArray = v.split(this.separator);
	            	this.startField.setValue(valueArray[0]);
	            	this.endField.setValue(valueArray[1]);
	            }
	            if(Ext.isArray(v)){
	            	this.startField.setValue(v[0]);
	            	this.endField.setValue(v[1]);
	            }
	            if(Ext.isObject(v)){
	            	this.startField.setValue(v[this.startName]);
	            	this.endField.setValue(v[this.endName]);
	            }
            }
            this.validateValue();
        }
        return this;
    },
    
    markInvalid : function(msg){
        if (this.rendered && !this.preventMark) {
            msg = msg || this.invalidText;
            var mt = this.getMessageHandler();
            if(mt){
                mt.mark(this, msg);
                this.startField.addClass('ux-dataarea-invalid');
				this.endField.addClass('ux-dataarea-invalid');
				this.displayField.addClass('ux-dataarea-invalid');
            }else if(this.msgTarget){
                this.el.addClass(this.invalidClass);
                this.startField.addClass('ux-dataarea-invalid');
				this.endField.addClass('ux-dataarea-invalid');
				this.displayField.addClass('ux-dataarea-invalid');
                var t = Ext.getDom(this.msgTarget);
                if(t){
                    t.innerHTML = msg;
                    t.style.display = this.msgDisplay;
                }
            }
        }
        
    },
    
    afterRender : function(){
        Ext.form.uxDateAreaField.superclass.afterRender.call(this);
//        this.initEvents();
        this.initValue();
        if(!this.single){
        	this.remove(this.hiddenField);
        }
    },
    
    initValue : function(){
        if(this.value !== undefined){
            this.setValue(this.value);
        }else /*if(!Ext.isEmpty(this.el.dom.value) && this.el.dom.value != this.emptyText)*/{
            this.setValue('');
        }
        this.originalValue = this.getValue();
    },
    
    reset : function(){
        this.setValue(this.originalValue);
        this.clearInvalid();
    },
    
    clearInvalid : function(){
        if (this.rendered && !this.preventMark) {
            this.el.removeClass(this.invalidClass);
            this.startField.removeClass('ux-dataarea-invalid');
			this.endField.removeClass('ux-dataarea-invalid');
			this.displayField.removeClass('ux-dataarea-invalid');
            var mt = this.getMessageHandler();
            if(mt){
                mt.clear(this);
            }else if(this.msgTarget){
                this.el.removeClass(this.invalidClass);
                this.startField.removeClass('ux-dataarea-invalid');
				this.endField.removeClass('ux-dataarea-invalid');
				this.displayField.removeClass('ux-dataarea-invalid');
                var t = Ext.getDom(this.msgTarget);
                if(t){
                    t.innerHTML = '';
                    t.style.display = 'none';
                }
            }
        }
        
    },
    
    getName : function(){
        return this.rendered && this.el.dom.name ? this.el.dom.name : this.name || this.id || '';
    },
    
    getErrorCt : function(){
        return this.el.findParent('.x-form-element', 5, true) ||
            this.el.findParent('.x-form-field-wrap', 5, true);
    },
    
    // Alignment for 'under' target
    alignErrorEl : function(){
        this.errorEl.setWidth(this.getErrorCt().getWidth(true) - 20);
    },

    // Alignment for 'side' target
    alignErrorIcon : function(){
        this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);
    }
    
    
});
Ext.reg('dateareafield',Ext.form.uxDateAreaField);


要用到的样式为:
.ux-datearea-field{
float:left;
background-color: #FFFFFF;
text-align:center;
padding-top: 4px;
background-image: url("../js/ext/resources/images/default/form/text-bg.gif");
}

.ux-dataarea-invalid{
background-color:#fbeced;
background-image: url("");
}

图片文件在附件中

实现的效果请参考附件中的图片

说明:大家可以把组件进行提取,再此基础上再进行扩展,可以实现几乎所有的区间类查询
为了便于操作,有一个配置项single,这个配置项的作用是控制提交表单时是提交一个参数还是提交两个参数,当提交一个参数时,这两个日期的值以一个分隔符分隔,当以两个参数提交时就如同其它组件一样
  • 大小: 6 KB
  • 大小: 819 Bytes
分享到:
评论

相关推荐

    Ext2的日期组件只选择年月

    在描述中,提供了博文链接,虽然没有具体内容,但可以推测博主可能详细解释了如何配置或自定义Ext2中的日期组件以仅显示年月选择。这可能涉及到对源码的修改,或者利用现有的API选项来实现这一功能。 标签 "源码" ...

    Ext组件说明 Ext组件概述

    Container是Ext中用于组织和管理其他组件的通用容器。它可以嵌套其他容器或组件,并应用不同的布局策略。 ##### 5. **DataView(数据视图)** DataView组件用于展示数据集,支持各种数据绑定和动态更新机制。它...

    ext5.0带时间的日期选择

    在这个场景中,我们主要关注的是EXT5.0的日期选择组件,并且这个组件还包含了时间的选择。 EXT5.0的日期选择器通常使用`Ext.picker.Date`类来创建,它可以提供一个用户友好的日历界面,让用户能够方便地选择日期。...

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

    在EXTJS框架中,时间日期选择控件是一个重要的组件,特别是在构建用户界面时,需要用户输入精确的时间或日期信息。EXTJS 5.0及更高版本提供了更丰富的功能和改进的用户体验,使得开发者能够创建更加直观和用户友好的...

    Ext组件描述,各个组件含义

    - **功能描述**:Date Picker 是一个日期选择器组件,用户可以通过它选择日期。 - **主要用途**:广泛应用于表单中,需要用户输入特定日期的场景。 **2.4 Editor (Ext.Editor)** - **xtype**: `editor` - **功能...

    Ext3 日期范围插件

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

    Ext4.1.1月份组件[只选择年月]

    1. 这个组件基于Ext4 只选择年份/月份的组件,在Ext4.1.1版本正常,但在Ext4.2.1只显示了10个月份少了俩月,在其他的Ext4版本还未测过,你可以试一下,有问题小纸条我[天王盖地虎],咱们一起解决。 2. 该组件最初...

    ExtJS日期多选组件源码

    在日常开发中,我们经常需要处理日期相关的功能,例如日期选择器。在默认情况下,ExtJS的日期选择器(DatePicker)只支持单选,即用户只能选择一个日期。然而,有些场景下,用户可能需要选择多个日期,比如安排一...

    ext 4.0 日期选择控件 时分秒 中文版

    6. **可扩展性**:可以与其他EXT组件(如时间滑块)结合,创建更复杂的日期时间选择器。 在压缩包中的 "datetime4" 文件可能包含了以下内容: - **样式文件**(CSS):定义日期选择控件的外观和布局。 - **脚本...

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

    标题中的"ext里可以选择年月日时分秒的控件"很可能指的是EXT中的`Ext.picker.Date`或者更具体地,可能是`Ext.picker.DateTimePicker`组件。 `Ext.picker.Date`是EXT中基础的日期选择器,而`Ext.picker....

    Ext Extjs 禁止文本和日期编辑

    在Ext JS这个强大的JavaScript框架中,开发者经常使用各种组件来构建富客户端应用,其中包括TextField(文本字段)和DatePicker(日期选择器)。有时,我们可能需要根据应用需求在运行时禁用这些组件的编辑功能,...

    ExtJs 带清空功能的日期组件

    在ExtJs框架中,日期组件(DateField)是用于用户输入日期的常见控件。然而,标准的ExtJs DateField并未内置清空日期的功能,这可能会在某些应用场景中造成不便。为了解决这个问题,我们需要自定义一个扩展,为日期...

    Ext、Ext4中各个组件、属性、方法详解

    Ext、Ext4中各个组件、属性、方法详解,一个不漏;Ext学习入门及参考最好的资料

    Ext2.0.2经典的一个JS组件带EXT中文手册.rar

    这个"Ext2.0.2经典的一个JS组件带EXT中文手册.rar"文件包含了该版本的ExtJS组件和相关的中文文档,帮助开发者更好地理解和使用这个框架。 1. **EXT中文手册**: 提供的`EXT 中文手册.doc`是ExtJS的中文文档,这...

    Ext的日历组件ExtCalendar.zip

    Ext Calendar 是 ExtJS 的一个功能非常强大的日历显示组件,支持包括 IE、Firefox、Safari、Chrome 和 Opera 浏览器。 类结构图如下所示: 运行效果图如下: 标签:ExtCalendar

    ext 颜色改变组件

    EXT Color Change Component,即EXT颜色改变组件,是EXT库中一个用于处理颜色选择和展示的UI组件,它提供了用户友好的界面,使得用户可以在应用中方便地更改颜色。 在EXT框架中,组件是构建用户界面的基本单元,...

    EXT.form组件

    4. `datefield`:`Ext.form.DateField`是日期选择组件,用户可以通过日历控件选择日期,支持自定义日期格式和禁用特定日期。 5. `field`:`Ext.form.Field`是所有表单字段的基础类,提供了一般性的属性和方法,如...

    Ext中表单中各种组件的布局

    ### Ext中表单中各种组件的布局 #### 平行分列布局介绍 在Ext框架中,表单组件是创建用户界面的重要组成部分。通过合理的布局管理可以极大地提升用户体验。本篇将详细介绍Ext中表单中各种组件的布局方法,重点讨论...

    Ext2.0 文件上传组件

    "Ext2.0 文件上传组件"是一个用于Web应用程序的组件,它允许用户在浏览器中方便地上传文件。这个组件基于Ext JavaScript库的2.0版本,Ext是一个强大的前端开发框架,提供了丰富的用户界面组件和数据管理功能。在本文...

    ext 日期时间控件

    在EXT中,日期时间控件(DateTimeField)是一个非常实用的组件,允许用户选择日期和时间,从而提高用户体验和数据输入的准确性。EXT提供了丰富的UI组件,包括表格、面板、窗口、表单等,而日期时间控件则是表单组件...

Global site tag (gtag.js) - Google Analytics