純javascript制作日歷控件
以前要用到日歷控件都是直接從網(wǎng)上下載一套源碼來(lái)使用,心里一直有個(gè)梗,就是想自己動(dòng)手寫一個(gè)日歷控件,最近剛好來(lái)了興趣,時(shí)間上也允許,于是自己摸索寫了一個(gè),功能還算完善,界面就湊合了??赡茏钪档谜f(shuō)的一點(diǎn)就是讓input控件內(nèi)部右邊顯示一個(gè)按鈕,我是直接給input加了個(gè)背景,然后把input的邊框去掉實(shí)現(xiàn)的。
這個(gè)是最初版的,再往后打算做出純javascript版的,再往后打算用JQuery做一套。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>日歷控件</title>
<style>
#date_text {
background-image: url(images/input.png);
background-repeat:no-repeat;
width: 198px;
height: 27px;
border:none;
padding-left:5px;
cursor:pointer;
}
#cal_body {
width: 198px;
height: auto;
overflow:hidden;
border: solid 1px #CCCCCC;
display: none;
position:absolute;
z-index:10;
}
.line {
width:100%;
height:26px;
float:left;
background-color:#0FF;
font-size:14px;
}
.cube {
float:left;
width:26px;
height:26px;
line-height:26px;
text-align:center;
margin-left:2px;
margin-bottom:2px;
}
.btn {
float:left;
background-color:#CCC;
margin-left:10px;
width:20px;
height:20px;
text-align:center;
line-height:20px;
border-radius:3px;
border:solid 1px;
margin-top:2px;
cursor:pointer;
}
.year_month {
float:left;
margin-left:10px;
width:90px;
height:19px;
text-align:center;
line-height:19px;
border-radius:6px;
}
.end_tag {
height:26px;
line-height:26px;
margin-left:10px;
}
</style>
<script>
Date.prototype.toFormatString = function(){
var result = this.getFullYear() + "-" + (this.getMonth() + 1) + "-" + this.getDate();
return result;
};
var today = new Date();
var month_big = new Array("1","3","5","7","8","10","12"); //包含所有大月的數(shù)組
var month_small = new Array("4","6","9","11"); //包含所有小月的數(shù)組
//判斷數(shù)組array中是否包含元素obj的函數(shù),包含則返回true,不包含則返回false
function array_contain(array, obj){
for (var i = 0; i < array.length; i++){
if (array[i] == obj)
return true;
}
return false;
}
//判斷年份year是否為閏年,是閏年則返回true,否則返回false
function isLeapYear(year){
var a = year % 4;
var b = year % 100;
var c = year % 400;
if( ( (a == 0) && (b != 0) ) || (c == 0) ){
return true;
}
return false;
}
function hideCalendar(){
var calbody = document.getElementById("cal_body");
cal_body.style.display = "none";
}
function showCalendar(){
var calbody = document.getElementById("cal_body");
var style = getDefaultStyle(calbody,"display");
if(style == "none")
cal_body.style.display = "block";
if(style == "block")
cal_body.style.display = "none";
var date_text = document.getElementById("date_text");
var val = date_text.value;
init(val);
}
function init(val){
clearCube();
var temp_date;
var date_text = document.getElementById("date_text");
if(val == ""){
temp_date = today;
date_text.value = today.toFormatString();
}
else{
temp_date = new Date(val);
}
var year = temp_date.getFullYear();
var month = temp_date.getMonth() + 1;
var date = temp_date.getDate();
temp_date.setDate(1);
var start = temp_date.getDay() + 7;
var end;
if(array_contain(month_big, month)){
end = start + 31;
}
else if(array_contain(month_small, month)){
end = start + 30;
}
else{
if(isLeapYear(year)){
end = start + 29;
}
else{
end = start + 28;
}
}
for(var i = start; i < end; i++){
var cube = document.getElementsByClassName("cube").item(i);
cube.innerHTML = i - start + 1;
cube.style.cursor = "pointer";
cube.onmouseover = function(){
this.style.backgroundColor = '#0FF';
}
if(date == (i - start + 1))
cube.style.backgroundColor = '#0FF';
else{
cube.onmouseout = function(){
this.style.backgroundColor = '';
}
}
cube.onclick = function(){
date_text.value = year + "-" + month + "-" + this.innerHTML;
cal_body.style.display = "none";
}
}
document.getElementById("text_year").value = year;
document.getElementById("text_month").value = month;
}
function clearCube(){
for(var i=7; i < 49; i++){
var cube = document.getElementsByClassName("cube").item(i);
cube.innerHTML = "";
cube.style.backgroundColor = "";
}
}
function yearDown(){
if(isValidated()){
var old_year = parseInt(document.getElementById("text_year").value);
if(old_year > 1960){
var year = old_year - 1;
var month = parseInt(document.getElementById("text_month").value);
var val = year + "-" + month + "-" + 1;
init(val);
}
}
}
function yearUp(){
if(isValidated()){
var old_year = parseInt(document.getElementById("text_year").value);
if(old_year < 2050){
var year = old_year + 1;
var month = parseInt(document.getElementById("text_month").value);
var val = year + "-" + month + "-" + 1;
init(val);
}
}
}
function monthDown(){
if(isValidated()){
var old_month = parseInt(document.getElementById("text_month").value)
if(old_month > 1){
var year = parseInt(document.getElementById("text_year").value);
var month = old_month - 1;
var val = year + "-" + month + "-" + 1;
init(val);
}
else {
var year = parseInt(document.getElementById("text_year").value) - 1;
var month = 12;
var val = year + "-" + month + "-" + 1;
init(val);
}
}
}
function monthUp(){
if(isValidated()){
var old_month = parseInt(document.getElementById("text_month").value)
if(old_month < 12){
var year = parseInt(document.getElementById("text_year").value);
var month = parseInt(document.getElementById("text_month").value) + 1;
var val = year + "-" + month + "-" + 1;
init(val);
}
else {
var year = parseInt(document.getElementById("text_year").value) + 1;
var month = 1;
var val = year + "-" + month + "-" + 1;
init(val);
}
}
}
function isValidated(){
var year = document.getElementById("text_year").value;
var month = document.getElementById("text_month").value;
if(isNaN(year) || isNaN(month)){
alert("請(qǐng)輸入正確的年份/月份");
return false;
}
else{
if(year%1 != 0 || month%1 != 0){
alert("請(qǐng)輸入正確的年份/月份");
return false;
}
else{
year = parseInt(year);
if(year < 1960 || year > 2050){
alert("請(qǐng)輸入1960~2050之間的年份!");
return false;
}
else if(month < 1 || month >12){
alert("請(qǐng)輸入正確的月份!");
return false;
}
else{
return true;
}
}
}
}
function changed(){
if(isValidated()){
var year = document.getElementById("text_year").value;
var month = document.getElementById("text_month").value;
var val = year + "-" + month + "-" + 1;
init(val);
}
}
function getDefaultStyle(obj,attribute){
return obj.currentStyle?obj.currentStyle[attribute]:document.defaultView.getComputedStyle(obj,false)[attribute];
}
</script>
</head>
<body>
<div id="container">
<div id="input_bg"><input id="date_text" type="text" readonly onClick="showCalendar()" /></div>
<div id="cal_body">
<div class="line"><div class="btn" id="year_down" onClick="yearDown()">-</div><input class="year_month" id="text_year" value="2015" onChange="changed()"><div class="btn" id="year_up" onClick="yearUp()">+</div><span class="end_tag">年</span></div>
<div class="line"><div class="btn" id="month_down" onClick="monthDown()">-</div><input class="year_month" id="text_month" value="5" onChange="changed()"><div class="btn" id="month_up" onClick="monthUp()">+</div><span class="end_tag">月</span></div>
<div class="cube">日</div>
<div class="cube">一</div>
<div class="cube">二</div>
<div class="cube">三</div>
<div class="cube">四</div>
<div class="cube">五</div>
<div class="cube">六</div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
</div>
<div>
</body>
</html>
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
基于Bootstrap里面的Button dropdown打造自定義select
這篇文章主要介紹了基于Bootstrap里面的Button dropdown打造自定義select的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05
javascript中的void運(yùn)算符語(yǔ)法及使用介紹
void是javascript中的一個(gè)操作符,void會(huì)計(jì)算表達(dá)式的值,但是會(huì)丟棄表達(dá)式的返回值接下來(lái)將詳細(xì)介紹下,感興趣的你可以參考下或許對(duì)你有所幫助2013-03-03
JavaScript 冒泡排序和選擇排序的實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了js冒泡排序和選擇排序的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-09-09
JavaScript中連接操作Oracle數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要介紹了JavaScript中連接操作Oracle數(shù)據(jù)庫(kù)實(shí)例,本文講解了運(yùn)行環(huán)境、代碼實(shí)例、運(yùn)行結(jié)果等一系列完整步驟,需要的朋友可以參考下2015-04-04
javascript實(shí)現(xiàn)的元素拖動(dòng)函數(shù)宿主為瀏覽器
這篇文章主要介紹了javascript實(shí)現(xiàn)的元素拖動(dòng),將相應(yīng)的元素對(duì)象的引用傳到函數(shù)中2014-07-07
window.event.srcElement 得到事件源對(duì)象
window.event.srcElement 得到事件源對(duì)象代碼,大家可以參考腳本之家以前發(fā)的代碼,多瀏覽兼容的。2009-05-05
利用jsonp與代理服務(wù)器方案解決跨域問(wèn)題
這篇文章主要給大家介紹了關(guān)于利用jsonp與代理服務(wù)器方案解決跨域問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
全面了解函數(shù)聲明與函數(shù)表達(dá)式、變量提升
下面小編就為大家?guī)?lái)一篇全面了解函數(shù)聲明與函數(shù)表達(dá)式、變量提升。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
使用typescript改造koa開(kāi)發(fā)框架的實(shí)現(xiàn)
這篇文章主要介紹了使用typescript改造koa開(kāi)發(fā)框架的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02

