`
linwei_211
  • 浏览: 192049 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

重写时间控件,只有选择年月的界面

阅读更多
下面是在ext官方网站上down的一个函数只显示年和月,不显示日
// in the .html
<span id="curMonthDiv">&nbsp;</span>


// in the .js
myApp.app = function() {
    var monthPicker = null;

    return {
        init: function() {

            monthPicker = new Ext.ux.MonthField({
                format:      'M, Y',
                useDayDate:  1,
                noPastYears: true,
                renderTo:    'curMonthDiv',
                monthNames:  [ /* month names... */ ]
            });
            // #1: This works, but still turns the text input gray/doesn't look good
            monthPicker.el.dom.readOnly = true;

            // add listener for when the OK button is clicked (go to new month)
            // #2: doesn't work
            monthPicker.on("select", function(picker, selDate) {
                // go to the new month - contact server...
                // When I select the month and hit the OK btn, this code is not reached
            });

            monthPicker.setValue(new Date()); // today
        } // end init()
    }; // end return
}(); // end myApp.app

----------------------------------------------
下面是我同事扩展的:

Ext.ux.MonthPicker=Ext.extend(Ext.Component,{
format:"M-y",
okText:Ext.DatePicker.prototype.okText,
cancelText:Ext.DatePicker.prototype.cancelText,
constrainToViewport:true,
monthNames:Date.monthNames,
startDay:0,
value:0,
noPastYears:false,
initComponent:function () {
Ext.ux.MonthPicker.superclass.initComponent.call(this);
this.value=this.value?
this.value.clearTime():new Date().clearTime();
this.addEvents(
'select'
);
if(this.handler) {
this.on("select",this.handler,this.scope||this);
}
},
focus:function () {
if(this.el) {
this.update(this.activeDate);
}
},
onRender:function (container,position) {
var m=['<div style="width: 200px; height:175px;"></div>']
m[m.length]='<div class="x-date-mp"></div>';
var el=document.createElement("div");
el.className="x-date-picker";
el.innerHTML=m.join("");
container.dom.insertBefore(el,position);
this.el=Ext.get(el);
this.monthPicker=this.el.down('div.x-date-mp');
this.monthPicker.enableDisplayMode('block');
this.el.unselectable();
this.showMonthPicker();
if(Ext.isIE) {
this.el.repaint();
}
this.update(this.value);
},
createMonthPicker:function () {
if(!this.monthPicker.dom.firstChild) {
var buf=['<table border="0" cellspacing="0">'];
for(var i=0;i<6;i++) {
buf.push(
'<tr><td class="x-date-mp-month"><a href="#">',this.monthNames[i].substr(0,3),'</a></td>',
'<td class="x-date-mp-month x-date-mp-sep"><a href="#">',this.monthNames[i+6].substr(0,3),'</a></td>',
i==0?
'<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>':
'<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'
);
}
buf.push(
'<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',
this.okText,
'</button><button type="button" class="x-date-mp-cancel">',
this.cancelText,
'</button></td></tr>',
'</table>'
);
this.monthPicker.update(buf.join(''));
this.monthPicker.on('click',this.onMonthClick,this);
this.monthPicker.on('dblclick',this.onMonthDblClick,this);
this.mpMonths=this.monthPicker.select('td.x-date-mp-month');
this.mpYears=this.monthPicker.select('td.x-date-mp-year');
this.mpMonths.each(function (m,a,i) {
i+=1;
if((i%2)==0) {
m.dom.xmonth=5+Math.round(i*.5);
}else {
m.dom.xmonth=Math.round((i-1)*.5);
}
});
}
},
showMonthPicker:function () {
this.createMonthPicker();
var size=this.el.getSize();
this.monthPicker.setSize(size);
this.monthPicker.child('table').setSize(size);
this.mpSelMonth=(this.activeDate||this.value).getMonth();
this.updateMPMonth(this.mpSelMonth);
this.mpSelYear=(this.activeDate||this.value).getFullYear();
this.updateMPYear(this.mpSelYear);
this.monthPicker.show();
//this.monthPicker.slideIn('t', {duration:.2});
},
updateMPYear:function (y) {
if(this.noPastYears) {
var minYear=new Date().getFullYear();
if(y<(minYear+4)) {
y=minYear+4;
}
}
this.mpyear=y;
var ys=this.mpYears.elements;
for(var i=1;i<=10;i++) {
var td=ys[i-1],y2;
if((i%2)==0) {
y2=y+Math.round(i*.5);
td.firstChild.innerHTML=y2;
td.xyear=y2;
}else {
y2=y-(5-Math.round(i*.5));
td.firstChild.innerHTML=y2;
td.xyear=y2;
}
this.mpYears.item(i-1)[y2==this.mpSelYear?'addClass':'removeClass']('x-date-mp-sel');
}
},
updateMPMonth:function (sm) {
this.mpMonths.each(function (m,a,i) {
m[m.dom.xmonth==sm?'addClass':'removeClass']('x-date-mp-sel');
});
},
selectMPMonth:function (m) {
},
onMonthClick:function (e,t) {
e.stopEvent();
var el=new Ext.Element(t),pn;
if(el.is('button.x-date-mp-cancel')) {
this.hideMonthPicker();
//this.fireEvent("select", this, this.value);
}
else if(el.is('button.x-date-mp-ok')) {
this.update(new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate()));
//this.hideMonthPicker();
this.fireEvent("select",this,this.value);
}
else if(pn=el.up('td.x-date-mp-month',2)) {
this.mpMonths.removeClass('x-date-mp-sel');
pn.addClass('x-date-mp-sel');
this.mpSelMonth=pn.dom.xmonth;
}
else if(pn=el.up('td.x-date-mp-year',2)) {
this.mpYears.removeClass('x-date-mp-sel');
pn.addClass('x-date-mp-sel');
this.mpSelYear=pn.dom.xyear;
}
else if(el.is('a.x-date-mp-prev')) {
this.updateMPYear(this.mpyear-10);
}
else if(el.is('a.x-date-mp-next')) {
this.updateMPYear(this.mpyear+10);
}
},
onMonthDblClick:function (e,t) {
e.stopEvent();
var el=new Ext.Element(t),pn;
if(pn=el.up('td.x-date-mp-month',2)) {
this.update(new Date(this.mpSelYear,pn.dom.xmonth,(this.activeDate||this.value).getDate()));
//this.hideMonthPicker();
this.fireEvent("select",this,this.value);
}
else if(pn=el.up('td.x-date-mp-year',2)) {
this.update(new Date(pn.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));
//this.hideMonthPicker();
this.fireEvent("select",this,this.value);
}
},
hideMonthPicker:function (disableAnim) {
Ext.menu.MenuMgr.hideAll();
},
showPrevMonth:function (e) {
this.update(this.activeDate.add("mo",-1));
},
showNextMonth:function (e) {
this.update(this.activeDate.add("mo",1));
},
showPrevYear:function () {
this.update(this.activeDate.add("y",-1));
},
showNextYear:function () {
this.update(this.activeDate.add("y",1));
},
update:function (date) {
this.activeDate=date;
this.value=date;
if(!this.internalRender) {
var main=this.el.dom.firstChild;
var w=main.offsetWidth;
this.el.setWidth(w+this.el.getBorderWidth("lr"));
Ext.fly(main).setWidth(w);
this.internalRender=true;
if(Ext.isOpera&&!this.secondPass) {
main.rows[0].cells[1].style.width=(w-(main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth))+"px";
this.secondPass=true;
this.update.defer(10,this,[date]);
}
}
}
});
Ext.reg('monthpicker',Ext.ux.MonthPicker);

Ext.ux.MonthItem=function (config) {
Ext.ux.MonthItem.superclass.constructor .call(this,new Ext.ux.MonthPicker(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.ux.MonthItem,Ext.menu.Adapter,{
onSelect:function (picker,date) {
this.fireEvent("select",this,date,picker);
Ext.ux.MonthItem.superclass.handleClick.call(this);
}
});
Ext.ux.MonthMenu=function (config) {
Ext.ux.MonthMenu.superclass.constructor .call(this,config);
this.plain=true;
var mi=new Ext.ux.MonthItem(config);
this.add(mi);
this.picker=mi.picker;
this.relayEvents(mi,["select"]);
};
Ext.extend(Ext.ux.MonthMenu,Ext.menu.Menu,{
cls:'x-date-menu'
});
Ext.ux.MonthField=function (cfg) {
Ext.ux.MonthField.superclass.constructor .call(this,Ext.apply({
},cfg||{
}));
}
Ext.extend(Ext.ux.MonthField,Ext.form.DateField,{
format:"Y-m",
triggerClass:"x-form-date-trigger",
menuListeners:{
select:function (m,d) {
this.setValue(d.format(this.format));
},
show:function () {
this.onFocus();
},
hide:function () {
this.focus.defer(10,this);
var ml=this.menuListeners;
this.menu.un("select",ml.select,this);
this.menu.un("show",ml.show,this);
this.menu.un("hide",ml.hide,this);
}
},
onTriggerClick:function () {
if(this.disabled) {
return ;
}
if(this.menu==null) {
this.menu=new Ext.ux.MonthMenu();
}
Ext.apply(this.menu.picker,{
});
this.menu.on(Ext.apply({
},this.menuListeners,{
scope:this
}));
this.menu.show(this.el,"tl-bl?");
}
});
Ext.reg("monthfield",Ext.ux.MonthField);

eg:用的时候用monthfield就可以了
  {
          fieldLabel  : '开始年份',
           id          : 'startYear_dateFieldId',
           name        : 'start',
            itemCls    :'LeftFloat',
          clearCls   :'allowFloat',
          width       :180,
           value       : '2010',
           format      : 'Y',
           readOnly    : true,
           xtype       : 'monthfield'
   }
分享到:
评论

相关推荐

    Ext DateField控件 - 只选择年月

    开发者可能通过重写或者添加特定的配置,使得原本的DateField控件在弹出的日历选择器中只显示年和月,而隐藏或者禁用日的选择。这通常涉及到对控件的模板、事件监听器以及选择器逻辑的调整。 源码分析方面,`...

    Ext扩展dateField时间控件,可以选择年月日、年月、年、月

    总的来说,`Ext`框架中的`dateField`扩展为开发者提供了强大的工具,使他们能够创建适应各种场景的时间选择控件,不仅满足基本的日期输入需求,还能提供更加精细化和定制化的用户体验。通过深入学习和理解`...

    只显示年月的时间选择控件

    总的来说,这个只显示年月的时间选择控件是Android开发中的一个实用工具,尤其适用于那些只需要年月信息的场景。它的实现涉及到了自定义View的开发、布局设计、事件处理等多个方面,对于提升Android应用的用户体验...

    qt 定制日期时间控件

    通过这种方式,我们可以提升用户界面的交互性和易用性,使日期和时间的选择更加直观。在实际应用中,你可能还需要根据项目需求进一步调整控件的样式、布局以及行为,确保其与整体应用风格一致。记得在`MyCalendar`...

    年月日时间选择器wheelview

    这个特定的资源包名为 "年月日时间选择器wheelview",显然是一款定制的`WheelView`实现,专门用于选择年、月、日。 `WheelView`的基本概念是创建一系列可视化的“滚轮”,每个滚轮代表一个可选的值范围,如年份...

    安卓天气日历时间选择倒计时相关-高仿安卓原日期选择控件(可控制最大日期最小日期输出日期格式控制支持年月日和年月展示.rar

    这篇文档将深入解析“安卓天气日历时间选择倒计时相关-高仿安卓原日期选择控件”的核心知识点,帮助开发者理解和应用这个控件。该控件的主要特点是能够灵活地控制最大日期、最小日期,以及调整输出日期的格式,同时...

    年月日、时分秒控件的实现

    在Android或iOS等移动开发平台,以及Web前端开发中,我们常常需要自定义控件来满足特定的时间选择需求。"年月日时分秒控件的实现"是一个常见的任务,它涉及到了用户界面(UI)设计和交互逻辑的编写。下面,我们将...

    Qt 滚动 日期 选择器 循环选择

    在Qt框架中,滚动日期选择器是一种常用的UI组件,它允许用户方便地选取特定的日期和时间。在本文中,我们将深入探讨如何实现一个支持年...通过这样的定制,我们可以创建出更加灵活且符合用户交互习惯的日期时间选择器。

    基于QT的数码管显示时间控件

    为了实现动态显示时间,控件需要继承自QLabel或者QWidget,并重写paintEvent()函数,以便在每次窗口需要重绘时更新时间显示。同时,需要一个定时器(如QTimer)来定期更新时间,确保显示始终与系统时间同步。 在...

    EXTJS升级版时间控件

    这个“EXTJS升级版时间控件”是一个增强型的时间选择器,它扩展了EXTJS原有的日期字段(`Ext.form.DateField`)功能,增加了更多的选项来满足用户在日期选择上的需求。 该控件的核心功能是在原有的时间选择基础上,...

    垂直滚轮选择年月日时分钟秒

    "垂直滚轮选择年月日时分钟秒"是一个常见的日期和时间选择功能,广泛应用于各种应用程序和系统,例如表单填写、事件计划或者数据分析等场景。这个功能通常会通过一个自定义控件来实现,以提供用户友好的交互体验。在...

    Android 日期选择控件

    在Android开发中,日期选择控件是用户界面中常见的组件,用于让用户方便地选取日期。在给定的“Android 日期选择控件”主题中,我们关注的是一个特别设计的控件,它允许用户通过上下滑动的方式进行交互,并且在选定...

    自定义横向ScrollView时间数字选择控件

    在项目中,开发者可以通过直接实例化这个类并配置参数,就能在任何需要的地方使用这个时间选择控件。 总的来说,这个自定义横向ScrollView时间数字选择控件展示了Android开发中的自定义视图和事件处理能力,通过...

    qt做一个带有日历和钟表的界面

    Qt库中的QCalendarWidget是一个方便的组件,它允许用户选择日期并显示在一个标准的日历视图中。我们可以直接在代码中添加QCalendarWidget到布局中,设置其属性如字体、颜色、显示模式等,以适应我们的界面设计需求。...

    silverlight自定义日历插件

    它支持XAML(Extensible Application Markup Language)来定义用户界面,通过C#或VB.NET编写业务逻辑,并且提供了丰富的控件库和图形渲染能力。Silverlight应用可以跨浏览器运行,为用户提供类似于桌面应用的体验。 ...

    Android基于wheelView的自定义时间选择器(年,月,日,星期,时间)(可拓展样式)

    本文将深入探讨如何基于`WheelView`创建一个自定义的时间选择器,它能够允许用户选择年、月、日、星期以及时间,并且提供了灵活性以适应不同的界面样式。`WheelView`是一个滚动选择控件,常用于日期选择器、选项列表...

    Android例子源码——可以一次性选择两个日期的自定义日历控件.zip

    这个压缩包文件包含了一个针对Android平台的自定义日历控件的源代码示例,它允许用户一次性选择两个日期。这个功能在很多应用场景中都非常实用,例如预订系统、行程规划等,用户可以方便地选择开始和结束日期。下面...

    C#开发简单控件源码

    在C#编程中,开发自定义控件是一项常见的任务,它可以增强用户界面的功能性和美观性。本项目"简单控件源码"就是这样一个实例,它专注于日期输入的控制,确保了数据的有效性和用户友好的交互体验。以下是这个控件的...

    qt滑动选择年份SliderTime.7z

    在Qt开发环境中,滑动选择年份的组件通常用于创建用户友好的时间选择界面,它允许用户通过滑动操作来方便地选取特定的年份。`SliderTime`可能是一个自定义的Qt部件,专为这种功能设计。让我们深入探讨一下Qt开发语言...

    Android 选择器

    开发者可以根据应用的风格和用户体验需求来选择合适的时间选择方式。 **自定义滚轴选择器** 虽然Android提供了内置的`DatePicker`和`TimePicker`,但有时为了实现更个性化的界面或更复杂的逻辑,开发者可能需要...

Global site tag (gtag.js) - Google Analytics