转一个日期输入控件,支持FF


Posted in Javascript onApril 27, 2007

<HTML>
<HEAD>
<TITLE>日期选择器</TITLE>
<SCRIPT type="text/javascript">
/**
* 返回日期
* @param d the delimiter
* @param p the pattern of your date
* @author  Xinge(修改)
*/
String.prototype.toDate = function(x, p) {
 if(x == null) x = "-";
 if(p == null) p = "ymd";
 var a = this.split(x);
 var y = parseInt(a[p.indexOf("y")]);
 //remember to change this next century ;)
 if(y.toString().length <= 2) y += 2000;
 if(isNaN(y)) y = new Date().getFullYear();
 var m = parseInt(a[p.indexOf("m")]) - 1;
 var d = parseInt(a[p.indexOf("d")]);
 if(isNaN(d)) d = 1;
 return new Date(y, m, d);
}

/**
* 格式化日期
* @param   d the delimiter
* @param   p the pattern of your date
* @author  Xinge(修改)
*/
Date.prototype.format = function(style) {
 var o = {
   "M+" : this.getMonth() + 1, //month
   "d+" : this.getDate(),      //day
   "h+" : this.getHours(),     //hour
   "m+" : this.getMinutes(),   //minute
   "s+" : this.getSeconds(),   //second
   "w+" : "天一二三四五六".charAt(this.getDay()),   //week
   "q+" : Math.floor((this.getMonth() + 3) / 3),  //quarter
   "S"  : this.getMilliseconds() //millisecond
 }
 if(/(y+)/.test(style)) {
   style = style.replace(RegExp.$1,
   (this.getFullYear() + "").substr(4 - RegExp.$1.length));
 }
 for(var k in o){
   if(new RegExp("("+ k +")").test(style)){
     style = style.replace(RegExp.$1,
       RegExp.$1.length == 1 ? o[k] :
       ("00" + o[k]).substr(("" + o[k]).length));
   }
 }
 return style;
};

/**
* 日历类
* @param   beginYear 1990
* @param   endYear  ?
* @param   lang     ŀ(中文)|1(英语) 可自由扩充
* @param   dateFormatStyle  "yyyy-MM-dd";
* @version 2007-03-16
* @author  Xinge(修改)
* @update
*/
function Calendar(lang,beginYear,endYear,dateFormatStyle) {
 this.beginYear = 1990;
 this.endYear = 2010;
 this.lang = 0;  //0(中文) | 1(英文)
 this.dateFormatStyle = "yyyy-MM-dd";

 if (beginYear != null && endYear != null){
   this.beginYear = beginYear;
   this.endYear = endYear;
 }
 if (lang != null){
   this.lang = lang
 }

 if (dateFormatStyle != null){
   this.dateFormatStyle = dateFormatStyle
 }

 this.dateControl = null;
 this.panel = this.getElementById("calendarPanel");
 this.form  = null;

 this.date = new Date();
 this.year = this.date.getFullYear();
 this.month = this.date.getMonth();

 this.colors = {
 "cur_word"      : "#FFFFFF",  //当日日期文字颜色
 "cur_bg"        : "#00FF00",  //当日日期单元格背影色
 "sun_word"      : "#FF0000",  //星期天文字颜色
 "sat_word"      : "#0000FF",  //星期六文字颜色
 "td_word_light" : "#000000",  //单元格文字颜色
 "td_word_dark"  : "#CCCCCC",  //单元格文字暗色
 "td_bg_out"     : "#FFFFFF",  //单元格背影色
 "td_bg_over"    : "#FFCC00",  //单元格背影色
 "tr_word"       : "#FFFFFF",  //日历头文字颜色
 "tr_bg"         : "#FF6600",  //日历头背影色
 "input_border"  : "#CCCCCC",  //input控件的边框颜色
 "input_bg"      : "#EFEFEF"   //input控件的背影色
 }

 this.draw();
 this.bindYear();
 this.bindMonth();
 this.changeSelect();
 this.bindData();
}

/**
* 日历类属性(语言包,可自由扩展)
*/
Calendar.language = {
 "year"   : [[""], [""]],
 "months" : [["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
        ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]
       ],
 "weeks"  : [["日","一","二","三","四","五","六"],
        ["SUN","MON","TUR","WED","THU","FRI","SAT"]
       ],
 "clear"  : [["清空"], ["CLS"]],
 "today"  : [["今天"], ["TODAY"]],
 "close"  : [["关闭"], ["CLOSE"]]
}

Calendar.prototype.draw = function() {
 calendar = this;

 var mvAry = [];
 mvAry[mvAry.length]  = '  <form name="calendarForm" style="margin: 0px;">';
 mvAry[mvAry.length]  = '    <table width="100%" border="0" cellpadding="0" cellspacing="0">';
 mvAry[mvAry.length]  = '      <tr>';
 mvAry[mvAry.length]  = '        <th align="left" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;" name="prevMonth" type="button" id="prevMonth" value="<" /></th>';
 mvAry[mvAry.length]  = '        <th align="center" width="98%" nowrap="nowrap"><select name="calendarYear" id="calendarYear" style="font-size:12px;width:50%;"></select><select name="calendarMonth" id="calendarMonth" style="font-size:12px;width:50%;"></select></th>';
 mvAry[mvAry.length]  = '        <th align="right" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;" name="nextMonth" type="button" id="nextMonth" value=">" /></th>';
 mvAry[mvAry.length]  = '      </tr>';
 mvAry[mvAry.length]  = '    </table>';
 mvAry[mvAry.length]  = '    <table id="calendarTable" width="100%" style="border:0px solid #CCCCCC;background-color:#DDD" border="0" cellpadding="3" cellspacing="1">';
 mvAry[mvAry.length]  = '      <tr>';
 for(var i = 0; i < 7; i++) {
   mvAry[mvAry.length]  = '      <th style="font-weight:normal;background-color:' + calendar.colors["tr_bg"] + ';color:' + calendar.colors["tr_word"] + ';">' + Calendar.language["weeks"][this.lang][i] + '</th>';
 }
 mvAry[mvAry.length]  = '      </tr>';
 for(var i = 0; i < 6;i++){
   mvAry[mvAry.length]  = '    <tr align="center">';
   for(var j = 0; j < 7; j++) {
     if (j == 0){
       mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sun_word"] + ';"></td>';
     } else if(j == 6) {
       mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sat_word"] + ';"></td>';
     } else {
       mvAry[mvAry.length]  = '  <td style="cursor:default;"></td>';
     }
   }
   mvAry[mvAry.length]  = '    </tr>';
 }
 mvAry[mvAry.length]  = '      <tr style="background-color:' + calendar.colors["input_bg"] + ';">';
 mvAry[mvAry.length]  = '        <th colspan="2"><input name="calendarClear" type="button" id="calendarClear" value="' + Calendar.language["clear"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
 mvAry[mvAry.length]  = '        <th colspan="3"><input name="calendarToday" type="button" id="calendarToday" value="' + Calendar.language["today"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
 mvAry[mvAry.length]  = '        <th colspan="2"><input name="calendarClose" type="button" id="calendarClose" value="' + Calendar.language["close"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
 mvAry[mvAry.length]  = '      </tr>';
 mvAry[mvAry.length]  = '    </table>';
 mvAry[mvAry.length]  = '  </form>';
 this.panel.innerHTML = mvAry.join("");
 this.form = document.forms["calendarForm"];

 this.form.prevMonth.onclick = function () {calendar.goPrevMonth(this);}
 this.form.nextMonth.onclick = function () {calendar.goNextMonth(this);}

 this.form.calendarClear.onclick = function () {calendar.dateControl.value = "";calendar.hide();}
 this.form.calendarClose.onclick = function () {calendar.hide();}
 this.form.calendarYear.onchange = function () {calendar.update(this);}
 this.form.calendarMonth.onchange = function () {calendar.update(this);}
 this.form.calendarToday.onclick = function () {
   var today = new Date();
   calendar.date = today;
   calendar.year = today.getFullYear();
   calendar.month = today.getMonth();
   calendar.changeSelect();
   calendar.bindData();
   calendar.dateControl.value = today.format(calendar.dateFormatStyle);
   calendar.hide();
 }

}

//年份下拉框绑定数据
Calendar.prototype.bindYear = function() {
 var cy = this.form.calendarYear;
 cy.length = 0;
 for (var i = this.beginYear; i <= this.endYear; i++){
   cy.options[cy.length] = new Option(i + Calendar.language["year"][this.lang], i);
 }
}

//月份下拉框绑定数据
Calendar.prototype.bindMonth = function() {
 var cm = this.form.calendarMonth;
 cm.length = 0;
 for (var i = 0; i < 12; i++){
   cm.options[cm.length] = new Option(Calendar.language["months"][this.lang][i], i);
 }
}

//向前一月
Calendar.prototype.goPrevMonth = function(e){
 if (this.year == this.beginYear && this.month == 0){return;}
 this.month--;
 if (this.month == -1) {
   this.year--;
   this.month = 11;
 }
 this.date = new Date(this.year, this.month, 1);
 this.changeSelect();
 this.bindData();
}

//向后一月
Calendar.prototype.goNextMonth = function(e){
 if (this.year == this.endYear && this.month == 11){return;}
 this.month++;
 if (this.month == 12) {
   this.year++;
   this.month = 0;
 }
 this.date = new Date(this.year, this.month, 1);
 this.changeSelect();
 this.bindData();
}

//改变SELECT选中状态
Calendar.prototype.changeSelect = function() {
 var cy = this.form.calendarYear;
 var cm = this.form.calendarMonth;
 for (var i= 0; i < cy.length; i++){
   if (cy.options[i].value == this.date.getFullYear()){
     cy[i].selected = true;
     break;
   }
 }
 for (var i= 0; i < cm.length; i++){
   if (cm.options[i].value == this.date.getMonth()){
     cm[i].selected = true;
     break;
   }
 }
}

//更新年、月
Calendar.prototype.update = function (e){
 this.year  = e.form.calendarYear.options[e.form.calendarYear.selectedIndex].value;
 this.month = e.form.calendarMonth.options[e.form.calendarMonth.selectedIndex].value;
 this.date = new Date(this.year, this.month, 1);
 this.changeSelect();
 this.bindData();
}

//绑定数据到月视图
Calendar.prototype.bindData = function () {
 var calendar = this;
 var dateArray = this.getMonthViewArray(this.date.getYear(), this.date.getMonth());
 var tds = this.getElementById("calendarTable").getElementsByTagName("td");
 for(var i = 0; i < tds.length; i++) {
 //tds[i].style.color = calendar.colors["td_word_light"];
 tds[i].style.backgroundColor = calendar.colors["td_bg_out"];
   tds[i].onclick = function () {return;}
   tds[i].onmouseover = function () {return;}
   tds[i].onmouseout = function () {return;}
   if (i > dateArray.length - 1) break;
   tds[i].innerHTML = dateArray[i];
   if (dateArray[i] != " "){
     tds[i].onclick = function () {
       if (calendar.dateControl != null){
         calendar.dateControl.value = new Date(calendar.date.getFullYear(),
                                               calendar.date.getMonth(),
                                               this.innerHTML).format(calendar.dateFormatStyle);
       }
       calendar.hide();
     }
     tds[i].onmouseover = function () {
       this.style.backgroundColor = calendar.colors["td_bg_over"];
     }
     tds[i].onmouseout = function () {
       this.style.backgroundColor = calendar.colors["td_bg_out"];
     }
     if (new Date().format(calendar.dateFormatStyle) ==
         new Date(calendar.date.getFullYear(),
                  calendar.date.getMonth(),
                  dateArray[i]).format(calendar.dateFormatStyle)) {
       //tds[i].style.color = calendar.colors["cur_word"];
       tds[i].style.backgroundColor = calendar.colors["cur_bg"];
       tds[i].onmouseover = function () {
         this.style.backgroundColor = calendar.colors["td_bg_over"];
       }
       tds[i].onmouseout = function () {
         this.style.backgroundColor = calendar.colors["cur_bg"];
       }
     }//end if
   }
 }
}

//根据年、月得到月视图数据(数组形式)
Calendar.prototype.getMonthViewArray = function (y, m) {
 var mvArray = [];
 var dayOfFirstDay = new Date(y, m, 1).getDay();
 var daysOfMonth = new Date(y, m + 1, 0).getDate();
 for (var i = 0; i < 42; i++) {
   mvArray[i] = " ";
 }
 for (var i = 0; i < daysOfMonth; i++){
   mvArray[i + dayOfFirstDay] = i + 1;
 }
 return mvArray;
}

//扩展 document.getElementById(id) 多浏览器兼容性
Calendar.prototype.getElementById = function(id){
 if (typeof(id) != "string" || id == "") return null;
 if (document.getElementById) return document.getElementById(id);
 if (document.all) return document.all(id);
 try {return eval(id);} catch(e){ return null;}
}

//扩展 object.getElementsByTagName(tagName)
Calendar.prototype.getElementsByTagName = function(object, tagName){
 if (document.getElementsByTagName) return document.getElementsByTagName(tagName);
 if (document.all) return document.all.tags(tagName);
}

//取得HTML控件绝对位置
Calendar.prototype.getAbsPoint = function (e){
 var x = e.offsetLeft;
 var y = e.offsetTop;
 while(e = e.offsetParent){
   x += e.offsetLeft;
   y += e.offsetTop;
 }
 return {"x": x, "y": y};
}

//显示日历
Calendar.prototype.show = function (dateControl, popControl) {
 if (dateControl == null){
   throw new Error("arguments[0] is necessary")
 }
 this.dateControl = dateControl;
 if (dateControl.value.length > 0){
 this.date = new Date(dateControl.value.toDate());
 this.year = this.date.getFullYear();
 this.month = this.date.getMonth();
   this.changeSelect();
   this.bindData();
 }
 if (popControl == null){
   popControl = dateControl;
 }
 var xy = this.getAbsPoint(popControl);
 this.panel.parentNode.style.left = xy.x + "px";
 this.panel.parentNode.style.top = (xy.y + dateControl.offsetHeight) + "px";
 this.panel.parentNode.style.visibility = "visible";
}

//隐藏日历
Calendar.prototype.hide = function() {
 this.panel.parentNode.style.visibility = "hidden";
}

var html = '<div style="\
  position:absolute;visibility:hidden;z-index:9999;background-color:#fff;border:2px solid #ccc;width:225px;font-size:12px;\
  "><iframe style="position:absolute;width:100%;height:199px;z-index:-1;border:none"></iframe>\
  <div id="calendarPanel"></div>\
  </div>';
document.write(html);

</SCRIPT>
</HEAD>
<BODY>
<!--
//英文:
new Calendar(1).show(this)
-->
<INPUT class=textbox onclick="new Calendar(0).show(this)" 
readOnly size="23" value="2007-03-16" name=postTime>
</BODY>
</HTML>

Javascript 相关文章推荐
用JavaScript隐藏控件的方法
Sep 21 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
原生js事件的添加和删除的封装
Jul 01 Javascript
简介JavaScript中strike()方法的使用
Jun 08 Javascript
JQuery实现超链接鼠标提示效果的方法
Jun 10 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
jQuery实现获取元素索引值index的方法
Sep 18 Javascript
JavaScript 详解预编译原理
Jan 22 Javascript
浅谈Vuejs Prop基本用法
Aug 17 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
Oct 19 jQuery
vue-cli项目代理proxyTable配置exclude的方法
Sep 20 Javascript
基于JavaScript实现简单的轮播图
Mar 03 Javascript
学习jquery之一
Apr 27 #Javascript
JavaScript与函数式编程解释
Apr 27 #Javascript
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 #Javascript
从sohu弄下来的flash中展示图片的代码
Apr 27 #Javascript
pjblog中的UBBCode.js
Apr 25 #Javascript
用javascript实现的仿Flash广告图片轮换效果
Apr 24 #Javascript
疯掉了,尽然有js写的操作系统
Apr 23 #Javascript
You might like
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP 无限级分类
2017/05/04 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
PHP7变量处理机制修改
2021/03/09 PHP
jQuery 操作XML入门
2008/12/25 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
Python抽象类的新写法
2015/06/18 Python
python sort、sort_index方法代码实例
2019/03/28 Python
python日期相关操作实例小结
2019/06/24 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
国际象棋商店:The Chess Store
2018/07/09 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
发展部经理职责规定
2014/02/22 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
python 离散点图画法的实现
2022/04/01 Python