基于之前上篇博客轻量级jquery,tool.js和base.js。自定义开发的base_datePicker插件,效果类似于jquery_ui的datePicker插件

//基于Base.js以及tool.js做的日历插件
$().extend('datePicker', function() {
//生成日历插件
var $yearSpan;
var $monthSpan;
var tds;
var $prevBtn;
var $nextBtn;
var $lastTr;
var $datePicker;
for (var i = , len = this.elements.length; i < len; i++) {
var curElem = this.elements[i];
$(curElem).focus(function() {
$this = $(this);
if (!this.datePicker) {
var top = $this.top() + $this.height();
var left = $this.left();
this.datePicker = createDatePicker(top, left);
$(this.datePicker).insertAfter(this);
$datePicker = $(this.datePicker);
$yearSpan = $('.myDatePicker .year');
$monthSpan = $('.myDatePicker .month');
$prevBtn = $('.myDatePicker .title .l');
$nextBtn = $('.myDatePicker .title .r');
tds = $('.myDatePicker').getElem().getElementsByTagName('td');
//为上一月下一月的按钮添加点击事件
addEventForBtn();
//为表格的单元格添加点击事件
addEventForTds(curElem);
//在页面除日期输入框的任何地方点击,日历控件消失
addEventForDocument(curElem);
}
$datePicker.show();
var nowDate = new Date();
refreshDate(nowDate.getFullYear(), nowDate.getMonth() + );
//将当前的日期标注为红色
showColor(); });
$(curElem).blur(function() {
if (this.datePicker) {
// $(this.datePicker).hide();
}
});
} function createDatePicker(top, left) {
var oDiv = document.createElement('div');
oDiv.style.position = 'absolute';
oDiv.style.top = top;
oDiv.style.left = left;
oDiv.className = 'myDatePicker';
var titleDiv = document.createElement('div');
titleDiv.className = 'title';
titleDiv.innerHTML = '<span class="l"><</span> <span class = "year"></span>年<span class="month"></span > 月 <span class = "r" >> </span>';
oDiv.appendChild(titleDiv);
var dateTable = document.createElement('table');
//生成表头的星期
var dayArr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
var thead = document.createElement('thead');
thead.insertRow();
for (var i = , len = dayArr.length; i < len; i++) {
var th = document.createElement('th');
th.innerHTML = dayArr[i];
if (i == || i == ) {
th.className = 'red';
}
thead.rows[].appendChild(th);
}
oDiv.appendChild(thead);
//生成表格主体,6行七列
var tbody = document.createElement('tbody');
for (var i = ; i < ; i++) {
tbody.insertRow(i);
for (j = ; j < ; j++) {
tbody.rows[i].insertCell(j);
}
}
oDiv.appendChild(tbody);
//刷新数据 return oDiv;
} function isLeapYear(year) {
if (year % == ) {
return true;
}
if (year % == && year % != ) {
return true;
}
return false;
} function getDayNum(year, month) {
var dayNum = ;
if (month == || month == || month == || month == || month == || month == || month == ) {
dayNum = ;
} else
if (month == && isLeapYear(year)) {
dayNum = ;
} else if (month == ) {
dayNum = ;
}
return dayNum;
}
//根据年份和月份更新日历
function refreshDate(year, month) {
$yearSpan.html(year);
$monthSpan.html(month);
//生成日期数据
var curDate = new Date();
curDate.setFullYear(year);
curDate.setMonth(month - );
curDate.setDate();
//当前的日历数据
//getDay():0代表周日,1代表周一,...以此类推
var xingqi = curDate.getDay();
var index = xingqi - ;
if (xingqi == ) {
index = ;
}
var dayNum = getDayNum(year, month);
//首先将所有的td清空
for (var i = ; i < tds.length; i++) {
tds[i].style.display = '';
tds[i].className = '';
tds[i].innerHTML = '';
} //需要知道当月的天数
var ri = ;
for (var i = index; i < index + dayNum; i++) {
tds[i].innerHTML = ri;
ri++;
}
//如果最后以行没有显示,则隐藏该行
var hasContent = false;
for (var len = tds.length - , i = len; i > len - ; i--) {
if (tds[i].innerHTML) {
hasContent = true;
break;
}
}
if (!hasContent) {
for (var len = tds.length - , i = len; i > len - ; i--) {
tds[i].style.display = 'none';
}
}
}
//将当前的日期标注为红色
function showColor() {
var curYear = $yearSpan.html();
var curMonth = $monthSpan.html();
var nowDate = new Date();
if (!(nowDate.getFullYear() == curYear && nowDate.getMonth() == (curMonth - ))) {
return;
}
for (var i = ; i < tds.length; i++) {
if (tds[i].innerHTML == nowDate.getDate()) {
tds[i].className = 'red';
return;
}
}
}
//为向左向右的按钮添加点击事件
function addEventForBtn() {
$prevBtn.click(function() {
var showYear = parseInt($yearSpan.html());
var showMonth = parseInt($monthSpan.html());
var prevMonth = showMonth - ;
var prevYear = showYear;
if (showMonth == ) {
prevMonth = ;
prevYear = showYear - ;
}
refreshDate(prevYear, prevMonth);
showColor();
});
$nextBtn.click(function() {
var showYear = parseInt($yearSpan.html());
var showMonth = parseInt($monthSpan.html());
var nextYear = showYear;
var nextMonth = showMonth + ;
if (showMonth == ) {
nextMonth = ;
nextYear = showYear + ;
}
refreshDate(nextYear, nextMonth);
showColor();
});
} function addEventForTds(curElem) {
for (var i = ; i < tds.length; i++) {
$(tds[i]).click(function() {
if (this.innerHTML) {
var showYear = $yearSpan.html();
var showMonth = $monthSpan.html();
var showDate = this.innerHTML;
curElem.value = showYear + '-' + showMonth + '-' + showDate;
$datePicker.hide();
}
});
}
} function addEventForDocument(curElem) {
$(document).click(function(e) {
if(e.target!=curElem){
if ($datePicker && $datePicker.isVisible()) {
$datePicker.hide();
}
} }); }
});

依赖的css文件,myDatePicker.css

.myDatePicker{
width:260px;
margin-top:5px;
}
.myDatePicker th,
td {
padding:5px;
border: 1px solid #ccc;
text-align: center;
vertical-align: middle;
font-size:10px; }
.myDatePicker td{
cursor:pointer;
} .myDatePicker .title {
background: #;
height: 30px;
line-height: 30px;
color: #fff;
padding: 10px;
text-align: center;
overflow: hidden;
font-size:14px;
letter-spacing: 1px;
font-weight: ;
}
.myDatePicker table{
border-collapse:collapse;
border-spacing: ; }
.myDatePicker .l{
float:left;
cursor:pointer;
}
.myDatePicker .r{
float:right;
cursor: pointer;
}
.myDatePicker .red{
color:red;
}
.myDatePicker .blue{
color:blue;
}

用法示例

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>测试页面</title>
<link rel="stylesheet" href="./usualEffects/css/myDatePicker.css">
</head> <body>
<input type="text" id="myDatePicker">
<!--
<div class="myDatePicker">
<div class="title">
<span class="l"><</span>
<span class="c"><span class="year"></span>年<span class="month"></span>月</span>
<span class="r">></span>
</div>
<table>
<thead>
<tr>
<th>周一</th>
<th>周二</th>
<th>周三</th>
<th>周四</th>
<th>周五</th>
<th class="red">周六</th>
<th class="red">周日</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</div>
-->
<script src="./commonJs/tool.js"></script>
<script src="./commonJs/base.js"></script>
<script src="./commonJs/base_datePicker.js"></script>
<script>
$('#myDatePicker').datePicker();
</script>
</body> </html>

自定义日历控件使用方法示例

javascript实例学习之六—自定义日历控件的更多相关文章

  1. Android自定义日历控件(继承系统控件实现)

    Android自定义日历控件(继承系统控件实现) 主要步骤 编写布局 继承LinearLayout设置子控件 设置数据 继承TextView实现有圆圈背景的TextView 添加Attribute 添 ...

  2. IOS自定义日历控件的简单实现(附思想及过程)

    因为程序要求要插入一个日历控件,该空间的要求是从当天开始及以后的六个月内的日历,上网查资料基本上都说只要获取两个条件(当月第一天周几和本月一共有多少天)就可以实现一个简单的日历,剩下的靠自己的简单逻辑 ...

  3. android 自定义日历控件

    日历控件View: /** * 日历控件 功能:获得点选的日期区间 * */ public class CalendarView extends View implements View.OnTouc ...

  4. iOS开发之自定义日历控件

    前言 日常开发中经常会遇到日期选择,为了方便使用,简单封装了一个日历控件,在此抛砖引玉供大家参考. 效果 功能 支持单选.区间 支持默认选中日期 支持限制月份 支持过去.当前.未来模式 支持frame ...

  5. Android 一个日历控件的实现代码

    转载  2017-05-19   作者:Othershe   我要评论 本篇文章主要介绍了Android 一个日历控件的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看 ...

  6. 【转】【WebDriver】不可编辑域和日历控件域的输入 javascript

    http://blog.csdn.net/fudax/article/details/8089404 今天用到日历控件,用第一个javascript执行后页面上的日期控件后,在html中可以看到生效日 ...

  7. javascript日历控件——纯javascript版

    平时只有下班时间能code,闲来写了个纯javascript版.引用该calendar.js文件,然后给要设置成日历控件的input的id设置成calendar,该input就会变成日历控件. < ...

  8. javascript日历控件

    以前要用到日历控件都是直接从网上下载一套源码来使用,心里一直有个梗,就是想自己动手写一个日历控件,最近刚好来了兴趣,时间上也允许,于是自己摸索写了一个,功能还算完善,界面就凑合了.可能最值得说的一点就 ...

  9. 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”

    接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...

随机推荐

  1. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [7] APP 错误日志接口

    APP 上线以后可能遇到的问题: ① APP 强退 ② 数据加载失败 ③ APP 潜在问题 错误日志需要记录的内容 数据表 error_log 字段: id app_id:app 类别 id did: ...

  2. tomcat bug之部署应用的时候经常会发上startup failed due to previous errors

    在tomcat上部署应用的时候经常会发上startup failed due to previous errors错误.这个错误产生以后经常会让人摸不到头脑.以下是几点查找经验: 1.web.xml文 ...

  3. STM32全球唯一ID读取方法

    产品唯一的身份标识非常适合:● 用来作为序列号(例如USB字符序列号或者其他的终端应用)● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性.● 用来激 ...

  4. memcached学习笔记6--浅谈memcached的机制 以及 memcached细节讨论

    附:请浅谈memcached的机制 答: ①基于C/S架构,协议比较简单 c/s架构,此时memcached为服务器端,我们可以使用如PHP,c++/c等程序连接memcached服务器. memca ...

  5. php javascript C 变量环境 块级作用域

    <?php $w = 'w'; $wb = '123'.$w; $w = 'ww'; echo $wb; if(TRUE){ $wd = '123wd'; } echo $wd; if(FALS ...

  6. PowerDesigner连接MySQL,建立逆向工程图解

    传说中,程序员们喜欢用powerDesign进行数据库建模.通常都是先设计出物理模型图,在转换出数据库需要的SQL语句,从而生成数据库.但,江湖中流传着"powerDesign逆向工程&qu ...

  7. java时间格式串

    yyyy-mm-dd 和yyyy-MM-dd转换出来的日期不用. 用"yyyy-MM-dd"

  8. Python中定义字符串

    字符串可以用''或者""括起来表示.如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" "括起来表示: "I'm OK& ...

  9. sql CRUD 增删改查复习汇总

    1.创建数据库create database 数据库名称删除数据库drop database 数据库名称2.创建表create table 表名(    列名 类型(长度) 自增长 主键 非空,)自增 ...

  10. 有序列表和无序列表、流、格式布局:position

    列表方块: 有序列表和无序列表 ol/ul 例如<ol: style:"list-style:""  "> 1.<ol: style:&quo ...