分享
 
 
 

----- 日期控件的另一种思路,限制输入格式的日期控件 -----

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

关于日期输入,现在网上的日期控件很多,在这里,我试着模仿了部分CS程序中的日期输入控件,从另一个角度来考虑日期格式的输入,即输入日期时固定格式,用户只能在程序规定的地方输入数据。

例程如下,希望对大家有所帮助~~~ (时间仓促,例程是IE ONLY的)

<SCRIPT LANGUAGE="JavaScript">

/*----------------------------可以放到外部JS中,DateInputControl.js--------------------*/

/*

* Added by LiuXiaoChong 2005.4.25

* 限制输入的日期控件

* Param: txtName 为要限制输入的文本框的名称

*

* 功能描述:1,只能输入数字

* 2,左右键可以移动编辑焦点

* 3,上下键可以对数据进行微调

* 4,控件包含了对日期的合法校验

*/

function regDateControl(txtName)

{

var oInput = document.getElementById(txtName);

oInput.middleChar = "-";

oInput.selectIndex = 1; //默认选中年

oInput.maxLength = 10;

oInput.style.imeMode = "disabled";

oInput.value = specialText_GetDate(oInput.middleChar);

oInput.charWidth = oInput.createTextRange().boundingWidth / oInput.maxLength;

//注册单击事件

oInput.onclick = specialText_ClickEvent;

oInput.onkeydown = specialText_KeyDownEvent;

oInput.onfocus = function(){specialText_SelectYear(this);}

oInput.onblur = function()

{

specialText_validYear(this);

specialText_validMonth(this);

specialText_validDate(this);

}

//屏蔽鼠标右键和拖动操作

oInput.oncontextmenu = function(){return false;}

oInput.ondrop = function(){return false;}

}

//鼠标单击,根据位置对日期进行分体选择

function specialText_ClickEvent()

{

event.cancelBubble = true;

specialText_validYear(this);

specialText_validMonth(this);

specialText_validDate(this);

if(event.offsetX <= specialText_getCharWidth(this.charWidth,4))

specialText_SelectYear(this);

else if(event.offsetX > specialText_getCharWidth(this.charWidth,4)

&& event.offsetX <= specialText_getCharWidth(this.charWidth,7))

specialText_SelectMonth(this);

else if(event.offsetX > specialText_getCharWidth(this.charWidth,7))

specialText_SelectDate(this);

}

//选中年份

function specialText_SelectYear(oInput)

{

var oRange = oInput.createTextRange();

oRange.moveStart("character",0);

oRange.moveEnd("character",-6);

//代表选中了年

oInput.selectIndex = 1;

oRange.select();

}

//选中月份

function specialText_SelectMonth(oInput)

{

var oRange = oInput.createTextRange();

oRange.moveStart("character",5);

oRange.moveEnd("character",-3);

//代表选中了月

oInput.selectIndex = 2;

oRange.select();

}

//选中日期

function specialText_SelectDate(oInput)

{

var oRange = oInput.createTextRange();

oRange.moveStart("character",8);

//代表选中了日期

oInput.selectIndex = 3;

oRange.select();

}

//校验年份有效性

function specialText_validYear(oInput)

{

var arrValue = oInput.value.split(oInput.middleChar);

var strYear = arrValue[0];

if(parseInt(strYear,10) == 0)

arrValue[0] = 2000;

//如果年份小于4位,则在2000基础上增加

else if(strYear.length < 4)

arrValue[0] = 2000 + parseInt(strYear,10);

oInput.value = arrValue.join(oInput.middleChar);

}

//校验月份有效性

function specialText_validMonth(oInput)

{

var arrValue = oInput.value.split(oInput.middleChar);

var strMonth = arrValue[1];

//如果月份输入了0,则按1月处理

if(parseInt(strMonth,10) == 0)

arrValue[1] = "01";

//如果月份是一位,则前面补0

else if(strMonth.length < 2)

arrValue[1] = "0" + strMonth;

//如果月份大于12月,自动转为12月

else if(parseInt(strMonth,10) > 12)

arrValue[1] = "12";

oInput.value = arrValue.join(oInput.middleChar);

}

//校验日期有效性

function specialText_validDate(oInput)

{

var arrValue = oInput.value.split(oInput.middleChar);

var strYear = arrValue[0];

var strMonth = arrValue[1];

var strDate = arrValue[2];

var intMonth = parseInt(strMonth,10);

if(parseInt(strDate,10) == 0)

arrValue[2] = "01";

else if(strDate.length < 2)

arrValue[2] = "0" + strDate;

else

{

//如果超过了月份的最大天数,则置为最大天数

var monthMaxDates = specialText_getMonthDates(strYear,strMonth);

if(parseInt(strDate,10) > monthMaxDates)

arrValue[2] = monthMaxDates;

}

oInput.value = arrValue.join(oInput.middleChar);

}

function specialText_YearAdd(oInput,isMinus)

{

var arrValue = oInput.value.split(oInput.middleChar);

var strYear = arrValue[0];

if(isMinus)

{

arrValue[0] = parseInt(strYear,10) - 1;

if(parseInt(arrValue[0],10) < 1)

arrValue[0] = "0001";

}

else

arrValue[0] = parseInt(strYear,10) + 1;

oInput.value = arrValue.join(oInput.middleChar);

specialText_validYear(oInput);

specialText_SelectYear(oInput);

}

function specialText_MonthAdd(oInput,isMinus)

{

var arrValue = oInput.value.split(oInput.middleChar);

var strMonth = arrValue[1];

if(isMinus)

{

arrValue[1] = parseInt(strMonth,10) - 1;

if(parseInt(arrValue[1],10) == 0)

arrValue[1] = "12";

}

else

{

arrValue[1] = parseInt(strMonth,10) + 1;

if(parseInt(arrValue[1],10) == 13)

arrValue[1] = "01";

}

oInput.value = arrValue.join(oInput.middleChar);

specialText_validMonth(oInput);

specialText_SelectMonth(oInput);

}

function specialText_DateAdd(oInput,isMinus)

{

var arrValue = oInput.value.split(oInput.middleChar);

var strYear = arrValue[0];

var strMonth = arrValue[1];

var strDate = arrValue[2];

var monthMaxDates = specialText_getMonthDates(strYear,strMonth);

if(isMinus)

{

arrValue[2] = parseInt(strDate,10) - 1;

if(parseInt(arrValue[2],10) == 0)

arrValue[2] = monthMaxDates;

}

else

{

arrValue[2] = parseInt(strDate,10) + 1;

if(parseInt(arrValue[2],10) == (monthMaxDates + 1))

arrValue[2] = "01";

}

oInput.value = arrValue.join(oInput.middleChar);

specialText_validDate(oInput);

specialText_SelectDate(oInput);

}

function specialText_KeyDownEvent()

{

//如果按了数字键

if((event.keyCode >= 48 && event.keyCode <= 57) ||

(event.keyCode >= 96 && event.keyCode <= 105))

{

var oRange = document.selection.createRange();

if(oRange.text.indexOf(this.middleChar) != -1)

event.returnValue = false;

else

event.returnValue = true;

}

//如果按了方向键

else if(event.keyCode >= 37 && event.keyCode <= 40)

{

event.returnValue = false;

var keyCode = event.keyCode;

//按了左键

if(keyCode == 37)

{

if(this.selectIndex == 1)

{

specialText_validYear(this);

specialText_SelectDate(this);

}

else if(this.selectIndex == 2)

{

specialText_validMonth(this);

specialText_SelectYear(this);

}

else if(this.selectIndex == 3)

{

specialText_validDate(this);

specialText_SelectMonth(this);

}

}

//按了右键

if(keyCode == 39)

{

if(this.selectIndex == 1)

{

specialText_validYear(this);

specialText_SelectMonth(this);

}

else if(this.selectIndex == 2)

{

specialText_validMonth(this);

specialText_SelectDate(this);

}

else if(this.selectIndex == 3)

{

specialText_validDate(this);

specialText_SelectYear(this);

}

}

//按了上键

if(keyCode == 38)

{

if(this.selectIndex == 1)

{

specialText_validYear(this);

specialText_YearAdd(this,true);

}

else if(this.selectIndex == 2)

{

specialText_validMonth(this);

specialText_MonthAdd(this,true);

}

else if(this.selectIndex == 3)

{

specialText_validDate(this);

specialText_DateAdd(this,true);

}

}

//按了下键

if(keyCode == 40)

{

if(this.selectIndex == 1)

{

specialText_validYear(this);

specialText_YearAdd(this,false);

}

else if(this.selectIndex == 2)

{

specialText_validMonth(this);

specialText_MonthAdd(this,false);

}

else if(this.selectIndex == 3)

{

specialText_validDate(this);

specialText_DateAdd(this,false);

}

}

}

//如果按了F5 或 TAB,不屏蔽

else if(event.keyCode == 116 || event.keyCode == 9)

event.returnValue = true;

else

{

event.returnValue = false;

event.keyCode = 0;

}

}

/*---------------------辅助函数-----------------------*/

//得到默认日期

function specialText_GetDate(middleChar)

{

var oDate = new Date();

return oDate.getYear() + middleChar

+ (oDate.getMonth() < 10 ? ("0" + oDate.getMonth()) : oDate.getMonth()) + middleChar

+ (oDate.getDate() < 10 ? ("0" + oDate.getDate()) : oDate.getDate());

}

//得到字符像素宽度

function specialText_getCharWidth(charWidth,charNum)

{

return charNum * charWidth;

}

//得到某年某月的最大天数

function specialText_getMonthDates(strYear,strMonth)

{

var intMonth = parseInt(strMonth,10);

if(intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7

|| intMonth == 8 || intMonth == 10 || intMonth == 12)

return 31;

//处理30天的月份

else if(intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11)

return 30;

//处理2月份

else

{

//闰年

if(specialText_isLeapYear(strYear))

return 29;

//平年

else

return 28;

}

}

//判断是否是闰年

function specialText_isLeapYear(strYear)

{

var intYear = parseInt(strYear,10);

if((intYear % 4 == 0 && intYear % 100 != 0) ||

(intYear % 100 == 0 && intYear % 400 == 0))

return true;

else

return false;

}

/*----------------------------可以放到外部JS中 DateInputControl.js--------------------*/

function init()

{

regDateControl('date1');

}

</SCRIPT>

<body onload="init()">

<INPUT TYPE="text" NAME="date1">

</body>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有