`
linwei_211
  • 浏览: 191608 次
  • 性别: 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的数码管显示时间控件

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

    EXTJS升级版时间控件

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

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

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

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

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

    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中qdateedit无法设置月份的解决方法

    QDateEdit通过QDateTime或QDate对象来存储日期信息,用户通常可以通过界面交互来修改日期。然而,它并不直接提供设置月份的接口,而是通过设置日期对象来间接实现。默认的日期选择器只允许用户通过下拉框选择年、月...

    qt滑动选择年份SliderTime.7z

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

Global site tag (gtag.js) - Google Analytics