javascript实现日历控件(年月日关闭按钮)

yizhihongxing

实现一个完整的日历控件包括以下几个步骤:

  1. 创建HTML结构

在HTML文件中创建一个日历控件的容器,例如:

<div id="calendar">
  <div class="header">
    <span class="prev">&lt;</span>
    <span class="currentDate"></span>
    <span class="next">&gt;</span>
    <span class="close">X</span>
  </div>
  <div class="content"></div>
</div>

其中,容器id为calendar,包含一个头部(header)和内容区(content)。头部包含当前日期、上一个月、下一个月和关闭按钮。

  1. 添加CSS样式

为日历控件添加样式,例如:

#calendar {
  position: absolute;
  width: 240px;
  height: 220px;
  background-color: #fff;
  border: 1px solid #ccc;
  box-shadow: 2px 2px 3px rgba(0,0,0,.3);
  font-size: 12px;
  color: #333;
}

#calendar .header {
  height: 30px;
  line-height: 30px;
  text-align: center;
  background-color: #f5f5f5;
  border-bottom: 1px solid #ccc;
}

#calendar .header span {
  display: inline-block;
  width: 30px;
  cursor: pointer;
}

#calendar .content {
  padding: 10px;
  text-align: center;
}

#calendar table {
  width: 100%;
  border-collapse: collapse;
}

#calendar th,
#calendar td {
  padding: 5px;
}

#calendar td:hover {
  background-color: #f5f5f5;
  cursor: pointer;
}

#calendar td.selected {
  background-color: #337ab7;
  color: #fff;
}
  1. 加载JavaScript文件

在HTML文件中加载JavaScript文件,例如:

<script src="calendar.js"></script>
  1. 编写JavaScript代码

在JavaScript文件中编写日历控件的相关代码,例如:

var Calendar = function (id) {
  this.container = document.getElementById(id);
  this.currentDate = new Date();
  this.buildCalendar();
};

Calendar.prototype.buildCalendar = function () {
  // 清空之前的内容
  this.container.querySelector('.content').innerHTML = '';

  // 创建头部
  var header = this.createHeader();
  this.container.querySelector('.header').appendChild(header);

  // 创建表格
  var table = this.createTable();
  this.container.querySelector('.content').appendChild(table);

  // 绑定事件
  var self = this;
  this.container.querySelector('.prev').addEventListener('click', function () { self.gotoPrevMonth(); });
  this.container.querySelector('.next').addEventListener('click', function () { self.gotoNextMonth(); });
  this.container.querySelector('.close').addEventListener('click', function () { self.closeCalendar(); });
  var tds = this.container.querySelectorAll('td');
  for (var i = 0; i < tds.length; i++) {
    tds[i].addEventListener('click', function () { self.selectDate(this); });
  }
};

Calendar.prototype.createHeader = function () {
  var header = document.createElement('div');
  var prev = document.createElement('span');
  var next = document.createElement('span');
  var close = document.createElement('span');
  var currentDate = document.createElement('span');
  prev.innerHTML = '&lt;';
  next.innerHTML = '&gt;';
  close.innerHTML = 'X';
  currentDate.innerHTML = this.currentDate.getFullYear() + '年' + (this.currentDate.getMonth() + 1) + '月';
  currentDate.className = 'currentDate';
  prev.className = 'prev';
  next.className = 'next';
  close.className = 'close';
  header.appendChild(prev);
  header.appendChild(currentDate);
  header.appendChild(next);
  header.appendChild(close);
  return header;
};

Calendar.prototype.createTable = function () {
  var table = document.createElement('table');
  var thead = document.createElement('thead');
  var tbody = document.createElement('tbody');

  // 创建星期几的表头
  var weekDays = ['日', '一', '二', '三', '四', '五', '六'];
  var tr = document.createElement('tr');
  for (var i = 0; i < weekDays.length; i++) {
    var th = document.createElement('th');
    th.innerHTML = weekDays[i];
    tr.appendChild(th);
  }
  thead.appendChild(tr);

  // 创建日期的表格
  var firstDay = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), 1);
  var lastDay = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() + 1, 0);
  var daysInMonth = lastDay.getDate();
  var dayOfWeek = firstDay.getDay();
  var date = 1;
  var selectedDate = null;
  for (var i = 0; i < 6; i++) {
    var tr = document.createElement('tr');
    for (var j = 0; j < 7; j++) {
      var td = document.createElement('td');
      if (i === 0 && j < dayOfWeek) {
        // 上个月的日期
        var prevMonthLastDay = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), 0);
        td.innerHTML = prevMonthLastDay.getDate() - (dayOfWeek - j - 1);
        td.className = 'inactive';
      } else if (date > daysInMonth) {
        // 下个月的日期
        td.innerHTML = date - daysInMonth;
        td.className = 'inactive';
        date++;
      } else {
        td.innerHTML = date;
        date++;
      }

      if (td.innerHTML === selectedDate) {
        td.className = 'selected';
      }
      tr.appendChild(td);
    }
    tbody.appendChild(tr);
  }
  table.appendChild(thead);
  table.appendChild(tbody);
  return table;
};

Calendar.prototype.gotoPrevMonth = function () {
  this.currentDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() - 1, 1);
  this.buildCalendar();
};

Calendar.prototype.gotoNextMonth = function () {
  this.currentDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() + 1, 1);
  this.buildCalendar();
};

Calendar.prototype.selectDate = function (td) {
  var currentDate = this.currentDate.getFullYear() + '-' + (this.currentDate.getMonth() + 1) + '-' + td.innerHTML;
  console.log(currentDate);
};

Calendar.prototype.closeCalendar = function () {
  this.container.style.display = 'none';
};

以上是一个基本的日历控件的JavaScript代码,在这个控件中提供了选择日期、关闭控件、上一个月、下一个月等功能。可以在需要的页面中实例化该控件,并调用相应方法进行日期的选择。

以下是一个示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>JavaScript实现日历控件示例</title>
  <style>
    #calendar {
      position: absolute;
      width: 240px;
      height: 220px;
      background-color: #fff;
      border: 1px solid #ccc;
      box-shadow: 2px 2px 3px rgba(0,0,0,.3);
      font-size: 12px;
      color: #333;
    }

    #calendar .header {
      height: 30px;
      line-height: 30px;
      text-align: center;
      background-color: #f5f5f5;
      border-bottom: 1px solid #ccc;
    }

    #calendar .header span {
      display: inline-block;
      width: 30px;
      cursor: pointer;
    }

    #calendar .content {
      padding: 10px;
      text-align: center;
    }

    #calendar table {
      width: 100%;
      border-collapse: collapse;
    }

    #calendar th,
    #calendar td {
      padding: 5px;
    }

    #calendar td:hover {
      background-color: #f5f5f5;
      cursor: pointer;
    }

    #calendar td.selected {
      background-color: #337ab7;
      color: #fff;
    }
  </style>
</head>
<body>
  <input type="text" id="date" />
  <div id="calendar">
    <div class="header">
      <span class="prev">&lt;</span>
      <span class="currentDate"></span>
      <span class="next">&gt;</span>
      <span class="close">X</span>
    </div>
    <div class="content"></div>
  </div>
  <script src="calendar.js"></script>
  <script>
    var dateInput = document.getElementById('date');
    dateInput.addEventListener('click', function () {
      var calendar = new Calendar('calendar');
      calendar.container.style.display = 'block';
    });
  </script>
</body>
</html>

以上示例中,为页面中的input元素绑定了点击事件,当点击该元素时,实例化了一个日历控件,并显示在页面上。通过这个控件选择的日期可以在控制台中查看。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript实现日历控件(年月日关闭按钮) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript数组实例的9个方法

    下面我来为您详细讲解JavaScript数组实例的9个方法: 1. push() arr.push(item1, item2, …, itemX); push() 方法向数组的末尾添加一个或多个元素,并返回新的长度。示例代码如下: let arr = [1, 2, 3]; // 向数组末尾添加元素4 arr.push(4); console.log(ar…

    JavaScript 2023年5月27日
    00
  • JavaScript比较同一天的时间大小实例代码

    在JavaScript中,可以使用Date对象来比较同一天的时间大小。以下是完整的攻略。 1. 创建Date对象 在比较和取得时间大小之前,需要先创建两个不同的Date对象表示不同的时间。可以使用以下方式创建Date对象: const date1 = new Date(‘2021-11-01 12:00:00’); const date2 = new Dat…

    JavaScript 2023年5月27日
    00
  • 浅谈ajax请求技术

    浅谈Ajax请求技术攻略 什么是Ajax请求技术? Ajax是“Asynchronous Javascript And Xml”的缩写,即异步JavaScript和XML。它使得在页面无需刷新的情况下,与服务器进行数据交互成为可能。正式的定义是:通过JavaScript的XMLHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用JavaS…

    JavaScript 2023年6月11日
    00
  • js中通过getElementsByName访问name集合对象的方法

    获取name集合对象是DOM中的常见操作之一,使用getElementsByName方法可以获取到相应名字的元素节点集合。下面为大家提供选定属性值的两条示例说明: 语法说明 getElementsByName方法通过指定元素的name特定属性来获取文档中具有相同name属性值的元素集合。其基本语法如下: var elements = document.get…

    JavaScript 2023年6月10日
    00
  • JS原型prototype和__proto__用法实例分析

    来讲一下JS原型prototype和__proto__用法的攻略。 1. 前置知识 在开始之前,需要了解一些前置知识: JavaScript中所有对象的原型都是 Object.prototype,它包含了常用的方法如 toString()、valueOf() 等。 每个 JavaScript 对象都有一个 __proto__ 属性,指向它的原型对象。这个属性…

    JavaScript 2023年6月10日
    00
  • javascript自启动函数的问题探讨

    让我详细讲解一下“JavaScript自启动函数的问题探讨”的完整攻略。 什么是JavaScript自启动函数? JavaScript自启动函数是一种匿名自执行的函数,它可以把代码封装在函数作用域中,从而避免变量污染和命名冲突的问题。 在JavaScript中,我们可以使用两种方式来创建自启动函数: 1. 使用函数表达式 (function() { // 这…

    JavaScript 2023年6月10日
    00
  • 原生javascript模仿win8等待提示圆圈进度条

    让我来详细讲解一下“原生javascript模仿win8等待提示圆圈进度条”的完整攻略。 1. 初始HTML结构 首先,在HTML中定义一个div容器作为等待提示圆圈进度条的载体,如下所示: <div id="spinner"></div> 2. CSS样式 接着,我们需要定义CSS样式来实现圆形线条的旋转动画效果…

    JavaScript 2023年6月11日
    00
  • JS将时间秒转换成天小时分钟秒的字符串

    要将时间秒转换成天小时分钟秒的字符串,可以分别计算出总共的天数、小时数、分钟数和剩余的秒数,并将其拼接成字符串。 下面是一条完整的攻略: 步骤1:计算总共的天数 首先,我们可以将总的时间秒转换成天数,可以使用以下公式: var day = Math.floor(seconds / (3600 * 24)); 这里使用了 Math.floor() 方法来将结果…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部