基于jquery实现日历签到功能

yizhihongxing

第一步:准备工作

在实现日历签到功能之前,我们需要先准备一些工作:

  1. 安装jQuery: 在HTML文件中引入jQuery的库文件
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
  1. 编写HTML结构:
<div class="calendar"></div>
  1. 确定签到状态:签到状态一般为两种状态,已签到和未签到状态,我们可以用CSS样式来表示这两种状态,比如,未签到状态为灰色,已签到状态为橙色。
.today { //今天
    color: #fff;
    background-color: #17beff;
    border-radius: 50%;
}

.sign-in { //已签到
    color: #fff;
    background-color: #FF7200;
    border-radius: 50%;
}

.not-sign-in { //未签到
    color: #666;
    border-radius: 50%;
}

第二步:实现日历签到功能

  1. 获取当前日期,并且呈现在日历中。签到日历中最主要的部分就是日历主体,如何构建一个日历呢?我们可以通过JavaScript来构建。
function drawCalendar(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    var date = today.getDate();
    $(".calendar").html("");
    $(".calendar").append('<div class="title">'+year+'年'+month+'月</div>');
}
  1. 显示符合规则的日期,并且判断是否签到。我们可以通过ajax获取已经签到的日期列表
function drawCalendar(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    var date = today.getDate();

    // ajax获取已经签到的日期列表
    var signInList = ["2021-01-01", "2021-01-02"];

    $(".calendar").html("");
    $(".calendar").append('<div class="title">'+year+'年'+month+'月</div>');
    // To-Do: 显示符合规则的日期,并且判断是否签到
}

我们可以通过对比当前日期,以及已经签到的日期,来判断哪些日期已经签到了,并且更新日历的样式。

function drawCalendar(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    var date = today.getDate();

    // ajax获取已经签到的日期列表
    var signInList = ["2021-01-01", "2021-01-02"];

    $(".calendar").html("");
    $(".calendar").append('<div class="title">'+year+'年'+month+'月</div>');

    // 构建日历表格
    var table = $('<table></table>').addClass('table');
    var weekHead = '<thead><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr></thead>';
    table.append(weekHead);

    // 构建日历的主体内容
    var tbody = $('<tbody></tbody>');

    var days = new Date(year, month, 0).getDate(); //获取本月有多少天
    var week = new Date(year, month-1, 1).getDay(); //获取本月第一天是周几
    var tr = $('<tr></tr>');
    for(var i = 0; i<week; i++){
        tr.append('<td></td>');
    }
    for(var i = 1; i<=days; i++){
        var td = $('<td></td>');
        if(signInList.includes(year+'-'+month+'-'+i)){
            td.addClass('sign-in').html(i);
        }else if(i==date){
            td.addClass('today').html(i);
        }else{
            td.addClass('not-sign-in').html(i);
        }
        tr.append(td);
        if(i%7==0){
            tbody.append(tr);
            tr = $('<tr></tr>');
        }
    }
    tbody.append(tr);
    table.append(tbody);
    $(".calendar").append(table);
}

第三步:完整代码

HTML代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>日历签到功能</title>
    <link rel="stylesheet" href="styles.css">
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script src="calendar.js"></script>
</head>
<body>
    <div class="calendar"></div>
</body>
</html>

CSS代码:

.today {
    color: #fff;
    background-color: #17beff;
    border-radius: 50%;
}

.sign-in {
    color: #fff;
    background-color: #FF7200;
    border-radius: 50%;
}

.not-sign-in {
    color: #666;
    border-radius: 50%;
}

JavaScript代码:

$(document).ready(function(){
    drawCalendar();
});

function drawCalendar(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    var date = today.getDate();

    // ajax获取已经签到的日期列表
    var signInList = ["2021-01-01", "2021-01-02"];

    $(".calendar").html("");
    $(".calendar").append('<div class="title">'+year+'年'+month+'月</div>');

    // 构建日历表格
    var table = $('<table></table>').addClass('table');
    var weekHead = '<thead><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr></thead>';
    table.append(weekHead);

    // 构建日历的主体内容
    var tbody = $('<tbody></tbody>');

    var days = new Date(year, month, 0).getDate(); //获取本月有多少天
    var week = new Date(year, month-1, 1).getDay(); //获取本月第一天是周几
    var tr = $('<tr></tr>');
    for(var i = 0; i<week; i++){
        tr.append('<td></td>');
    }
    for(var i = 1; i<=days; i++){
        var td = $('<td></td>');
        if(signInList.includes(year+'-'+month+'-'+i)){
            td.addClass('sign-in').html(i);
        }else if(i==date){
            td.addClass('today').html(i);
        }else{
            td.addClass('not-sign-in').html(i);
        }
        tr.append(td);
        if(i%7==0){
            tbody.append(tr);
            tr = $('<tr></tr>');
        }
    }
    tbody.append(tr);
    table.append(tbody);
    $(".calendar").append(table);
}

上面代码的功能就是实现一个基于jquery实现日历签到功能的完整攻略,代码注释详细,实现方便,下面我们来看下实现过程中的示例的应用。

示例1:

现在我们用ajax来获取签到的日期列表,如下所示:

function drawCalendar(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    var date = today.getDate();

    // ajax获取已经签到的日期列表
    $.ajax({
        url: "signInList.json",
        async: false,
        success: function(data){
            var signInList = data;
        }
    });

    $(".calendar").html("");
    $(".calendar").append('<div class="title">'+year+'年'+month+'月</div>');

    // 构建日历表格
    var table = $('<table></table>').addClass('table');
    var weekHead = '<thead><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr></thead>';
    table.append(weekHead);

    // 构建日历的主体内容
    var tbody = $('<tbody></tbody>');

    var days = new Date(year, month, 0).getDate(); //获取本月有多少天
    var week = new Date(year, month-1, 1).getDay(); //获取本月第一天是周几
    var tr = $('<tr></tr>');
    for(var i = 0; i<week; i++){
        tr.append('<td></td>');
    }
    for(var i = 1; i<=days; i++){
        var td = $('<td></td>');
        if(signInList.includes(year+'-'+month+'-'+i)){
            td.addClass('sign-in').html(i);
        }else if(i==date){
            td.addClass('today').html(i);
        }else{
            td.addClass('not-sign-in').html(i);
        }
        tr.append(td);
        if(i%7==0){
            tbody.append(tr);
            tr = $('<tr></tr>');
        }
    }
    tbody.append(tr);
    table.append(tbody);
    $(".calendar").append(table);
}

在HTML代码中的calendar.js文件中,我们通过ajax获取signInList.json文件中的已经签到的日期列表,并且通过上述代码,生成签到日历。

存放已经签到的日期列表的signInList.json文件内容如下:

["2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04"]

示例2:

现在,我们希望用户点击签到按钮之后,可以将今天的日期添加到signInList.json文件中。

修改calendar.js中的代码,如下所示:

$(document).ready(function(){
    drawCalendar();

    $(".calendar").on("click", ".not-sign-in", function(){
        signIn($(this));
    })
});

function signIn(obj){
    // 获取当前日期
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    var date = today.getDate();

    // 添加到signInList.json文件中
    $.ajax({
        url: "signInList.json",
        async: false,
        success: function(data){
            var signInList = data;
            // 判断今天是否已经签到,如果没有签到则添加
            if(!signInList.includes(year+'-'+month+'-'+date)){
                signInList.push(year+'-'+month+'-'+date);
            }
            $.ajax({
                type: "POST",
                url: "saveSignInList.php",
                data: {signInList: JSON.stringify(signInList)},
                async: false,
                success: function(data){
                   obj.addClass('sign-in').removeClass('not-sign-in');
                   obj.html(date);
                }
            });
        }
    });
}

通过上述代码,我们可以实现向signInList.json文件中添加今天的日期,并且返回信息更新签到日历。

但是,在这之前,我们需要将signInList.json文件中的内容进行更改,而且添加到signInList.json文件中的日期并不是持久化的。因此我们需要通过php文件来保存signInList.json文件的更改,如下所示:

<?php
$file = "signInList.json";
if(isset($_POST['signInList'])){
    $signInList = json_decode($_POST['signInList']);
    $json = json_encode($signInList, JSON_UNESCAPED_UNICODE);
    file_put_contents($file, $json);
    echo 'ok';
}
?>

在上述php文件中,我们获取到通过ajax传递进来的signInList字符串,将其解析成数据,并且用file_put_contents()函数来将其保存为signInList.json文件内容。

注意:

  1. 本文的实例为了便于演示,没有使用数据库来存储数据,而是将数据存在了signInList.json文件中。

  2. 在使用ajax进行数据更新时,安全性、并发性的问题需要考虑到。

  3. signInList.json文件需要保证可写权限才可以进行写入。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于jquery实现日历签到功能 - Python技术站

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

相关文章

  • jQWidgets jqxGrid getselectedcell()方法

    以下是关于“jQWidgets jqxGrid getselectedcell()方法”的完整攻略,包含两个示例说明: 方法简介 jqxGrid 控件的 getcell() 方法用于获取当前中单元格的信息。该方法的语法如下: $("#jqxGrid").jqxGrid(‘getselectedcell’); 在上述语法中,#jqxGrid…

    jquery 2023年5月10日
    00
  • jQuery has()的例子

    以下是关于jQuery中has()方法的完整攻略: 什么是has()方法? 在jQuery中,has()方法用于选择包含指定后代元素的元素。它可以在指定的元素内部查找匹配的元素,返回一个包含匹配元素的jQuery对象。 如何使用has()方法? 可以使用以下代码来使用has()方法: $(selector).has(filter) 其中,selector是要…

    jquery 2023年5月12日
    00
  • jquery.cookie() 方法的使用(读取、写入、删除)

    首先,jquery.cookie() 方法是 jQuery 官方插件 jQuery.cookie 中的方法。它用于读取、写入和删除 cookie。 1.读取 cookie 为了读取 cookie,你可以使用以下语法: $.cookie("cookiename"); 其中,”cookiename” 是你要读取的 cookie 的名称。 下面…

    jquery 2023年5月27日
    00
  • jQWidgets的jqxNotification不透明度属性

    以下是关于 jQWidgets jqxNotification 组件中 opacity 属性的详细攻略。 jQWidgets jqxNotification opacity 属性 jQWidgets jqxNotification 的 opacity 属性用于指定通知组件的不透明度。 语法 // 获取 opacity 属性值 var opacity = $(…

    jquery 2023年5月12日
    00
  • 解析jquery中的ajax缓存问题

    下面是对 “解析jquery中的ajax缓存问题” 的完整攻略。 解析jquery中的ajax缓存问题 什么是Ajax缓存问题? 当我们使用 jQuery.ajax 发送一个 GET 请求时,该请求的响应结果默认是会被缓存的。而当我们发送相同的请求时,jQuery 会直接调用浏览器缓存,而不会再次向服务器请求,这可能会导致我们无法得到最新的数据。 解决方案1…

    jquery 2023年5月28日
    00
  • jQWidgets jqxListBox uncheckItem()方法

    jQWidgets jqxListBox uncheckItem()方法详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。ListBox是其中之一。本文将详细介绍jqListBox的uncheckItem()方法,包括定义、语法和示例。 uncheckItem()方法的定义 jqxListBox的checkItem()方法…

    jquery 2023年5月10日
    00
  • jQuery UI Spinner禁用选项

    以下是关于 jQuery UI Spinner 禁用选项的详细攻略: jQuery UI Spinner 禁用选项 可以使用 disabled 选项来禁用 Spinner 控件。禁用后,用户将无法与控件交互。 语法 $( ".selector" ).spinner({ disabled: true }); ` ### 示例一:禁用 Spi…

    jquery 2023年5月11日
    00
  • SpringBoot实现登录注册常见问题解决方案

    SpringBoot实现登录注册常见问题解决方案 背景 随着互联网的发展,越来越多的网站需要用户进行登录和注册,而SpringBoot作为一种快速开发框架,被越来越多的开发者所使用。本文将介绍在SpringBoot中实现登录注册时可能会遇到的常见问题及解决方案。 常见问题及解决方案 1.密码加密与验证 用户的密码是敏感信息,需要进行加密和验证。一种常见的加密…

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