酷站 + 代码 + javascript代码 + 详细内容

View】  【收藏】 【推荐】 【评论用户输入框日期(年月日)提醒 (2008-06-03 )
下载 Download:
迅雷下载(推荐) | 本地下载(电信)

来源: 预览网址:

   重要:当提供源代码在代码框显示时,下载和演示地址可能无效,请点击下面的运行代码查看效果!
提示:您可以修改部分代码再运行,复制和保存功能在Firefox下无效。

用户输入框日期(年月日)提醒

代码来自经典论坛 作者:hansir

根据caiying2007版主和一些朋友的建议对昨天写的一个方法进行了调整, 其实用日期控件就可以了,写这个只是多学些东西呵~,欢迎大家多提见意,共同探讨...
加了部分注释(其实挺简单所以没细加)
增加了日期格式检测, 自动加分隔符, 自动补0
对润月的支持(从别地儿看的方法)
只支持 YYYY-MM-DD格式 分隔符可以变

调用:
window.onload=function(){
net new date_help('myDate', '-'); // myDate 为输入框的ID名字,'-'为日期分格符
}

<script type="text/javascript">
/*
    *** http://www.hansir.cn ***
*/
var date_help = function(inp, divide){
        this.inp = document.getElementById(inp);
        this.divide = divide;
        this.format = 'YYYY'+divide+'MM'+divide+'DD';
        //显示字符样式
        this.styleH='<span style="font-weight:bold; color:green">';
        this.styleB='</span>';
        this.load(); // 初始化
}
date_help.prototype={
    load: function(){
        // 创建一个用于显示提示的DIV并设置样式
        var div = document.createElement('div');
        div.setAttribute('style', 'height:21px; line-height:21px;font-family:宋体; font-size:13px; letter-spacing:1px; text-align:center; background:#fffff6; color:#f60; border:1px solid #ccc; border-top:0; position:absolute; visibility:hidden');
        div.style.cssText = 'height:21px; line-height:21px; font-family:宋体; font-size:13px; letter-spacing:1px; text-align:center; background:#fffff6; color:#f60; border:1px solid #ccc; border-top:0; position:absolute; visibility:hidden';
        div.innerHTML = this.format;
        this.div = div;
        document.body.appendChild(div);
        
        // 设置DIV的位置
        var inp = this.inp;
        var inpW = inp.offsetWidth, inpH = inp.offsetHeight;
        var left = 0, top = 0;
        while(inp != null){ // 计算输入框在页面里的坐标给提示框使用
            left += inp.offsetLeft;
            top += inp.offsetTop;
            inp = inp.offsetParent;
        }
        this.div.style.height = '21px';
        this.div.style.width = inpW-2 + 'px';
        this.div.style.left = left + 'px';
        this.div.style.top = inpH+top + 'px';
        
        // 加载输入框事件
        var oThis = this;
        this.inp.onfocus = function(){
            oThis.inp_v.call(oThis);
        }
        
        this.inp.onblur = function(){
            oThis.inp_h.call(oThis);
        }
        this.inp.onkeypress = function(e){ //键盘按下事件
            e?intKey=e.which:intKey=event.keyCode;
            return oThis.inp_press.call(oThis, intKey);
        }
        this.inp.onkeyup = function(e){
            e?intKey=e.which:intKey=event.keyCode;
            oThis.inp_chk.call(oThis,intKey);
        }
        
    },
    inp_v: function(){ // 提示信息显示
        this.div.style.visibility = 'visible';
    },
     inp_h: function(){ // 提示信息显示
        if(new RegExp('^\\d+'+this.divide+'\\d'+this.divide).test(this.inp.value)){ // 月数补0
            this.inp.value = this.inp.value.replace(new RegExp('^(\\d+'+this.divide+')(\\d)(?='+this.divide+')'),'$10$2');
            this.parseDate();
            this.parseFormat();
        }
        if(new RegExp('^\\d+'+this.divide+'\\d+'+this.divide+'\\d$').test(this.inp.value)){ // 天数补0
            this.inp.value = this.inp.value.replace(/(\d)$/,'0$1');
            this.parseDate();
            this.parseFormat();
        }
        this.div.style.visibility = 'hidden';
    },
    inp_press: function(intKey){ //键键按下事件 只接受数字和分隔符
            return (new RegExp('[\\d'+this.divide+']').test(String.fromCharCode(intKey)) || (intKey==0||intKey==8));
    },
    inp_chk: function(intkey){ // 格式化日期及提示信息样式
        if(intKey==37||intKey==39)return; // 左右键不检测
        this.parseDate(intKey); // 格式化日期
        this.parseFormat(); // 格式化提示信息
    },
    
    parseDate: function(intKey){ // 格式化日期
        var intDate = this.inp.value.replace(/\s/g,'');
        var divide=this.divide;
        var strDateArray = intDate.split(divide);
        strDateArray[0]?intYear = strDateArray[0].replace(/^(\d*).*$/,'$1'):intYear='';
        strDateArray[1]?intMonth = strDateArray[1].replace(/^(\d*).*$/,'$1'):intMonth='';
        strDateArray[2]?intDay = strDateArray[2].replace(/^(\d*).*$/,'$1'):intDay='';
        if((intKey==8 || intKey==46) && (!strDateArray[0]||strDateArray[0].length<5)&&(!strDateArray[1] || strDateArray[1].length<3) && (!strDateArray[2]||strDateArray[2].length<3))return intDate; // 退格键检测
        isNaN(intYear)?intYear='':intYear=intYear.slice(0,4);
        isNaN(intMonth)?intMonth='':intMonth=intMonth.slice(0,2);
        isNaN(intDay)?intDay='':intDay=intDay.slice(0,2);
        // 判断在修改阶段
        if(intYear.length<4 && (intMonth!='' || intDay!='')){
            if(strDateArray[1].length<3 && strDateArray[2]<3)return intDate;
        }
        if(intMonth.length<2 && intDay!=''){
            if(strDateArray[0].length<4 && strDateArray[2]<3)return intDate;
        }
        if(intMonth.slice(0,1)>1)intMonth='0'+intMonth.slice(0,1);
        if(intMonth>12){
            var m='0'+intMonth.slice(0,1);
            var d=intMonth.slice(1,2);
            intMonth = m;
            if(intDay=='')intDay=d;
        }
        var intM=Number(intMonth);
        if(intM == 1 || intM == 3 || intM == 5 || intM == 7 || intM == 8 || intM == 10 || intM == 12){
            if(intDay.slice(0,1)>3)intDay='0'+intDay.slice(0,1);
            intDay>31?intDay=intDay.slice(0,1):'';
        }
        if(intM == 4 || intM == 6 || intM == 9 || intM == 11){
            if(intDay.slice(0,1)>3)intDay='0'+intDay.slice(0,1);
            parseInt(intDay)>30?intDay=intDay.slice(0,1):'';
        }
        if(intM == 2){
            boolLeapYear = false;
            if ((intYear % 100) === 0) {
                if ((intYear % 400) === 0) {
                    boolLeapYear = true;
                }
            } else {
                if ((intYear % 4) === 0) {
                    boolLeapYear = true;
                }
            }
            if (boolLeapYear) {
                if(intDay.slice(0,1)>2)intDay='0'+intDay.slice(0,1);
            } else {
                if(intDay.slice(0,1)>2)intDay='0'+intDay.slice(0,1);
                if (intDay > 28)intDay=intDay.slice(0,1);
            }
        }
        temDate = '';
        if(intYear!='')intYear.length==4 ? temDate = intYear + divide : temDate = intYear;
        if(intMonth!='')intMonth.length==2 ? temDate = intYear + divide + intMonth + divide : new RegExp('\\d+'+divide+'\\d+'+divide).test(intDate) ? temDate=intYear+divide+'0'+intMonth+divide:temDate = intYear + divide + intMonth;
        if(intDay!='')temDate=intYear+divide+intMonth+divide+intDay;
        this.inp.value=temDate;
        return temDate;
    },
    
    parseFormat: function(){ //格式化提示信息
        var intDate = this.inp.value;
        if(!intDate){
            this.div.innerHTML=this.format;
            return;
        }
        var format = this.format; // 提示字符
        var divide = this.divide;
        var uarr = intDate.split(divide), farr = format.split(divide) // 用户输入的字符分组
        var styleH = this.styleH, styleB = this.styleB;
        var y=farr[0], m=farr[1], d=farr[2]; // 年, 月, 日
        if(uarr!='')y=styleH+y.slice(0,uarr[0].length)+styleB+y.slice(uarr[0].length,y.length);
        if(uarr[1]!='' && uarr[1]!=null){
            m=styleH+divide+m.slice(0,uarr[1].length)+styleB+m.slice(uarr[1].length,m.length);
        }else{
            new RegExp('\\d*'+divide).test(intDate)?m=styleH+divide+styleB+m:m=divide+m;
        }
        if(uarr[2]!=''&&uarr[2]!=null){
            d=styleH+divide+d.slice(0,uarr[2].length)+styleB+d.slice(uarr[2].length,d.length);
        }else{
            new RegExp('\\d*?'+divide+'\\d*?'+divide).test(intDate)?d=styleH+divide+styleB+d:d=divide+d;
        }
        this.div.innerHTML= y+m+d;
    }
}
</script>


上一篇:一个弹出层的JS特效   下一篇:双击文字后实现编辑文本功能

共有 0 位酷友发表了评论, 点此查看全部 酷友评论(Comments)

添加评论(Add Comments) 不能超过250字,需审核,请自觉遵守互联网相关政策法规。

昵称: 论坛注册
密码: 匿名?

服务赞助商

随机显示10条设计素材