Last active
December 17, 2015 18:39
-
-
Save Yhzhtk/5654973 to your computer and use it in GitHub Desktop.
JS简单日历选择控件。
<br/>
在使用的网页内加入date.js
<script type="text/javascript" src="date.js"></script>
<br/>
调用:<input type="text" onfocus="HS_setDate(this)"/>
1.1、焦点离开后不消失,焦点进入产生一个日历,没有单例
1.2、bug修改,选择月或者年份的时候自动消失
1.3、修改选择年份后不消失,但是还有bug,在选择年份或月份后没有选择日期,也不会消失
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function HS_DateAdd(interval, number, date) { | |
number = parseInt(number); | |
if (typeof (date) == "string") { | |
var date = new Date(date.split("-")[0], date.split("-")[1], date | |
.split("-")[2]) | |
} | |
if (typeof (date) == "object") { | |
var date = date | |
} | |
switch (interval) { | |
case "y": | |
return new Date(date.getFullYear() + number, date.getMonth(), date | |
.getDate()); | |
break; | |
case "m": | |
setNotClose(); | |
return new Date(date.getFullYear(), date.getMonth() + number, | |
checkDate(date.getFullYear(), date.getMonth() + number, date | |
.getDate())); | |
break; | |
case "d": | |
return new Date(date.getFullYear(), date.getMonth(), date.getDate() | |
+ number); | |
break; | |
case "w": | |
return new Date(date.getFullYear(), date.getMonth(), 7 * number | |
+ date.getDate()); | |
break; | |
} | |
} | |
function checkDate(year, month, date) { | |
var enddate = [ "31", "28", "31", "30", "31", "30", "31", "31", "30", "31", | |
"30", "31" ]; | |
var returnDate = ""; | |
if (year % 4 == 0) { | |
enddate[1] = "29" | |
} | |
if (date > enddate[month]) { | |
returnDate = enddate[month] | |
} else { | |
returnDate = date | |
} | |
return returnDate; | |
} | |
//获取日历的星期 | |
function WeekDay(date) { | |
var theDate; | |
if (typeof (date) == "string") { | |
theDate = new Date(date.split("-")[0], date.split("-")[1], date | |
.split("-")[2]); | |
} | |
if (typeof (date) == "object") { | |
theDate = date | |
} | |
return theDate.getDay(); | |
} | |
//显示日历 | |
function HS_calender() { | |
var lis = ""; | |
var style = ""; | |
style += "<style type='text/css'>"; | |
//北京图片替换以下background:url(calenderbg.gif) no-repeat right center #fff; | |
style += ".calender { width:170px; height:auto; background: #fff; font-size:12px; margin-right:14px; border:1px solid #397EAE; padding:1px}"; | |
style += ".calender ul {list-style-type:none; margin:0; padding:0;}"; | |
style += ".calender .day { background-color:#EDF5FF; height:20px;}"; | |
style += ".calender .day li,.calender .date li{ float:left; width:14%; height:20px; line-height:20px; text-align:center}"; | |
style += ".calender li a { text-decoration:none; font-family:Tahoma; font-size:11px; color:#333}"; | |
style += ".calender li a:hover { color:#f30; text-decoration:underline}"; | |
style += ".calender li a.hasArticle {font-weight:bold; color:#f60 !important}"; | |
style += ".lastMonthDate, .nextMonthDate {color:#bbb;font-size:11px}"; | |
style += ".selectThisYear a, .selectThisMonth a{text-decoration:none; margin:0 2px; color:#000; font-weight:bold}"; | |
style += ".calender .LastMonth, .calender .NextMonth{ text-decoration:none; color:#000; font-size:18px; font-weight:bold; line-height:16px;}"; | |
style += ".calender .LastMonth { float:left;}"; | |
style += ".calender .NextMonth { float:right;}"; | |
style += ".calenderBody {clear:both}"; | |
style += ".calenderTitle {text-align:center;height:20px; line-height:20px; clear:both}"; | |
style += ".today { background-color:#ffffaa;border:1px solid #f60; padding:2px}"; | |
style += ".today a { color:#f30; }"; | |
style += ".calenderBottom {clear:both; border-top:1px solid #ddd; padding: 3px 0; text-align:left}"; | |
style += ".calenderBottom a {text-decoration:none; margin:2px !important; font-weight:bold; color:#000}"; | |
style += ".calenderBottom a.closeCalender{float:right}"; | |
style += ".closeCalenderBox {float:right; border:1px solid #000; background:#fff; font-size:9px; width:11px; height:11px; line-height:11px; text-align:center;overflow:hidden; font-weight:normal !important}"; | |
style += "</style>"; | |
var now; | |
if (typeof (arguments[0]) == "string") { | |
selectDate = arguments[0].split("-"); | |
var year = selectDate[0]; | |
var month = parseInt(selectDate[1]) - 1 + ""; | |
var date = selectDate[2]; | |
now = new Date(year, month, date); | |
} else if (typeof (arguments[0]) == "object") { | |
now = arguments[0]; | |
} | |
var lastMonthEndDate = HS_DateAdd("d", "-1", | |
now.getFullYear() + "-" + now.getMonth() + "-01").getDate(); | |
var lastMonthDate = WeekDay(now.getFullYear() + "-" + now.getMonth() | |
+ "-01"); | |
var thisMonthLastDate = HS_DateAdd("d", "-1", now.getFullYear() + "-" | |
+ (parseInt(now.getMonth()) + 1).toString() + "-01"); | |
var thisMonthEndDate = thisMonthLastDate.getDate(); | |
var thisMonthEndDay = thisMonthLastDate.getDay(); | |
var todayObj = new Date(); | |
today = todayObj.getFullYear() + "-" + todayObj.getMonth() + "-" | |
+ todayObj.getDate(); | |
for (i = 0; i < lastMonthDate; i++) { // Last Month's Date | |
lis = "<li class='lastMonthDate'>" + lastMonthEndDate + "</li>" + lis; | |
lastMonthEndDate--; | |
} | |
for (i = 1; i <= thisMonthEndDate; i++) { // Current Month's Date | |
if (today == now.getFullYear() + "-" + now.getMonth() + "-" + i) { | |
var todayString = now.getFullYear() + "-" | |
+ (parseInt(now.getMonth()) + 1).toString() + "-" + i; | |
lis += "<li><a href=javascript:void(0) class='today' onclick='_selectThisDay(this)' title='" | |
+ now.getFullYear() | |
+ "-" | |
+ (parseInt(now.getMonth()) + 1) | |
+ "-" + i + "'>" + i + "</a></li>"; | |
} else { | |
lis += "<li><a href=javascript:void(0) onclick='_selectThisDay(this)' title='" | |
+ now.getFullYear() | |
+ "-" | |
+ (parseInt(now.getMonth()) + 1) | |
+ "-" + i + "'>" + i + "</a></li>"; | |
} | |
} | |
var j = 1; | |
for (i = thisMonthEndDay; i < 6; i++) { // Next Month's Date | |
lis += "<li class='nextMonthDate'>" + j + "</li>"; | |
j++; | |
} | |
lis += style; | |
var CalenderTitle = "<a href='javascript:void(0)' class='NextMonth' onclick=HS_calender(HS_DateAdd('m',1,'" | |
+ now.getFullYear() | |
+ "-" | |
+ now.getMonth() | |
+ "-" | |
+ now.getDate() | |
+ "'),this) title='Next Month'>»</a>"; | |
CalenderTitle += "<a href='javascript:void(0)' class='LastMonth' onclick=HS_calender(HS_DateAdd('m',-1,'" | |
+ now.getFullYear() | |
+ "-" | |
+ now.getMonth() | |
+ "-" | |
+ now.getDate() | |
+ "'),this) title='Previous Month'>«</a>"; | |
CalenderTitle += "<span class='selectThisYear'><a href='javascript:void(0)' onclick='CalenderselectYear(this)' title='Click here to select other year' >" | |
+ now.getFullYear() | |
+ "</a></span>年<span class='selectThisMonth'><a href='javascript:void(0)' onclick='CalenderselectMonth(this)' title='Click here to select other month'>" | |
+ (parseInt(now.getMonth()) + 1).toString() + "</a></span>月"; | |
if (arguments.length > 1) { | |
arguments[1].parentNode.parentNode.getElementsByTagName("ul")[1].innerHTML = lis; | |
arguments[1].parentNode.innerHTML = CalenderTitle; | |
} else { | |
var CalenderBox = style | |
+ "<div class='calender'><div class='calenderTitle'>" | |
+ CalenderTitle | |
+ "</div><div class='calenderBody'><ul class='day'><li>日</li><li>一</li><li>二</li><li>三</li><li>四</li><li>五</li><li>六</li></ul><ul class='date' id='thisMonthDate'>" | |
+ lis | |
+ "</ul></div><div class='calenderBottom'><a href='javascript:void(0)' class='closeCalender' onclick='closeCalender(this)'>×</a><span><span><a href=javascript:void(0) onclick='_selectThisDay(this)' title='" | |
+ todayString + "'>Today</a></span></span></div></div>"; | |
return CalenderBox; | |
} | |
} | |
//以对象关闭日历 | |
function closeCalender(d) { | |
var boxObj = d.parentNode.parentNode.parentNode; | |
boxObj.parentNode.removeChild(boxObj); | |
} | |
//以id关闭日历 | |
function closeCalenderById(id) { | |
var dom = document.getElementById(id); | |
if (dom) { | |
dom.parentNode.removeChild(dom); | |
} | |
} | |
//选择日期 | |
function _selectThisDay(d) { | |
var boxObj = d.parentNode.parentNode.parentNode.parentNode.parentNode; | |
boxObj.targetObj.value = d.title; | |
boxObj.parentNode.removeChild(boxObj); | |
} | |
//添加日历年份 | |
function CalenderselectYear(obj) { | |
setNotClose(obj.parentNode.parentNode.parentNode.parentNode.previousSibling); | |
var opt = ""; | |
var thisYear = obj.innerHTML; | |
for (i = 1970; i <= 2020; i++) { | |
if (i == thisYear) { | |
opt += "<option value=" + i + " selected>" + i + "</option>"; | |
} else { | |
opt += "<option value=" + i + ">" + i + "</option>"; | |
} | |
} | |
opt = "<select onblur='selectThisYear(this)' onchange='selectThisYear(this)' style='font-size:11px'>" | |
+ opt + "</select>"; | |
obj.parentNode.innerHTML = opt; | |
} | |
//添加日历月份 | |
function CalenderselectMonth(obj) { | |
setNotClose(obj.parentNode.parentNode.parentNode.parentNode.previousSibling); | |
var opt = ""; | |
var thisMonth = obj.innerHTML; | |
for (i = 1; i <= 12; i++) { | |
if (i == thisMonth) { | |
opt += "<option value=" + i + " selected>" + i + "</option>"; | |
} else { | |
opt += "<option value=" + i + ">" + i + "</option>"; | |
} | |
} | |
opt = "<select onblur='selectThisMonth(this)' onchange='selectThisMonth(this)' style='font-size:11px'>" | |
+ opt + "</select>"; | |
obj.parentNode.innerHTML = opt; | |
} | |
//选择年份 | |
function selectThisYear(obj) { | |
setNotClose(obj.parentNode.parentNode.parentNode.parentNode.previousSibling); | |
HS_calender(obj.value | |
+ "-" | |
+ obj.parentNode.parentNode.getElementsByTagName("span")[1] | |
.getElementsByTagName("a")[0].innerHTML + "-1", | |
obj.parentNode); | |
} | |
//选择月份 | |
function selectThisMonth(obj) { | |
setNotClose(obj.parentNode.parentNode.parentNode.parentNode.previousSibling); | |
HS_calender(obj.parentNode.parentNode.getElementsByTagName("span")[0] | |
.getElementsByTagName("a")[0].innerHTML | |
+ "-" + obj.value + "-1", obj.parentNode); | |
} | |
//显示日历 | |
function HS_setDate(inputObj, id) { | |
var calenderObj = document.createElement("span"); | |
calenderObj.setAttribute("id", id); | |
calenderObj.innerHTML = HS_calender(new Date()); | |
calenderObj.style.position = "absolute"; | |
calenderObj.targetObj = inputObj; | |
inputObj.parentNode.insertBefore(calenderObj, inputObj.nextSibling); | |
} | |
//设置一点时间内不关闭 | |
function setNotClose(obj){ | |
close = false; | |
setTimeout(function(){ | |
close = true; | |
}, 300) | |
} | |
//标志是否关闭日历 | |
var close = true; | |
//延时关闭日历显示 | |
function hideDateCtrl(id) { | |
setTimeout(function() { | |
if(close){ | |
closeCalenderById(id); | |
} | |
}, 200); | |
} | |
//显示唯一日历信息 | |
function showDateCtrl(dom, id) { | |
var s = document.getElementById(id); | |
if (s) { | |
} else { | |
HS_setDate(dom, id); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html xmlns="http://www.w3.org/1999/xhtml"><head> | |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |
<title>\u代码转换</title> | |
<style type="text/css"> | |
<!-- | |
.btn{ | |
font-family: Verdana, Arial, Helvetica, sans-serif; | |
font-size: 12px; | |
color: #666666; | |
text-align: left; | |
text-decoration: none; | |
display: block; | |
overflow: visible; | |
margin-right: 10px; | |
margin-left: 10px; | |
} | |
.btn a:hover { | |
background-color: #d8dfea; | |
border-top-width: 1px; | |
border-bottom-width: 1px; | |
border-top-style: solid; | |
border-bottom-style: solid; | |
border-top-color: #333366; | |
border-bottom-color: #333366; | |
} | |
.btn a { | |
display: block; | |
text-decoration: none; | |
color: #666666; | |
border-top-width: 1px; | |
border-bottom-width: 1px; | |
border-top-style: solid; | |
border-bottom-style: solid; | |
border-top-color: #CCCCCC; | |
border-bottom-color: #CCCCCC; | |
width: 100px; | |
padding-top: 5px; | |
padding-right: 10px; | |
padding-bottom: 5px; | |
padding-left: 30px; | |
overflow: visible; | |
float: left; | |
} | |
html { | |
font-family: Verdana, Arial, Helvetica, sans-serif; | |
font-size: 12px; | |
color: #333333; | |
line-height: 18px; | |
margin: 0px; | |
} | |
--> | |
body{ | |
margin:0px; | |
} | |
</style> | |
</head> | |
<body> | |
<p> | |
<textarea name="source" rows="14" id="source" style="width:99%"> | |
请在这儿输入 | |
</textarea> | |
</p> | |
<div class="btn"> <a href="javascript:action('CONVERT_FMT1')"> <strong>Convert</strong><br> | |
Fmort &#xxxx </a></div> | |
<div class="btn"> <a href="javascript:action('CONVERT_FMT2')"> <strong>Convert</strong><br> | |
Fmort \uxxxx </a> </div> | |
<div class="btn"> <a href="javascript:action('RECONVERT')"> <strong>ReConvert</strong><br> | |
To 汉字 </a> </div> | |
<p> | |
</p><div id="tt" style="display:none"></div> | |
<textarea name="show2" rows="14" id="show2" style="width:99%"></textarea> | |
<p></p> | |
<script language="javascript" type="text/javascript"> | |
var oSource = document.getElementById("source"); | |
var oShow2 = document.getElementById("show2"); | |
var oTt = document.getElementById("tt"); | |
function action(pChoice){ | |
switch(pChoice){ | |
case "CONVERT_FMT1": | |
oShow2.value = ascii(oSource.value); | |
break; | |
case "CONVERT_FMT2": | |
oShow2.value = unicode(oSource.value); | |
break; | |
case "RECONVERT": | |
oShow2.value = reconvert(oSource.value); | |
break; | |
} | |
} | |
function ascii(str){ | |
return str.replace(/[^\u0000-\u00FF]/g,function($0){return escape($0).replace(/(%u)(\w{4})/gi,"\&#x$2;")}); | |
} | |
function unicode(str){ | |
return str.replace(/[^\u0000-\u00FF]/g,function($0){return escape($0).replace(/(%u)(\w{4})/gi,"\\u$2")}); | |
} | |
function reconvert(str){ | |
str = str.replace(/(\\u)(\w{4})/gi,function($0){ | |
return (String.fromCharCode(parseInt((escape($0).replace(/(%5Cu)(\w{4})/g,"$2")),16))); | |
}); | |
str = str.replace(/(&#x)(\w{4});/gi,function($0){ | |
return String.fromCharCode(parseInt(escape($0).replace(/(%26%23x)(\w{4})(%3B)/g,"$2"),16)); | |
}); | |
return str; | |
} | |
</script> | |
</body></html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment