标签:

<!DOCTYPE html>
<html>
<head>
<meta content="width =device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport" />
<meta content="yes" name="apple-mobile-web-app-capable" />
<meta content="black" name="apple-mobile-web-app-status-bar-style" />
<meta content="telephone =no" name="format-detection" />
<title>日期控件</title>
<link href="/Css/Date.css" rel="stylesheet" />
</head>
<body>
<input id="txttime" value="2015-5-31" style="height:25px;border:1px solid #e2e2e2;margin:50px;width:250px;line-height:25px;font:15px/1.5 ‘Microsoft YaHei‘;padding:5px 0px;text-align:center;color:#ff0000" />
<div class="fc-date-box" id="trtarget" style="display:none;">
<div class="fc-box" id="fc-box">
<a class="fc-ico fc-ico-l" id="fc-ico-l"><i></i></a>
<input class="fc-input input-YY" id="input-YY" value="" readonly="readonly" />
<span>年</span>
<input class="fc-input input-MM" id="input-MM" value="" readonly="readonly" />
<span>月</span>
<a class="fc-ico fc-ico-r" id="fc-ico-r"><i></i></a>
<div class="fc-YY-list-box"></div>
<div class="fc-MM-list-box"></div>
</div>
<div class="f-d-list-box">
<table id="fc-date-table">
<thead><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr></thead>
</table>
</div>
<div class="f-d-week-keepout"></div>
<div class="f-d-week-error">
<p class="f-d-w-e-tit">信息</p>
<div class="f-d-w-e-content">
<p><span class="span1"></span><span id="f-d-w-e-span">格式不正确</span></p>
<a href="#" id="btn-ok">确 定</a>
</div>
</div>
</div>
<span id="el"></span>
<script src="/Scripts/Date.js"></script>
</body>
</html>
/*日历控件
暂时只支持input
*/
!(function (win) {
var options = {
inputdom: document.getElementById(‘txttime‘),//操作input
event: ‘focus‘,//触发方式
format: ‘YYYY-MM-dd‘,//格式化格式
min: ‘1900-1-1‘,
max: ‘2099-12-31‘,
fn: null
};
//扩展options
options.extend = function (options) {
for (var o in options) {
//console.log(options.hasOwnProperty(o));
if (options.hasOwnProperty(o)) {
this[o] = options[o];
}
}
}
//公共方法
var Common = {
each: function (arrydom, fn) {
var len = arrydom.length;
for (var i = 0; i < len; i++) {
if (typeof fn == ‘function‘) {
fn.call(arrydom[i]);
}
}
},
//绑定事件
on: function (dom, even, fn) {
dom.attachEvent ? dom.attachEvent(‘on‘ + even, function (e) {
e = e || window.event;
(e.stopPropagation && e.stopPropagation());
if (e.cancelBubble) e.cancelBubble = false;
fn.call(dom, e);
}) : dom.addEventListener(even, function (e) {
e = e || window.event;
(e.stopPropagation && e.stopPropagation());
if (e.cancelBubble) e.cancelBubble = false;
fn.call(dom, e);
}, false);
},
on2: function (dom, even, fn) {
dom.attachEvent ? dom.attachEvent(‘on‘ + even, function (e) {
e = e || window.event;
fn.call(dom, e);
}) : dom.addEventListener(even, function (e) {
e = e || window.event;
fn.call(dom, e);
}, false);
},
//获得属性
attr: function (dom, attr, val) {
var str = ‘‘, s;
if (val) {
dom.setAttribute(this.trim(attr), val);
attr.toLowerCase() == ‘class‘ && (dom.className = val);
attr.toLowerCase() == ‘style‘ && (dom.style.cssText = val);
}
else {
s = dom.getAttribute(attr);
str = s;
attr.toLowerCase() == ‘class‘ && (str = dom.className);
attr.toLowerCase() == ‘style‘ && (str = dom.style.cssText);
return this.trim(str);
}
},
//删除属性
removeattr: function (dom, attr) {
dom.removeAttribute(attr);
},
//判断是否存在class
hasClass: function (dom, str) {
return new RegExp(‘\\b‘ + str + ‘\\b‘).test(dom.className);
},
//添加class
addClass: function (dom, cls) {
this.hasClass(dom, cls) || (dom.className += ‘ ‘ + cls);
dom.className = this.trim(dom.className);
},
//删除class
removeClass: function (dom, cls) {
var c = this.trim(cls), reg = new RegExp(‘\\b‘ + c + ‘\\b‘);
if (this.hasClass(dom, c)) {
dom.className = this.trim(dom.className.replace(reg, ‘‘));
}
},
//去除前后空格
trim: function (s) {//去除多于空格
s = s.toString() || ‘‘;
return s.replace(/^\s*|\s*$/g, ‘‘);
},
mouseenter: function (dom, fn) {
var f = true;
if (dom.attachEvent) {
this.on(dom, "mouseenter", fn);
}
else {
this.on(dom, "mouseover", function (e) {
if (f) {
var mya = (e.srcElement ? e.srcElement : e.target);
var parent = e.relatedTarget || e.fromElement;
while (parent && parent != dom) {
try { parent = parent.parentNode; }
catch (e) { break; }
}
if (parent != dom) {
f = (function () { fn.call(dom, e); return true; })();
}
}
});
}
},
mouseleave: function (dom, fn) {
if (dom.attachEvent) {
this.on(dom, "mouseleave", fn);
}
else {
this.on(dom, "mouseout", function (e) {
var mya = (e.srcElement ? e.srcElement : e.target);
var parent = e.relatedTarget || e.toElement;
while (parent && parent != dom) {
try { parent = parent.parentNode; }
catch (e) { break; }
}
if (parent != this) { fn.call(dom, e); }
});
}
}
};
var Dates = {
//补位
digit: function (m) {
return +m < 10 ? ‘0‘ + m : m;
},
//日期格式化可date可是数组也可以是字符串
parse: function (date, format) {
var _index = 0;
if (typeof date == ‘string‘) date = this.toarry(date);
if (date == null) return ‘‘;
//console.log(date);
format = format || ‘YYYY-MM-dd HH:mm:ss‘;
return format.replace(/YYYY|MM|dd|HH|mm|ss/g, function (str, index, s) {
return Dates.digit(date[_index++]);
});
},
//获指定日期
now: function (timestamp, format) {
var _parsestr, _date = new Date((timestamp | 0) ? function () {
var _datenow = new Date();
if (timestamp >= 86400000) {
return timestamp + _datenow.getHours() * 3600000 + _datenow.getMinutes() * 60000 + _datenow.getSeconds() * 1000;
}
return 86400000 * timestamp + _datenow.getTime();
}(timestamp) : new Date);
_parsestr = [_date.getFullYear(), (_date.getMonth() + 1), _date.getDate(), _date.getHours(), _date.getMinutes(), _date.getSeconds()];
return {
//返回字符串
Totime: this.parse(_parsestr, format),
//返回数组
Toarry: _parsestr
};
},
//日期序列化
toarry: function (timestr) {
var aryy = this.Isdate(timestr, true);//日期正确返回日期数组[YYYY,MM,dd,HH,mm,ss]
if (!aryy) return null;
return aryy;
},
//验证日期,设置第二个参数可以返回现在日期数组[YYYY,MM,dd,HH,mm,ss]
Isdate: function (datestr, isreturn) {
var _DateReg = /^((\d{4})(-|\/)(\d{1,2})\3(\d{1,2}))( (\d{1,2}):(\d{1,2}):(\d{1,2}))?$/,//2015-1-43 3:3:44||2015-1-43 99:99:99
_Date,
_result,
_YYYY, _MM, _dd, _HH = 0, _mm = 0, _ss = 0, _istrue = false;
if (_DateReg.test(datestr)) {//验证格式正确
_result = _DateReg.exec(datestr);//datestr.match(reg);
//console.log(_result);
if (_result == null) return false;
_YYYY = _result[2];
_MM = +_result[4] - 1;
_dd = _result[5];
if (_result[6] != undefined && _result[6] != ‘‘) {
_HH = _result[7];
_mm = _result[8];
_ss = _result[9];
}
_Date = new Date(_YYYY, _MM, _dd, _HH, _mm, _ss);
_istrue = (_Date.getFullYear() == _YYYY && _Date.getMonth() == _MM && _Date.getDate() == _dd && _Date.getHours() == _HH && _Date.getMinutes() == _mm && _Date.getSeconds() == _ss);
return (_istrue && (isreturn && [_YYYY, (_MM + 1), _dd, _HH, _mm, _ss])) || _istrue;
}
else {
return false;
}
},
//润年判断
LeapYear: function (year) {
if ((year % 100 == 0 && year % 400 == 0) || year % 4 == 0) return true;
return false;
}
};
var domtrtarget = document.getElementById(‘trtarget‘),
domfc = document.getElementById(‘fc-date-table‘),//容器
domYYYY = document.getElementById(‘input-YY‘),
domMM = document.getElementById(‘input-MM‘),
domfc_l = document.getElementById(‘fc-ico-l‘),//前一月
domfc_r = document.getElementById(‘fc-ico-r‘),//后一月
td_this_class = ‘fc-foucs-this‘,//当前td样式
td_no_class = ‘no-fc‘;//notd样式
var timeout1 = false;//延迟input blur发生
var _arrym_d = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var _nowarry = Dates.now().Toarry;//日期数组
var _nowday = new Date(_nowarry[0] + ‘/‘ + _nowarry[1] + ‘/1‘).getDay();//星期数
var _arrydom = [];//td-dom 页面数组
var Fcdate = {
//数据写入内存防止用户篡改
Options: {
thisYYYY: null,//当前年份
thisMM: null,//当前月份
thisDD: null,//当前日期
thisHH: null,
thismm: null,
thisss: null,
maxYYYY: null,
minYYYY: null
},
//为目标dom创建focus事件
ondom: function () {
var _cur = this,
_focusdom = options.inputdom;
_cur.Init();
Common.on(_focusdom, ‘focus‘, function () {
timeout1 = true;
//console.log(this.offsetHeight + "," + this.offsetTop + ‘,‘ + this.offsetTop);
domtrtarget.style.top = this.offsetHeight + this.offsetTop + ‘px‘;
domtrtarget.style.left = this.offsetLeft + ‘px‘;
domtrtarget.style.display = ‘block‘;
});
Common.on2(document, ‘click‘, function (e) {
var _target = e.target || e.srcElement
if (_target === _focusdom) {
//console.log(_focusdom);
return;
}
if (timeout1) {
domtrtarget.style.display = ‘none‘;
timeout1 = false;
}
//console.log(timeout1);
});
},
//主函数
Init: function (opt) {
var _thisnewarry;
if (opt) {
options.extend(opt);
}
if (Common.trim(options.inputdom.value) != ‘‘) {
_thisnewarry = Dates.toarry(options.inputdom.value);
_nowarry = _thisnewarry || _nowarry;
_nowday = (_thisnewarry && (this.GetFirstDay(_thisnewarry[0], _thisnewarry[1]))) || _nowday;
}
this.Options.thisDD = _nowarry[2];
this.LeapYear(_nowarry[0]);
this.SetyyyyMM(3, _nowarry);
this.CeartTbody();
this.BindFn();
_thisnewarry = null;
},
//创建table
CeartTbody: function () {
var _cur = this;
//console.log(domfc.getElementsByTagName(‘tbody‘).length);
if (domfc.getElementsByTagName(‘tbody‘).length > 0) {
for (var i = 0, j = domfc.getElementsByTagName(‘tbody‘).length; i < j; i++) {
domfc.removeChild(domfc.getElementsByTagName(‘tbody‘)[i]);
}
}
var _tbody = document.createElement(‘tbody‘), _tr = null;
for (var i = 0; i < 42; i++) {
if (i == 0 || i == 7 || i == 14 || i == 21 || i == 28 || i == 35) {
_tr = document.createElement(‘tr‘);
_tbody.appendChild(_tr);
}
var _td = document.createElement(‘td‘);
if (i >= _nowday && i < (_arrym_d[_nowarry[1] - 1] + _nowday)) {
var _day = i - _nowday + 1;
_td.innerHTML = _day;
Common.attr(_td, ‘data-y‘, _nowarry[0]);
Common.attr(_td, ‘data-m‘, _nowarry[1]);
Common.attr(_td, ‘data-d‘, _day);
this.Isday(_td, _day);
_arrydom.push(_td);
}
else {
Common.addClass(_td, td_no_class);
}
_tr.appendChild(_td);
}
domfc.appendChild(_tbody);
//td点选事件
Common.on2(_tbody, ‘click‘, function (e) {
var _target = e.target || e.srcElement, _nowtime = new Date(), _newtime;
if (_target.tagName.toLowerCase() === ‘td‘ && _target.nodeType == 1 && !Common.hasClass(_target, td_no_class)) {
(e.stopPropagation && e.stopPropagation());
if (e.cancelBubble) e.cancelBubble = false;
_newtime = Dates.parse(Common.attr(_target, ‘data-y‘) + ‘/‘ + Common.attr(_target, ‘data-m‘) + ‘/‘ + Common.attr(_target, ‘data-d‘) + ‘ ‘ + _nowtime.getHours() + ‘:‘ + _nowtime.getMinutes() + ‘:‘ + _nowtime.getSeconds(), options.format);
if (!_newtime) { alert(‘注意,内里被篡改!‘); return; }
if (Common.hasClass(_target, td_this_class)) {
return false;
}
Common.each(_arrydom, function () {
Common.removeClass(this, td_this_class);
});
Common.addClass(_target, td_this_class);
//console.log(_newtime);
_cur.Options.thisDD = Common.attr(_target, ‘data-d‘);
options.inputdom.value = _newtime;
domtrtarget.style.display = ‘none‘;
//console.log(this);
}
});
},
//判断当前选中日期
Isday: function (td, day) {
if (this.Options.thisDD == day) {
Common.addClass(td, td_this_class);
}
},
//写入input
SetInput: function () { },
//绑定事件
BindFn: function () {
var _cur = this;
//前一月事件
Common.on(domfc_l, ‘click‘, function (e) {
_cur.SetyyyyMM(1);
_cur.Change();
});
//下一月事件
Common.on(domfc_r, ‘click‘, function (e) {
_cur.SetyyyyMM(2);
_cur.Change();
});
},
//日期改变
Change: function () {
_nowday = this.GetFirstDay(domYYYY.value, domMM.value);
_nowarry = [domYYYY.value.toString(), domMM.value.toString()];
this.LeapYear(_nowarry[0]);
this.CeartTbody();
},
//润年判断
LeapYear: function (year) {
if (Dates.LeapYear(year)) _arrym_d[1] = 29;
_arrym_d[1] = 28;
},
//设置当前年月
SetyyyyMM: function (type, arry) {
var yyyy = +domYYYY.value, MM = +domMM.value;
switch (type) {
case 1:
if (MM == 1) {
domYYYY.value = yyyy - 1;
domMM.value = 12;
}
else {
domMM.value = Dates.digit(MM - 1);
}
break;
case 2:
if (MM == 12) {
domYYYY.value = yyyy + 1;
domMM.value = Dates.digit(1);
}
else {
domMM.value = Dates.digit(MM + 1);
}
break;
case 3:
domYYYY.value = arry[0];
domMM.value = Dates.digit(+arry[1]);
break;
}
},
//每月1日的星期数
GetFirstDay: function (year, MM) {
return new Date(year + ‘/‘ + MM + ‘/1‘).getDay();
}
};
win.Fcdates = function () { Fcdate.ondom.call(Fcdate); };
Fcdates();
})(window);
标签:
原文地址:http://www.cnblogs.com/yc-code/p/4290305.html