面向对象实现简单日历

html页面:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>
    <title></title>
    <style>
        ._calendar_zyl{
            width: 80%;
            height: 350px;
            border: 1px solid #eee;
            padding: 10px 20px;
            position: absolute;
            top: 50px;
            margin-left: 5px;
            z-index: 999999;
        }
        ._calendar_zyl .top{
            widow:100%;
            height: 30px;
        }
        ._calendar_zyl .table{
            width: 100%;
            height: 300px;
        }
        ._calendar_zyl .fl{
            float: left;
        }
        ._calendar_zyl .preYear{
            margin-left: 20px;
        }
        ._calendar_zyl .fr{
            float: right;
        }
        ._calendar_zyl .nextYear{
            margin-right: 20px;
        }
        ._calendar_zyl .top{
            position: relative;
        }
        ._calendar_zyl .top #showCalendar{
            position: absolute;
            display: block;
            width: 70px;
            left: 50%;
            margin-left: -35px;
            text-align: center;
        }
    </style>
    <script src="calendar.js"></script>
</head>
<body>
<div class="_calendar_zyl" id="calendar">
    <div class="top"><span id="preMonth" class="fl">&lt;</span><span id="preYear" class="fl preYear">&lt;&lt;</span> <span id="showCalendar"></span><span id="nextMonth" class="fr">&gt;</span><span id="nextYear" class="fr nextYear">&gt;&gt;</span> </div>
    <table class="table" id="tb"></table>
</div>
</body>
<script>
    var cal = document.getElementById("calendar");
    var tb = document.getElementById("tb");
    var calendar = new Calendar({
        wrap:cal,
        tb:tb
    },function(ret){
        console.log(ret);
        console.log("jjjjj");
    });
</script>
</html>

js实现:

/**
 * Created by Administrator on 2015/11/18.
 */
function Calendar(param,callback_fn){
    this.wrap = param.wrap;
    this.tb = param.tb;
    this.year = 0;
    this.month = 0;
    this.dy = 0;
    this.init = function(){
        var currDate = new Date();
        this.year = currDate.getFullYear();
        this.month = currDate.getMonth();
        this.dy = currDate.getDate();
        this.initTable(currDate.getFullYear(),currDate.getMonth(),currDate.getDate());
        var self = this;
        var preMonth = document.getElementById("preMonth");
        var nextMonth = document.getElementById("nextMonth");
        var preYear = document.getElementById("preYear");
        var nextYear = document.getElementById("nextYear");
        //点击上一月触发的事件
        preMonth.addEventListener("click",function(){
            if(self.month == 0){
                self.year--;
                self.month = 11;
            }else{
                self.month--;
            }
            self.initTable(self.year,self.month,self.dy);
        });
        //点击下一月触发的事件
        nextMonth.addEventListener("click",function(){
            if(self.month == 11){
                self.year++;
                self.month = 0;
            }else{
                self.month++
            }
            self.initTable(self.year,self.month,self.dy);
        });
        //点击上一年触发的事件
        preYear.addEventListener("click",function(){
            self.year--;
            self.initTable(self.year,self.month,self.dy);
        });
        //点击下一年触发的事件
        nextYear.addEventListener("click",function(){
            self.year++;
            self.initTable(self.year,self.month,self.dy);
        });

        function tapTd(e){
            var target = e.target;
            if(target.nodeName.toLocaleLowerCase() == "td"){
                var dy = target.innerHTML;
                var ret = {
                    year:self.year,
                    month:self.month+1,
                    dy:dy
                }
                callback_fn.call(self,ret);
                self.wrap.style.display = "none";
                self.tb.removeEventListener("click",tapTd);
            }
        }

        //点击单元格
        this.tb.addEventListener("click",tapTd);
    }
    this.init();
}
Calendar.prototype.initTable = function(year,month,dy){
    var dyNum = getDysOfMonth(year);//当前月的天数
    var firstDay = getFirstDay(year,month,dy);//当前月第一天是星期几
    var trNum=Math.ceil((dyNum[month] + firstDay)/7);//表格的行数
    var str = "<tr><td align=‘center‘>日</td><td align=‘center‘>一</td><td align=‘center‘>二</td><td align=‘center‘>三</td><td align=‘center‘>四</td><td align=‘center‘>五</td><td align=‘center‘>六</td></tr>";
    for(i=0;i<trNum;i++) { //表格的行
        str+="<tr>";
        for(k=0;k<7;k++) { //表格每行的单元格
            idx=i*7+k; //单元格自然序列号
            date_str=idx-firstDay+1; //计算日期
            (date_str<=0 || date_str>dyNum[month]) ? date_str="&nbsp;" : date_str=idx-firstDay+1; //过滤无效日期(小于等于零的、大于月总天数的)
            //打印日期:今天底色为红
            date_str==dy ? str+="<td align=‘center‘ bgcolor=‘red‘>" + date_str + "</td>" : str+="<td align=‘center‘>" + date_str + "</td>";
        }
        str+="</tr>"; //表格的行结束
    }
    var showCalendar = document.getElementById("showCalendar");
    showCalendar.innerHTML = year+"-"+(month+1);
    this.tb.innerHTML = str;
}
Calendar.prototype.showCal = function(){
    this.wrap.style.display = "block";
}
Calendar.prototype.hideCal = function(){
    this.wrap.style.display = "none";
}
/**
 * @desc :该方法获取指定月份的第一天是星期几
 * @param year:年
 * @param month:月
 * @param dy:日
 * @returns {number} 当月第一天是星期几
 */
function getFirstDay(year,month,tdy){
    var n1str=new Date(year,month,1); //当月第一天Date资讯
    var firstday=n1str.getDay(); //当月第一天星期几
    console.log(firstday);
    return firstday;
}

/**
 * @desc:该方法获取指定年的每个月的天数
 * @param year :年
 * @returns {Array} 每个月的天数
 */
function getDysOfMonth(year){
    var sepMon = 28 + (year%100==0?res=(year%400==0?1:0):res=(year%4==0?1:0));
    var m_days=new Array(31,sepMon,31,30,31,30,31,31,30,31,30,31); //各月份的总天数
    return m_days;
}
时间: 2024-08-11 05:44:09

面向对象实现简单日历的相关文章

js超简单日历

用原生js写了一个超级简单的日历.当做是练习js中的Date类型. 思路: 获取某个日期,根据年份计算出每个月的天数. 利用Date中的getDay()知道该月份的第一天为星期几. 循环创建表格,显示日历. html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>JS简单日历</title> 5 <meta http-equiv="Content-type" content=&

js编写当天简单日历

之前一直很想用javascript写一个日历,但是因为完全没有好的思路, 所以迟迟没有尝试.最近在网上刚好看到用javascript编写的简单日历的例子,代码量虽然不大, 但是我觉得很好地阐述了js日历的实现原理.自己也尝试着做了一下,收获蛮大,掌握了基本的实现原理后,再想增加更多的功能,完全就可以自由发挥了,先在这里分享一下吧,有兴趣的可以试试! 一.表格行数问题 既然要显示日期表格的话,首先得知道这个表格有多少行多少列,列数是已经确定的,从星期天(日历上第1列是星期天)到星期六一共7列.要解

JavaScript实现简单日历

页面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="co

面向对象之简单工厂模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Interface { class InterfaceTest { static void Main(string[] args) { #region 测试Cat,Monkey,Bear类 introduction test; for (int i = 1; i<=3; i++) { switch (i)

原生js面向对象实现简单轮播

平时中我习惯用jquery写轮播效果,实现过程不是很难,也很方便,为了加深对js面向对象的理解,我打算用面向对象实现一个简单的轮播,这里采用了字面量的方式实现.为了实现这个过程,我们要自己动手封装一个运动函数animate,在这里我采用的是匀速运动的方式,这种方式可能体验不是很好,后面分析js代码我在详细解释.废话不多说,先上代码.页面布局可以根据自己的习惯来. html代码: <head> <meta charset="UTF-8"> <meta nam

java GUI简单日历查看

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; public class swingCalendar extends JFrame implements ActionListener { public static swingCalendar u1; private

面向对象实现简单的学生课程选择

大家在学校一定都使用学校的选课系统,那么一个选课的流程是怎么实现的呢?下面给大家分享一个在python中使用面向对象初步实现选课情况. 1 class Student(object): #首先我们定义一个学生类 2 def __init__(self,sno,sname): 3 self.sno = sno 4 self.sname = sname 5 self.cour_lst = [] #学生的选课我们假设让他选择3门,定义一个空列表 6 def  cheke_course(self): #

弱弱的小白记录之——面向对象实现简单的歌曲管理信息

实现简单的面向对象方法来管理歌曲信息的增删改查. 数据驱动思想,也可以理解单项数据绑定,既:数据发生变化,页面也跟着变化: 思路: 使用构造函数来存储数据信息: 使用原型来存储方法(增删改查): 修改方式中方法使用到的数据,由变量转为对象的属性: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Docum

以最简单的登录为例,诠释JS面向对象的简单实例

JavaScript,是前端开发人员必须会的一门技术,从JS演变出来的有很多框架,先说说几个热门的框架吧: JQuery:这个技术必须会,如果不会,那一定要会查api,知道怎么写,要看得懂英文文档,这个框架十分流行,不论是刚入坑的开发者还是老油条,其实也都是是需要会的 BackBone:这个技术还不错,曾经的项目中用到过多次,很方便,是个MVC的实用框架,用来渲染视图十分简便 AngularJS:是个MVVM框架,和JQuery完全不一样,JQuery是基于dom元素的,而angerlar却不是