javascript日历插件

javascript日历插件
原文:javascript日历插件

javascript日历插件

      最近在尝试着写javascript日历插件,所以也到github上看国外人日历源码,或者国内人写的好点的,也在研究点,虽然看到网上有一大把的日历控件,但是没有几个是自己想要的,虽然效果是实现了,但是看他们的源码,头有点大,所以自己也在研究这方面的东西。周末用了2天来研究别人写的代码 自己也试着做做demo,今天正好基本功能完成了,所以趁着这个机会分享下:我们可以先来看看效果:JSFiddler地址如下:

demo链接请点击我

基本的配置如下:

   targetCls
'',    输入框dom节点 默认为空 必填项
 beginyear1978,     开始年份
 endyear 2050,    结束年份
 date new Date(),  默认日期
 type "yyyy-mm-dd" ,      日期格式(目前只支持这一种)
separator '-' ,             日期链接符
wday 0 ,             周的第一天
language

{
year:"年",
month:"月",
monthList:["1","2","3","4","5","6","7","8","9","10","11","12"],
weekList:["日","一","二","三","四","五","六"]} // 默认为中文


方法如下:

 1. show():  显示日历面板。

 2. hide(): 隐藏日历面板。

 3. clear() 清除输入框的日期。

 4. getValue() 获取当前选中的日期。

 5. 提供callback回调。返回一个参数(每当点击一项时候 返回输入框的值 即:日历的值)。

所有的JS代码如下:

/*** javascript日历控件*/function Calendar(options,callback){var self = this;self.options = $.extend({},defaults,options || {});self.targetCls = $(self.options.targetCls);if(self.targetCls.length < 1) {return;}self.language = self.options.language;self.flag = false;self.callback = callback;self._init();self._bindEnv();};$.extend(Calendar.prototype,{_init: function(){var self = this;// 先渲染日历面板
        self._renderCalendarPanel();},_renderCalendarPanel: function(){var self = this,options = self.options;// 如果input输入框有日期的话 if(self.targetCls.val().length > 0) {self.date = self._dateParse(self.targetCls.val());}self.date = new Date(self.date);if(isNaN(self.date.getFullYear())){self.date = new Date();}var defYear = self.date.getFullYear(),defMonth = self.date.getMonth() + 1,defDay = self.date.getDate();// 定义每月的天数self.month_day = new Array(31,28+self._leapYear(defYear),31,30,31,30,31,31,30,31,30,31);// 定义每周的日期self.date_name_week = self.language.weekList;// 定义周末var saturday = 6 - options.wdays,sunday = (7-options.wdays >= 7) ? 0 : (7-options.wday);// 创建日历面板dom节点var date_pane = $('<div class="cxcalendar"></div>'),date_hd = $('<div class="date_hd"></div>').appendTo(date_pane),date_table = $('<table class="date_table"></table>').appendTo(date_pane);date_hd.html("<a class='date_pre' href='javascript://' rel='prev'>&lt;</a><a class='date_next' href='javascript://' rel='next'>&gt;</a>");var date_txt = $('<div class="date_txt"></div>').appendTo(date_hd),date_set = $('<div class="date_set"></div>').appendTo(date_hd),html = "";for(var i = options.beginyear; i < options.endyear; i++) {html +="<option value='"+i+"'>"+i+"</option>";}var year_list = $('<select class="year_set"></select>').html(html).appendTo(date_set).val(defYear);date_set.append(" - ");html = '';for(var i = 0; i < 12; i++) {html += '<option value="'+(i+1)+'">'+self.language.monthList[i]+'</option>';}var month_list = $('<select class="month_set"></select>').html(html).appendTo(date_set).val(defMonth);html = '<thead><tr>';// 遍历一周7天for(var i = 0; i < 7; i++) {html += "<th class='"// 周末高亮if(i == saturday) {html+= " sat";}else if(i == sunday) {html+= " sun";};html+="'>";html+= (i+options.wday * 1 < 7) ? self.date_name_week[i+options.wday] : self.date_name_week[i+options.wday - 7];html+="</th>";};html +="</tr></thead>";html +="<tbody></tbody>";date_table.html(html);// 面板及背景遮挡层插入到页面中date_pane.appendTo("body");// 创建遮罩层的目地是:只显示一个日历面板var block_bg=$("<div class='cxcalendar_lock'></div>").appendTo("body");// 赋值 全局self.dateTxt = date_txt;self.yearList = year_list;self.monthList = month_list;self.dateTable = date_table;self.saturday = saturday;self.sunday = sunday;self.datePane = date_pane;self.blockBg = block_bg;self.dateSet = date_set;self.defYear = defYear;self.defMonth = defMonth;// 根据年份 月份来渲染天
        self._renderBody(defYear,defMonth);},_dayNumOfMonth: function(Year,Month){var d = new Date(Year,Month,0);return d.getDate();},/** 渲染日历天数* @param {y,m} 年 月*/_renderBody: function(y,m){var self = this;var options = self.options;if(m < 1) {y--;m = 12;}else if(m > 12) {y++;m = 1;}var tempM = m,cur_m = m;m--;  // 月份从0开始的var prevMonth = tempM - 1,  //上个月的月份prevDay = self._dayNumOfMonth(y,tempM - 1), // 上个月的天数nextMonth = tempM + 1,   // 下个月的月份nextDay = self._dayNumOfMonth(y,tempM + 1),  //下个月的天数curDay = self._dayNumOfMonth(y,tempM);       // 当前月份的天数
self.month_day[1]=28+self._leapYear(y);  //闰年的话 29天 否则 28天var temp_html = "",temp_date = new Date(y,m,1);var now_date = new Date();now_date.setHours(0);now_date.setMinutes(0);now_date.setSeconds(0);// 如果输入框有值的话if(self.targetCls.val().length > 0) {var val_date=self._dateParse(self.targetCls.val())}val_date=new Date(val_date);if(isNaN(val_date.getFullYear())){val_date=null;};// 获取当月的第一天var firstDay = temp_date.getDay() - options.wday < 0 ? temp_date.getDay() - options.wday + 7 : temp_date.getDay() - options.wday;// 每月所需要的行数var monthRows = Math.ceil((firstDay+self.month_day[m]) / 7);var td_num,day_num,diff_now,diff_set;var disabled;for(var i= 0; i < monthRows; i++) {temp_html += "<tr>";for(var j = 0; j < 7; j++) {td_num=i*7+j;day_num=td_num-firstDay+1;if(day_num<=0) {if(day_num == 0) {day_num = prevDay - day_numtext_m = prevMonth}else {day_num = prevDay + day_num;text_m = prevMonth}}else if(day_num > self.month_day[m]){day_num = day_num - curDay;text_m = nextMonth}else {text_m     = cur_m;}temp_html+="<td";if(typeof(day_num) == 'number') {diff_now=null;diff_set=null;temp_date = new Date(y,m,day_num);if(text_m == cur_m) {diff_now=Date.parse(now_date)-Date.parse(temp_date);diff_set=Date.parse(val_date)-Date.parse(temp_date);}if(cur_m > text_m || cur_m < text_m) {disabled = 'disabled';}else {disabled = "";}temp_html+=(" title='"+y+options.separator+tempM+options.separator+day_num+"' class='num "+disabled+"");// 高亮周末、今天、选中if(diff_set==0){    //选中的时候 增加select 类名temp_html+=" selected";}else if(diff_now==0){temp_html+=" now";   // 当前时间增加now类名}else if(j==self.saturday){temp_html+=" sat";   // 周六增加sat类名}else if(j==self.sunday){temp_html+=" sun";   // 周日增加sun类名
                    };temp_html+=("'");};temp_html+=(" data-day='"+day_num+"'>"+day_num+"</td>");}temp_html+="</tr>";}$(self.dateTable).find("tbody").html(temp_html);$(self.dateTxt).html("<span class='y'>"+y+"</span>"+options.language.year+"<span class='m'>"+options.language.monthList[m]+"</span>"+options.language.month);$(self.yearList).val(y);$(self.monthList).val(m+1);return this;},_dateParse: function(date){var newdate = date;newdate=newdate.replace(/\./g,"/");newdate=newdate.replace(/-/g,"/");newdate=newdate.replace(/\//g,"/");newdate=Date.parse(newdate);return newdate;},/** 判断是否是闰年* @param y 年份* 1.能被4整除且不能被100整除 2.能被100整除且能被400整除*/_leapYear: function(y) {return ((y%4==0 && y%100!=0) || y%400==0) ? 1 : 0;},_bindEnv: function(){var self = this;$(self.targetCls).unbind('click').bind('click',function(){self.show();});// 关闭面板事件self.blockBg.unbind('click').bind("click",function(){self.hide();});// 点击上一页 下一页事件self.datePane.delegate('a','click',function(){if(!this.rel){return};var _rel = this.rel;if(_rel == 'prev') {self._renderBody(self.yearList.val(),parseInt(self.monthList.val(),10) -1);    return;}else if(_rel == 'next') {self._renderBody(self.yearList.val(),parseInt(self.monthList.val(),10) +1);return;}});// 选择日期事件self.datePane.delegate('td','click',function(){var _this = $(this);if(_this.hasClass('num') && !_this.hasClass('disabled')) {self.dateTable.find("td").removeClass("selected");_this.addClass("selected");var day = _this.attr("data-day");self._selectDay(day);}});// 显示年月选择self.dateTxt.unbind('click').bind("click",function(){self.dateTxt.hide();self.dateSet.show();});//更改年月事件self.yearList.unbind('change').bind("change",function(){self._renderBody(self.yearList.val(),self.monthList.val());});self.monthList.unbind('change').bind("change",function(){self._renderBody(self.yearList.val(),self.monthList.val());});},/* * 选择某一天的时候 把值存入输入框里 且面板隐藏* @_selectDay {private}*/_selectDay: function(d) {var self = this;var year,month;month = self.monthList.val();day = d;var options = self.options;if(options.type == 'yyyy-mm-dd') {month="0" + self.monthList.val();day= "0" + d;month=month.substr((month.length-2),month.length);day=day.substr((day.length-2),day.length);}self.targetCls.val(self.yearList.val()+options.separator+month+options.separator+day);self.hide();self.callback && $.isFunction(self.callback) && self.callback(self.yearList.val()+options.separator+month+options.separator+day);return this;},/** 显示日历面板* @method  show {public}*/show: function(){var self = this;if(self.flag) {return;}var doc_w = document.body.clientWidth,doc_h = document.body.clientHeight,pane_top = self.targetCls.offset().top,pane_left = self.targetCls.offset().left,obj_w = self.targetCls.outerWidth(),obj_h = self.targetCls.outerHeight();pane_top= pane_top+obj_h;self.datePane.css({"top":pane_top,"left":pane_left}).show();self.blockBg.css({width:doc_w,height:doc_h}).show();self.flag = true;return this;},/** 清除日期* @method clear {public}*/clear: function(){var self = this;self.targetCls.val('');self._renderBody(self.defYear,self.defMonth);self.hide();return this;},/** 获取当前选中的日期* @method getValue {public}* @return val*/getValue: function(){var self = this;return self.targetCls.val();},/** 隐藏日历面板*/hide: function(){var self = this;if(!self.flag) {return;}self.datePane.hide();self.blockBg.hide();self.dateSet.hide();self.dateTxt.show();self.flag = false;return this;}});var defaults = {targetCls        :        '',             //渲染日历的classbeginyear        :        1978,           //开始年份endyear          :        2050,           //结束年份date             :        new Date(),     // 默认日期type             :        "yyyy-mm-dd",      // 日期格式separator        :        "-",              // 日期链接符wday             :        0,              // 周第一天
    language         :       {year:"年",month:"月",monthList:["1","2","3","4","5","6","7","8","9","10","11","12"],weekList:["日","一","二","三","四","五","六"]}};

代码没有什么好解释的 相应的有注释,可以看看源码 不难的。

HTML代码可以这样写:

我是时间控件1:<input name="mydate" type="text" class="input_cxcalendar" readonly style="width:200px;">

初始化代码如下:

$('.input_cxcalendar').each(function(){var a = new Calendar({targetCls: $(this)},function(val){console.log(val);});
});

日历控件demo下载

posted on 2014-07-08 18:08 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3832024.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea 重启

1、通过File–>Invalidate Caches/Restar...进入重启窗口 2、选择自己所需要的重启方式&#xff0c;四个按钮&#xff0c;一共三种重启方式&#xff1a; Invalidate and Restart 清空缓存并重启。Invalidate 清除缓存&#xff0c;下次打开重启。Cancel 取消。Just Restart …

Kernel Page Global Directory (PGD) of Page table of Process created in Linux Kernel

Kernel Page Global Directory (PGD) of User process created 在早期版本: 在fork一个进程的时候&#xff0c;必须建立进程自己的内核页目录项&#xff08;内核页目录项要与用户空间的页目录放在同一个物理地址连续的页面上&#xff0c;所以不能共享&#xff0c;但所有进程的内…

POI 导出文件以文件流形式返回

POI工具类 import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import o…

Json串和java对象进行转时

json-lib-xxx.jarezmorph-xxx.jar //>依赖包 JsonConfig config new JsonConfig();//有选择性的过滤掉一些属性值 JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher(new String[] { "yyyy-MM-dd" }));//注册一个json转为java.util.date的日期格…

Mybatis Integer类型参数值为0时判断为空、空字符串不通过

根据状态查询是&#xff0c;由于status是Integer类型&#xff0c;所以当前状态为0时&#xff0c;变成了查询了所有的状态信息。 <if test"requestParam.status ! null and requestParam.status ! ">and s.status #{requestParam.status} </if> 原因&a…

BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏(搜索)

这道直接遍历一遍求出每个点的子节点数目就行了 CODE&#xff1a;#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;#define maxn 50010int b[maxn],q[maxn],id[maxn],ans[maxn];bool cmp(int x,int y){re…

Fast Matrix Operations

uva11992:http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem3143 题意&#xff1a;给你n*m的矩阵初始化的时候矩阵里面的元素全部是0&#xff0c;对于这个矩阵有3中操作。 1 x1 y1 x2 y2 v 把&#xff08;x1 y1 x2…

linux ll命令无效

1.编辑~/.bashc vim ~/.bashc 若vi/vim命令无效&#xff0c;参考 bash: vi: command not found/bash: vim: command not found 2.重新执行刚修改的初始化文件 source ~/.bashc

jquery不同版本冲突导致低版本功能不能用

oConflict() 方法让渡变量 $ 的 jQuery 控制权。 该方法释放 jQuery 对 $ 变量的控制。 使用方法&#xff1a; var jq $.noConflict();//转换控制权 jq(document).ready(function () { jq("#outside").click(function () {你的操作...... }); }); });转载于:https:/…

struts2+jquery 实现ajax登陆

一、新建一个web项目&#xff1a;test,配置好struts2的环境(详细配置见&#xff1a;http://www.cnblogs.com/wuweidu/p/3841297.html) 导入Jquery的js文件到项目 二、在com.action包下&#xff0c;新建一个loginAction.java loginAction.java的代码如下 package com.action;imp…

hdu 2026 首字母变大写

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid2026 题目大意&#xff1a;将一个英文句子&#xff0c;每个单词第一个首字母变大写。 1 #include <stdio.h>2 int main (void)3 {4 int i;5 char ch[100];6 while(gets(ch))7 {8 for (i0; c…

Docker Kafka 单机版安装

一、安装 下载library/zookeeper并运行 docker run --name zookeeper -d -p 2181:2181 -v /etc/localtime:/etc/localtime library/zookeeper 测试zookeeper端口是否通wget IP:2181 下载wurstmeister/kafka并运行 docker run -d --name kafka -p 9092:9092 --link zookeeper…

HDU1429胜利大逃亡(续)HDU 1885 Key Task BFS+状态压缩+水

HDU1429 只有10把钥匙 1<<10足够了 标记用三维数组 用Linux好不习惯 继续克服&#xff5e; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include &l…

Docker 安装nginx,并挂载文件

创建挂载所需目录&#xff1a; mkdir /test/server/nginx/{conf,logs,html,conf.d} /test/server/nginx/conf创建nginx.conf文件&#xff0c;并编辑: user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {wor…

http解码-5

http://www.freebuf.com/articles/web/18084.html (1) 在 前端安全技术中常见的编码绕过技术利用的就是不同系统间的编码位宽(addslashes()楼哦的那个)&#xff0c;不同编码的解码顺序(htmlParserjavascriptParser的解码顺序)&#xff0c;不同的解码规则(unicode->ascii转换…

IllegalArgumentException:argument type mismatch

Exception nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property id of class com.wzq.test.demo.entity.Fee with value 1211518556674199553Cause:java.lang.IllegalArgumentException: argument type mismatch 场景: 添加不传ID使…

hadoop家族的各个成员

这篇文章不提原理&#xff0c;讲讲hadoop及其周边项目的作用。 hadoop这个词已经流行好多年了&#xff0c;一提到大数据就会想到hadoop&#xff0c;那么hadoop的作用是什么呢&#xff1f; 官方定义&#xff1a;hadoop是一个开发和执行处理大规模数据的软件平台。核心词语是平台…

ArrayList 源码分析

介绍 ArrayList 是一个数组队列&#xff0c;相当于 动态数组。与Java中的数组相比&#xff0c;它的容量能动态增长。 结构 ArrayList继承于AbstractList&#xff0c;实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。如下图&#xff1a; public class Arra…

Poj 1556 The Doors 计算几何+最短路

其实本题非常的无脑&#xff0c;无脑拍完1A&#xff0c;写到blog里只因为TM无脑拍也拍了很久啊 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostr…

String equals()方法 源码分析

public boolean equals(Object anObject) {// :比较的引用类型&#xff0c;比较的是地址值是否相同if (this anObject) { //地址值相等&#xff0c;返回truereturn true;}// instanceOf判断一个对象是不是某个类型的实例if (anObject instanceof String) {String anotherStrin…