`
xxlovewei
  • 浏览: 11747 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JS编写的中英文日期选择控件

阅读更多

body中的input 执行onclick="new Calendar(0).show(this)" 则为中文日期,

执行onclick="new Calendar(1).show(this)" 则为英文日期。

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<HTML>
<HEAD>
<TITLE>日期选择器</TITLE>
<SCRIPT type="text/javascript">
/**
 * 返回日期
 * @param d the delimiter
 * @param p the pattern of your date
 * @author  
 */
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="&lt;" /></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="&gt;" /></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] != "&nbsp;"){
      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] = "&nbsp;";
  }
  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>
<!--
//英文:
<INPUT class=textbox onclick="new Calendar(1).show(this)" 
readOnly size="23" value="2007-03-16" name=postTime>
-->
<INPUT class=textbox onclick="new Calendar(0).show(this)" 
readOnly size="23" value="2007-03-16" name=postTime>
</BODY>
</HTML>

 

分享到:
评论
1 楼 xxlovewei 2010-12-08  
处女帖,自己来支持一下

相关推荐

    时间日期选择器(包含中英文)

    "时间日期选择器(包含中英文)"这个主题主要涉及到如何实现一个既支持中文又支持英文的多语言日期时间选择器,并且它与一篇名为《日期时间选择器(开始时间-结束时间)》的博文紧密关联,这可能意味着该选择器还...

    js 中文日期控件

    本次讨论的“js 中文日期控件”就是通过纯JavaScript编写的日期选择插件,它不仅可以方便地显示和选择日期,而且还可以轻松切换为英文界面,适应不同的使用场景。 ### 二、主要功能与特点 1. **日期展示与选择**:...

    实用的前端日历时间日期选择控件.zip

    在前端开发中,日历时间日期选择控件是不可或缺的一部分,尤其在构建用户友好的交互界面时。"实用的前端日历时间日期选择控件.zip" 提供的是一款功能丰富的插件,它能够帮助开发者轻松地实现日期和时间的选择功能。...

    JavaScript经典日期控件

    JavaScript经典日期控件,如标题所述,是一种基于JavaScript编写的用于网页交互的日期选择组件,它使得用户在网页上能够方便地选取日期。这个控件的版本为My97DatePicker3.0.1,通常这类控件会提供丰富的功能和良好...

    js 虚拟键盘 支持中英文切换 高灵敏度

    标题中的“支持中英文切换”意味着这款虚拟键盘具备了输入中文和英文字符的功能,这对于多语言网站或者需要输入中文的Web应用来说非常实用。高灵敏度则是指键盘在响应用户输入时具有良好的性能,能够快速准确地识别...

    多种日历表、时间日期选择插件

    在IT领域,尤其是在Web开发中,用户界面常常需要与日期和时间进行交互,这就催生了各种日历表和时间日期选择插件的诞生。本文将详细介绍一款源自国站的jQuery时间日期插件,该插件功能强大且使用简便,能够满足多种...

    日历控件(html\css\javascript编写)

    JavaScript还可以处理日期逻辑,如切换月份、检查日期的有效性、中英文切换等功能。例如,当用户点击输入框,JavaScript可以创建或更新一个DOM元素来显示日历。同时,JavaScript还可以处理语言切换,通过更改日期...

    一个Vue2日期范围选择控件

    Vue2日期范围选择控件是基于JavaScript框架Vue.js的一个组件,专门用于在用户界面中实现日期范围的选择功能。Vue.js,由尤雨溪创建,是一个轻量级且强大的前端JavaScript库,它允许开发者构建可复用、可维护的组件,...

    My97DatePicker js的时间日期控件

    My97DatePicker是一款广泛应用于Web开发中的JavaScript时间日期选择插件,它为用户提供了便捷的日期选择界面,极大地提高了用户体验。这款控件以其强大的功能、灵活的配置选项以及良好的兼容性,深受开发者喜爱。 ...

    extjs3.0 日期时间控件

    标题中的"extjs3.0 日期时间控件"指的是ExtJS 3.0框架中的DateTimeField组件,这是一个组合了日期选择器和时间选择器的控件,允许用户以交互的方式选择精确的日期和时间。这个控件通常用于表单中,提供了一种直观且...

    兼容火狐浏览器的js中文日历控件

    这个中文日历控件是用JavaScript编写的,可以在网页上动态生成一个日历界面,用户可以点击选择日期,而无需离开当前页面。 在描述中提到的“javascript的中文日历控件”强调了该控件不仅支持英文,还支持中文显示,...

    My97时间日期控件

    My97时间日期控件是一款高效且用户友好的前端组件,专为网页设计者和开发者提供方便的时间日期选择功能。这个控件由JavaScript编写,它允许用户在输入文本框时直接触发一个弹出对话框,展示日期和时间的选择界面。...

    My97DatePicker日期选择器

    My97DatePicker是一款广泛应用于Web开发中的JavaScript日期选择器插件。它以其高效、易用、功能强大而受到开发者们的青睐。这款插件允许用户在网页上方便地选择日期,提高了用户界面的交互性和用户体验。下面我们将...

    jquery+javascript编写国籍控件

    本文将探讨如何利用jQuery和JavaScript编写一个功能完备的国籍控件。 首先,让我们来了解控件的主要组成部分。国籍控件的核心是两个主要文件:navtionality.js和main.css。navtionality.js负责构建国籍控件的DOM...

    微软国际化中英文插件.zip

    总的来说,微软国际化中英文插件是一个利用JavaScript技术实现的、基于云服务的跨语言沟通工具,它结合了现代机器翻译的先进算法,以及Web技术的便利性,为全球用户提供了一个高效的翻译解决方案。无论是开发者在...

    中英文网站系统

    总结来说,“中英文网站系统”的构建涵盖了多语言处理、框架选择、数据库设计、国际化和本地化策略、前端开发、性能优化以及测试等多个方面的知识点,这些都是构建高质量、跨语言网站不可或缺的技术要点。

    代码高亮显示javascript插件

    "代码高亮显示JavaScript插件"是专门用于在Web页面中美化和突出显示JavaScript代码的工具,它能够将原始的黑白文本代码转换为具有不同颜色、字体和样式的视觉盛宴。本文将深入探讨这一主题,详细介绍JavaScript代码...

    网页中实用的中英文日历网页特效代码.rar

    在"网页中实用的中英文日历网页特效代码.rar"这个压缩包中,很可能包含了一个可以快速集成到网页中的日历插件或者代码示例。 JavaScript是一种轻量级的、解释型的编程语言,常用于浏览器端的脚本编写,用于实现网页...

    javascript日历控件

    - 日历控件是JavaScript中的一种UI元素,通过DOM操作来展示和管理日期选择。 2. **控件设计与实现** - 日历控件通常由HTML结构、CSS样式和JavaScript逻辑三部分组成。HTML提供基本布局,CSS美化界面,JS处理交互...

    无刷新效果js日历控件

    总的来说,"My97 DatePicker"是一个强大而灵活的JavaScript日历插件,其无刷新效果、美观界面和丰富的功能特性,使其成为网页开发中日期选择功能的理想选择。对于想要提升用户体验并希望代码开放透明的开发者来说,...

Global site tag (gtag.js) - Google Analytics