欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript|3步实现列表日历(含测试源码)

程序员文章站 2022-07-14 12:49:56
...

本博文源于js基础,采用原生态javascript实现简易版日记。

测试效果

JavaScript|3步实现列表日历(含测试源码)

解决思路

  • 列表自动初始化数组
  • 根据鼠标点击列表设置监听事件
  • 监听事件中做日历的显示

分步骤代码

h5代码

<select id="yearSelect"></select>
<select id="monthSelect"></select>
<div id="box"></div>

c3代码

<style>
		table,table tr td,table tr th{
			border:1px solid #0094ff; }
		table {
			width: 200px; 
			min-height: 25px; 
			line-height: 25px;
			text-align: center;
			border-collapse: collapse;
	}  
</style>

js代码

<script type="text/javascript">
	var yearSelect = document.getElementById("yearSelect");
	var monthSelect = document.getElementById("monthSelect");
	//创建列表项
	for(var i = 1949 ; i <= 2018 ; i++){
		var oOption = document.createElement("option");
		oOption.innerText = i;
		oOption.value = i;
		yearSelect.appendChild(oOption);
	}
	for(var i = 1 ; i <= 12 ; i++){
		var oOption = document.createElement("option");
		oOption.innerText = i;
		oOption.value = i;		
		monthSelect.appendChild(oOption);
	}

	//列表项的事件监听
	var year = 2018;
	var month = 5;

	yearSelect.onchange = function(){
		year = this.value;
		createTable(year,month);
	}
	monthSelect.onchange = function(){
		month = this.value;
		createTable(year,month);
	}

	function createTable(year, month){
		// 删除之前的月历
		document.getElementById("box").innerHTML = "";
		// 月历三要素
		// 本月1号星期几
		var theMonthFirstDay = new Date(year,month - 1,1).getDay();
		// 上个月有几天(上月最后一天是几号)
		var prevMonthLastDate = new Date(year,month - 1,0).getDate();
		// 本月有几天(本月最后一天是几号)
		var theMonthLastDate = new Date(year,month,0).getDate();

		// 日期数组
		var arr = [];
		// 本月1号星期是多少,就会有多少个上月小格写在前面
		var count = 0;
		while(count != theMonthFirstDay){
			arr.unshift(prevMonthLastDate - count);
			count++;
		}
		// 本月
		count = 1;
		while(count != theMonthLastDate){
			arr.push(count);
			count++;
		}
		// 放置下月的开头的日期,凑齐42天
		count = 1;
		while(arr.length != 42){
			arr.push(count);
			count++;
		}

		//创建一个表格
		var myTable = document.createElement("table");
		//创建表头
		myTable.innerHTML = "<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>";
		//使用两层for循环嵌套动态创建表格的tr和td节点
		for(var i = 0 ; i < 6 ; i++){
			//创建tr
			var tr = document.createElement("tr");
			for(var j = 0 ; j < 7 ; j++){
				//创建td
				var td = document.createElement("td");
				//设置td内部的文本
				td.innerText = arr[i * 7 + j];
				//追加td
				tr.appendChild(td);
			}
			//追加tr
			myTable.appendChild(tr);
		}
		//追加表格
		document.getElementById("box").appendChild(myTable);
	}
</script>

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		table,tr,td,th{
			border:1px solid #333;
			border-collapse: collapse;
		}
		td{
			padding:4px;
		}
		#box{
			margin-top: 20px;
		}
	</style>
</head>
<body>
	<select id="yearSelect"></select>
	<select id="monthSelect"></select>

	<div id="box"></div>

	<script type="text/javascript">
		var yearSelect = document.getElementById("yearSelect");
		var monthSelect = document.getElementById("monthSelect");
		//创建列表项
		for(var i = 1949 ; i <= 2018 ; i++){
			var oOption = document.createElement("option");
			oOption.innerText = i;
			oOption.value = i;
			yearSelect.appendChild(oOption);
		}
		for(var i = 1 ; i <= 12 ; i++){
			var oOption = document.createElement("option");
			oOption.innerText = i;
			oOption.value = i;		
			monthSelect.appendChild(oOption);
		}

		//列表项的事件监听
		var year = 2018;
		var month = 5;

		yearSelect.onchange = function(){
			year = this.value;
			createTable(year,month);
		}
		monthSelect.onchange = function(){
			month = this.value;
			createTable(year,month);
		}

		function createTable(year, month){
			// 删除之前的月历
			document.getElementById("box").innerHTML = "";
			// 月历三要素
			// 本月1号星期几
			var theMonthFirstDay = new Date(year,month - 1,1).getDay();
			// 上个月有几天(上月最后一天是几号)
			var prevMonthLastDate = new Date(year,month - 1,0).getDate();
			// 本月有几天(本月最后一天是几号)
			var theMonthLastDate = new Date(year,month,0).getDate();

			// 日期数组
			var arr = [];
			// 本月1号星期是多少,就会有多少个上月小格写在前面
			var count = 0;
			while(count != theMonthFirstDay){
				arr.unshift(prevMonthLastDate - count);
				count++;
			}
			// 本月
			count = 1;
			while(count != theMonthLastDate){
				arr.push(count);
				count++;
			}
			// 放置下月的开头的日期,凑齐42天
			count = 1;
			while(arr.length != 42){
				arr.push(count);
				count++;
			}

			//创建一个表格
			var myTable = document.createElement("table");
			//创建表头
			myTable.innerHTML = "<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>";
			//使用两层for循环嵌套动态创建表格的tr和td节点
			for(var i = 0 ; i < 6 ; i++){
				//创建tr
				var tr = document.createElement("tr");
				for(var j = 0 ; j < 7 ; j++){
					//创建td
					var td = document.createElement("td");
					//设置td内部的文本
					td.innerText = arr[i * 7 + j];
					//追加td
					tr.appendChild(td);
				}
				//追加tr
				myTable.appendChild(tr);
			}
			//追加表格
			document.getElementById("box").appendChild(myTable);
		}
	</script>
</body>
</html>
相关标签: JS基础