javascript实现的简易的DatePicker日历

下面是javascript实现的简易DatePicker日历的完整攻略:

1. 前言

DatePicker(日期选择器)在web应用中是一个非常常见的功能,它可以方便用户选择指定日期,并以统一的格式显示。本文将介绍如何使用javascript实现一款简易的DatePicker。

2. 实现思路

在实现DatePicker时,我们需要做以下几个步骤:

  1. 创建一个可供选择日期的日历面板;
  2. 在输入框中添加事件,点击输入框时显示日历面板;
  3. 当用户在日历面板中选择日期时,将选中的日期显示在输入框中;
  4. 添加样式,使日历面板呈现良好的视觉效果。

3. 实现过程

3.1 创建日历面板

我们可以使用html和css来创建一个简单的日历面板。以下是一个简单的示例:

<div id="calendar">
  <div class="calendar-header">
    <a href="#" class="prev-month-btn">&lt;</a> <!-- 上一月 -->
    <span class="calendar-title"></span>
    <a href="#" class="next-month-btn">&gt;</a> <!-- 下一月 -->
  </div>
  <table>
    <thead>
      <tr>
        <th>日</th>
        <th>一</th>
        <th>二</th>
        <th>三</th>
        <th>四</th>
        <th>五</th>
        <th>六</th>
      </tr>
    </thead>
    <tbody></tbody>
  </table>
</div>
#calendar {
    position: absolute;
    z-index: 999;
    background-color: #fff;
    border: 1px solid #ccc;
    padding: 10px;
}

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

#calendar th,
#calendar td {
    text-align: center;
    padding: 5px;
}

#calendar .calendar-header {
    display: flex;
    align-items: center;
    margin-bottom: 5px;
}

#calendar .prev-month-btn,
#calendar .next-month-btn {
    border: none;
    outline: none;
    background-color: transparent;
    font-size: 16px;
    cursor: pointer;   
}

#calendar .calendar-title {
    flex: 1;
    text-align: center;
    font-size: 16px;
}

#calendar td:hover,
#calendar td.selected {
    background-color: #eee;
    cursor: pointer;
}

以上代码中我们创建了一个名为“calendar”的div元素,它包含了一个用于显示日期的表格以及上一个月和下一个月的按钮。表格中包含了日期,星期和空白单元格。

3.2 在输入框中添加事件

绑定事件是让用户可以点击输入框来选择日期的关键。我们可以使用addEventListener方法在输入框上绑定点击事件(click事件),同时在日历面板显示和隐藏时修改日历面板的显示状态。以下是示例代码:

<input type="text" id="datepicker">
const datePicker = document.getElementById('datepicker');
const calendar = document.getElementById('calendar');

datePicker.addEventListener('click', toggleCalendar);

function toggleCalendar() {
    if (calendar.style.display === 'none') {
        showCalendar();
    } else {
        hideCalendar();
    }
}

function showCalendar() {
    calendar.style.display = 'block';
}

function hideCalendar() {
    calendar.style.display = 'none';
}

以上代码中,我们使用了addEventListener方法绑定了一个点击事件,当用户点击输入框时,toggleCalendar方法将被调用。该方法用于切换日历面板的显示状态。

3.3 选择日期并将其显示在输入框中

当用户在日历面板中选择一个日期时,我们需要将选中的日期显示在输入框中。为了实现这一功能,在DatePicker中添加一个新的事件监听器方法,该方法将在日历面板中选择一个日期时被调用。

const datePicker = document.getElementById('datepicker');
const calendar = document.getElementById('calendar');

datePicker.addEventListener('click', toggleCalendar);

// 添加选择日期事件
calendar.querySelector('tbody').addEventListener('click', function (e) {
    if (e.target.tagName.toLowerCase() !== 'td') return;
    const date = e.target.dataset.date;
    datePicker.value = date;
    hideCalendar();
});

在以上代码中,我们首先使用querySelector方法选择日历面板中的tbody元素以便之后的日期选择。接着,我们给tbody元素绑定一个点击事件监听器,并将其放置于IF语句中来确保只有在点击td元素时才执行该功能。当用户点击了一个日期时,我们从所点击的td元素中检索并保存日期,接着将此日期显示在DatePicker输入框中,并通过调用hideCalendar函数隐藏日历面板。

3.4 添加样式

为了让日历面板呈现良好的视觉效果,我们可以添加样式。在本示例中,我们使用了简单的CSS样式,可以通过修改样式表来更改DatePicker的外观。

4. 示例说明

4.1 示例1

以下是一个完整的代码示例,它使用了上述的实现思路,并且可以在浏览器中直接运行。

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>DatePicker示例</title>
        <style>
            /* 样式代码 */
        </style>
    </head>
    <body>
        <input type="text" id="datepicker">

        <div id="calendar">
          <div class="calendar-header">
            <a href="#" class="prev-month-btn">&lt;</a>
            <span class="calendar-title"></span>
            <a href="#" class="next-month-btn">&gt;</a>
          </div>
          <table>
            <thead>
              <tr>
                <th>日</th>
                <th>一</th>
                <th>二</th>
                <th>三</th>
                <th>四</th>
                <th>五</th>
                <th>六</th>
              </tr>
            </thead>
            <tbody></tbody>
          </table>
        </div>

        <script>
            const datePicker = document.getElementById('datepicker');
            const calendar = document.getElementById('calendar');

            datePicker.addEventListener('click', toggleCalendar);

            calendar.querySelector('tbody').addEventListener('click', function (e) {
                if (e.target.tagName.toLowerCase() !== 'td') return;
                const date = e.target.dataset.date;
                datePicker.value = date;
                hideCalendar();
            });

            function toggleCalendar() {
                if (calendar.style.display === 'none') {
                    showCalendar();
                } else {
                    hideCalendar();
                }
            }

            function showCalendar() {
                calendar.style.display = 'block';
            }

            function hideCalendar() {
                calendar.style.display = 'none';
            }
        </script>
    </body>
</html>

4.2 示例2

以下是一个代码示例,它演示了如何使用动态创建的元素来实现DatePicker。请注意,这仅用于演示,并不是最佳实践。

const datePicker = document.createElement('input');
datePicker.type = 'text';
document.body.appendChild(datePicker);

const calendar = document.createElement('div');
calendar.id = 'calendar';
document.body.appendChild(calendar);

const tbody = document.createElement('tbody');
calendar.appendChild(tbody);

createCalendar(new Date().getFullYear(), new Date().getMonth());

datePicker.addEventListener('click', toggleCalendar);

calendar.querySelector('tbody').addEventListener('click', function (e) {
    if (e.target.tagName.toLowerCase() !== 'td') return;
    const date = e.target.dataset.date;
    datePicker.value = date;
    hideCalendar();
});

function toggleCalendar() {
    if (calendar.style.display === 'none') {
        showCalendar();
    } else {
        hideCalendar();
    }
}

function showCalendar() {
    calendar.style.display = 'block';
}

function hideCalendar() {
    calendar.style.display = 'none';
}

function createCalendar(year, month) {
    // 创建标题
    const calendarTitle = document.createElement('span');
    calendarTitle.classList.add('calendar-title');
    calendar.appendChild(calendarTitle);

    // 创建表格
    const table = document.createElement('table');
    calendar.appendChild(table);

    // 创建表头
    const thead = document.createElement('thead');
    const daysOfWeek = ['日', '一', '二', '三', '四', '五', '六'];
    let row = document.createElement('tr');

    for (let dayOfWeek of daysOfWeek) {
        let th = document.createElement('th');
        th.textContent = dayOfWeek;
        row.appendChild(th);
    }

    thead.appendChild(row);
    table.appendChild(thead);

    // 创建表体
    const tbody = document.createElement('tbody');
    table.appendChild(tbody);

    const daysInMonth = new Date(year, month + 1, 0).getDate(); // 获取当前月份的天数

    let day = 1;
    let row = document.createElement('tr');

    for (let i = 1; i <= daysInMonth; i++) { // 将每一天添加为一个单元格
        let td = document.createElement('td');
        td.textContent = i;
        td.dataset.date = `${year}-${month + 1}-${i}`;
        row.appendChild(td);

        if (new Date(year, month, i).getDay() === 6 && i !== daysInMonth) { // 如果是星期六,就新建一个行
            tbody.appendChild(row);
            row = document.createElement('tr');
        } else if (i === daysInMonth) { // 将最后一行单元格填满
            for (let j = 0; j < 7 - new Date(year, month, i).getDay() - 1; j++) {
                let td = document.createElement('td');
                td.textContent = ++day;
                td.dataset.date = `${year}-${month + 2}-${day}`;
                row.appendChild(td);
            }
            tbody.appendChild(row);
        }
    }
    // 设置标题
    calendarTitle.textContent = `${year}-${month + 1}`;
}

在以上示例中,我们使用了createElement方法创建了一个新的input元素和一个新的日历面板。之后,我们用createCalendar方法为日历面板添加了标题、表格头、表格体,并用单元格填充了表格。在创建完整的DOM结构后,我们为input元素添加了单击事件监听器,并用toggleCalendar和hideCalendar方法控制日历面板的显示和隐藏。通过为tbody元素添加了单击事件监听器,我们还从日历面板获取选定的日期并将其显示在输入框中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript实现的简易的DatePicker日历 - Python技术站

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

相关文章

  • JavaScript 全面解析各种浏览器网页中的JS 执行顺序

    JavaScript 全面解析各种浏览器网页中的JS 执行顺序 前言 JavaScript 是一种动态的、弱类型的脚本语言,广泛应用于网页开发、服务器端开发等领域。在网页中,JavaScript 被用来控制页面的行为、交互和动态效果。在不同的浏览器中,JavaScript 的执行顺序会有所差异,这给开发者带来了一定的困扰。本文将详细讲解 JavaScript…

    JavaScript 2023年5月27日
    00
  • JavaScript中字符串(string)转json的2种方法

    下面我将详细讲解一下“JavaScript中字符串(string)转json的2种方法”。 背景知识 在JavaScript中,JSON是一种轻量级的数据交换格式,通常用于浏览器和服务器之间的数据传输。在实际开发中,我们需要将一些数据转换成JSON格式来进行传输,而字符串则是最常见的一种数据类型。那么如何将字符串转换成JSON格式呢? 方法一:使用JSON.…

    JavaScript 2023年5月27日
    00
  • 用js读写cookie的简单方法(推荐)

    以下是详细讲解“用js读写cookie的简单方法(推荐)”的完整攻略: 1. 什么是cookie 1.1 定义 cookie 是一种在客户端存储数据的小文件。在 HTTP 协议中,Web 服务器可以向客户端发送一个 Set-Cookie 的响应头,来告诉客户端保存这个 cookie。之后客户端每次请求响应都会带上这个 cookie,用来告诉服务器用户是谁。 …

    JavaScript 2023年6月11日
    00
  • JavaScript比较两个对象是否相等的方法

    如何比较两个JavaScript对象是否相等是一个相对复杂的问题。JavaScript提供了几种方法来比较两个对象,但每种方法都有自己的限制和局限性。这里将介绍其中三种最常用的方法来比较对象是否相等。 1. 使用JSON.stringify()方法 JSON.stringify()方法是将一个JavaScript对象转换为一个JSON字符串的方法。我们可以使…

    JavaScript 2023年5月27日
    00
  • 利用JavaScript脚本实现滚屏效果的方法

    下面是实现滚屏效果的方法的完整攻略: 利用JavaScript脚本实现滚屏效果的方法 基本思路 我们可以通过监听鼠标或者触摸事件,根据移动的距离来控制页面滚动的位置,从而实现滚屏效果。具体的步骤如下: 监听鼠标或者触摸事件,获取开始移动时的位置和移动的距离。 根据移动的距离计算需要滚动的距离。 利用window.scrollTo()函数来滚动页面的位置。 处…

    JavaScript 2023年6月10日
    00
  • 在页面中引入js的两种方法(推荐)

    在页面中引入JavaScript脚本有两种主要的方法,分别是通过script标签嵌入JavaScript代码和通过外部文件引入JavaScript代码。 嵌入JavaScript代码 要嵌入JavaScript代码,我们可以使用<script>标签来完成,在<script>标签中写入JavaScript代码,将其嵌入HTML页面即可。…

    JavaScript 2023年5月27日
    00
  • Javascript & DHTML DOM基础和基本API第5/5页

    《Javascript & DHTML DOM基础和基本API》是一本介绍JavaScript和DHTML的书籍,其中包含了JavaScript和DHTML DOM的基础和API,本攻略将对第5/5页进行详细解读。 1. 什么是DOM? DOM(Document Object Model)是HTML和XML文档的编程接口,它将整个页面抽象成一个树状结…

    JavaScript 2023年6月10日
    00
  • JavaScript 七大技巧(二)

    JavaScript 七大技巧(二)主要涉及对于代码的优化和简化。它们不仅可以提高代码的执行效率,还可以让代码更容易理解和维护。 在本文中,我们将深入探讨七个关键的技巧,并提供一些实际示例,帮助你更好地理解它们的应用。 1. 使用三元运算符简化代码 三元运算符是一种可以替代if/else语句的简单方式,它可以在单个语句中执行条件判断,并返回两个不同的值。下面…

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