js实现的仿新浪微博完美的时间组件升级版


Posted in Javascript onDecember 20, 2011

这个时间组件以前发过一次,上次那个很烂,这次有时间了,把这个升级了,性能更好,完美兼容所有浏览器,ie6下拉select档不住的问题
也解决了.总之,差不多也算一个完美的时间组件,
在线demo nothingDemo 突然发现下面的代码里面有个运行代码可以看在线demo,就再最下面
然后贴出源码,只有一点简单的说明

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Untitled Page</title> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> 
<style type="text/css"> 
*{margin:0;padding:0;} 
body, button, input, select, textarea { 
font: 12px/1.125 Arial,Helvetica,sans-serif; 
} 
/*日期控件*/ 
.pc_caldr{border:1px solid #ccc;background-color:#fff;z-index:10;width:175px;height:auto;position:absolute;color:#000;padding:5px;} 
.pc_caldr .selector{height:24px;_padding:2px 0 2px;padding:2px 0 0;} 
.pc_caldr .selector .month,.pc_caldr .selector .year{float:left;font-size:12px;width:80px;border:1px solid #CCC;height:19px;} 
.pc_caldr .selector .year{width:84px;margin-left:10px;} 
.pc_caldr .weeks,.pc_caldr .days{list-style:none;width:100%!important;margin:0;padding:0;} 
.pc_caldr .weeks{height:18px;margin-bottom:2px;background:#b6d1f9;color:#fff;font-size:12px;} 
.pc_caldr .days{height:auto;font-size:12px;font-family:Arial;} 
.pc_caldr .weeks li,.pc_caldr .days li{float:left;height:20px;line-height:20px;text-align:center;width:25px;} 
.pc_caldr .days li{background-color:none;} 
.pc_caldr .days li a{display:block;text-decoration:none;height:100%;color:#43609c;transition:transform .5s;-moz-transition:-moz-transform .5s;-webkit-transition:-webkit-transform .5s;-o-transition:-o-transform .5s;padding:1px;} 
.pc_caldr .days li a:link,.pc_caldr .days li a:visited,.pc_caldr .days li a:hover{text-decoration:none;} 
.pc_caldr .days li a strong{font-weight:400;} 
.pc_caldr .days li a:hover{background-color:#5d94e6;color:#fff;transform:rotate(180deg) scale(1.5);-moz-transform:rotate(360deg) scale(1.5);-webkit-transform:rotate(360deg) scale(1.5);-o-transform:rotate(360deg) scale(1.5);} 
.pc_caldr .weeks li,.pc_caldr .days li,.pc_caldr .days li a{text-align:center;} 
/*文本框*/ 
.tiemin{width:120px;border:1px solid #f00;} 
.inline-block {display :inline-block; zoom:1 ; *display: inline; vertical-align:middle ;} 
.ie6iframe {background: none repeat scroll 0 0 #FFFFFF;left: -1px;filter:alpha(opacity=0);position: absolute;top: 0;z-index: -1;width:100%;height:150px;} 
</style> 
</head> 
<body> 
<a href="http://www.cnblogs.com/nothingbrother/archive/2011/12/17/2291107.html" target="_blank" style="color:red;border:1px solid 
red;display:block;margin:20px auto;width:300px;font-size:14px;padding:3px;">作者nothing</a> 
<div style="height: 200px;"> 
</div> 
<input type="text" class="tiemin" readonly="readonly" /> 
<div style="height: 200px;"> 
</div> 
<span style="width: 200px;" class="inline-block"></span> 
<input type="text" class="tiemin" readonly="readonly" /> 
<div style="width: 300px; height: 100px; margin-left: 210px;"> 
<select> 
<option>挡住它nothing</option> 
</select> 
</div> 
<script type="text/javascript"> 
var nothingTime = (function ($) { 
var cache = { 
obj: null, 
calendar: null, 
disappear: function () { //隐藏时间块 
cache.calendar.css("display", "none"); 
}, 
isLeap: function (year) { //闰年 
return (year % 100 == 0 ? (year % 400 == 0 ? 1 : 0) : (year % 4 == 0 ? 1 : 0)); 
}, 
isValid: function (d) { //是否在今天以前 
return (d.getTime() - (new Date()).getTime() < 0) ? true : false; 
}, 
td: new Date(), 
createData: function (year, month) { 
var n1 = new Date(year, month, 1), 
firstday = n1.getDay(), 
mdays = [31, 28 + this.isLeap(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], 
ul = document.createElement("ul"), li; 
ul.className = "days"; 
$("#calendar").find(".days").remove(); 
for (var i = firstday;i--;) { //建立前面无效的几天 
ul.appendChild(document.createElement("li")); 
} 
for (var j = 1; j <= mdays[month]; j++) { 
if (this.isValid(new Date(year, month, j))) { //今天以前的日子 
li = document.createElement("li"); 
li.innerHTML = "<a href='javascript:void(0)'>" + j + "</a>"; 
ul.appendChild(li); 
} else { 
li = document.createElement("li"); 
li.innerHTML = j; 
ul.appendChild(li); 
} 
} 
this.calendar[0].appendChild(ul); 
}, 
change: function () { //给下拉列表绑定时间 
var a = $("#calendar .month"), 
b = $("#calendar .year"); 
a.change(function () { 
cache.createData(b.attr("value"), $(this).attr("value")); 
}); 
b.change(function () { 
cache.createData($(this).attr("value"), a.attr("value")); 
}); 
cache.calendar.delegate(".days a", "click", function () { 
var day = b.attr("value") + "-" + (parseInt(a.attr("value")) + 1) + "-" + this.innerHTML; 
cache.obj.val(day); 
cache.disappear(); 
}); 
}, 
bodyClickDisappear: function () { 
setTimeout(function () { 
$("body").bind("click", cache.disappear); 
}, "200"); 
}, 
calendarClick: function () { 
cache.calendar.click(function (e) { 
e.stopPropagation(); 
}); 
} 
}, 
CreateTime = function (obj) { 
cache.obj = obj; 
var of = cache.obj.offset(); 
if (document.getElementById("calendar")) { 
} else { 
var se = "<div class='selector'><select class='month'><option value='0'>一月</option><option value='1'>二月</option><option value='2'>三月</option><option value='3'>四月</option><option value='4'>五月</option><option value='5'>六月</option><option value='6'>七月</option><option value='7'>八月</option><option value='8'>九月</option><option value='9'>十月</option><option value='10'>十一月</option><option value='11'>十二月</option></select><select class='year'><option value='2011'>2011</option><option value='2012'>2012</option></select></div><ul class='weeks'><li>日</li><li>一</li><li>二</li><li>三</li><li>四</li><li>五</li><li>六</li></ul>"; 
$("<div>", { id: "calendar", html: se, "class": "pc_caldr" }).appendTo(document.body); 
cache.calendar = $("#calendar"); 
if (/msie 6\.0/i.test(navigator.userAgent)) { 
var iframe = document.createElement("iframe"); 
iframe.className = "ie6iframe"; 
cache.calendar[0].appendChild(iframe); 
} 
cache.change(); 
cache.bodyClickDisappear(); 
cache.calendarClick(); 
} 
cache.createData(cache.td.getFullYear(), cache.td.getMonth()); 
cache.calendar.find(".year").attr("value", cache.td.getFullYear()); 
cache.calendar.find(".month").attr("value", cache.td.getMonth()); 
cache.calendar.css({ left: of.left, top: of.top + cache.obj.height() + 2, display: "block" }); 
}; 
return function (obj) { 
CreateTime(obj); 
}; 
})(jQuery); 
//使用方法 
$("input.tiemin").focus(function (e) { 
nothingTime($(this)); 
}).click(function (e) { 
e.stopPropagation(); 
}); 
</script> 
</body> 
</html>

OK,这个时间组件到此为止,下篇我应该讲点如何跟上js代码的脚步,ECMAScript5,我会试着模仿里面的方法,然后在ie6 7 8中运行,这样,前沿的js方法
我们照样不误.
Javascript 相关文章推荐
用js实现键盘方向键翻页功能的代码
Jun 03 Javascript
屏蔽F1~F12的快捷键的js函数
May 06 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
May 25 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
基于JS实现简单的样式切换效果代码
Sep 04 Javascript
浅谈JavaScript 中有关时间对象的方法
Aug 15 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 Javascript
Vue实现点击显示不同图片的效果
Aug 10 Javascript
ant-design-vue 快速避坑指南(推荐)
Jan 21 Javascript
JS中循环遍历数组的四种方式总结
Jan 23 Javascript
非主流的textarea自增长实现js代码
Dec 20 #Javascript
javascript之querySelector和querySelectorAll使用介绍
Dec 20 #Javascript
js有关元素内容操作小结
Dec 20 #Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
Dec 20 #Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
Dec 20 #Javascript
js change,propertychange,input事件小议
Dec 20 #Javascript
JavaScript面向对象设计二 构造函数模式
Dec 20 #Javascript
You might like
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
JS获取整个页面文档的实现代码
2011/12/15 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
vue脚手架搭建过程图解
2018/06/06 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
python实现微信自动回复机器人功能
2019/07/11 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
海南地接欢迎词
2014/01/14 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python