编写一个日历控件

这一小节就编写一个小小日历。日历的编写看起来不容易,实际上掌握了思路,编写起来也很简单。日历的制作可以转化成一个二维数组的排序,根据排序然后生成html代码。

1.首先确定这个月的第一天是星期几,再利用这日期确定其它日期的位置,最后定制成一个二维数组,根据二维数组生成html。

2.监听事件,无非是上一年,上个月,下个月,下一年等。

3.触发事件,点击完按钮后,日期重新计算。然后做的事情很简单,再按第一步进行。

第一步:

确定这个月的第一天是星期几,比如这个月是2月1号,对应的是星期天。

var d = (new Date(Calendar._Y_year,Calendar._M_month-1,1)).getDay();

有些月份是小月,有些是大月。所以要先做一件事情,就是计算日历显示的行数。这里要用一个方法getRows();

function getRows(d) {
            var totalDay = d + iObj.thisMonthDay;
            return Math.ceil(totalDay/7);
        }

把整个月的日期排序生成一个二维数组。start开始为0,表示日历格子的位置。这里分为三部分计算,fill小于0为上个月的日期;fill大于0并且小于该月最大日期数;还有下个月的日期从1开始计算起。所以1号就放在第一行第一位,对应arr[0][0]的位置。

for(i = 0; i < getRows(d); i++) {
    arr[i] = [];
    for(j = 0; j < 7; j++) {
        start++;
        fill = start - d;
        if(fill > 0 && fill <= thisMonthDay) {
            arr[i][j] = fill;
        }else if(fill <= 0) {
            arr[i][j] =  dayLen(Calendar._M_lastMonth) + fill;
        }else if(fill > thisMonthDay) {
            arr[i][j] = ++nextMonthfill;
        }
    }
}

接下来要生成html

strArr.push(‘<table class = "myCalendar" cellspacing = 0 >‘);
arr.forEach(function (value, index, arr){
    strArr.push(‘<tr class = "myCal-row"><td class = "myCal-row-date">‘ + value.join(‘</td><td class = "myCal-row-date">‘) + ‘</td></tr>‘);
});
strArr.push(‘</table>‘);
iObj.strArr = strArr;
strArrHtml = iObj.strArr.join(‘‘);
el.innerHTML = strArrHtml;

到这一步,日历的雏形出来了。

第二步:添加事件按钮

添加事件按钮就是添加选择年月的按钮。

function loadBtn(strArr, btn) {
    var time = [‘lastYear‘,‘lastMonth‘,‘thisYear‘,‘thisMonth‘,‘nextMonth‘,‘nextYear‘];
    strArr.push(‘<table class = "myCal-btn"><tr class = "myCal-row btn-row">‘);
    for(var i = 0, len = time.length; i < len; i++) {
        strArr.push(‘<td class = "myCal-row-btn myCal-row-‘ + time[i] + ‘">‘ + btn[i] + ‘</td>‘);
    }
    strArr.push(‘</tr></table>‘);
}

添加事件监听

function addEvent(type, fn, userCapture) {
    window.addEventListener ? this.addEventListener(type, fn, userCapture || false) : this.attachEvent(‘on‘ + type, fn);
}
function bindEvent() {
    getDom();
    addEvent.call(iObj.lastYear, touchStart, startHandle);
    addEvent.call(iObj.lastYear, touchEnd, endHandle);
    addEvent.call(iObj.lastMonth, touchStart, startHandle);
    addEvent.call(iObj.lastMonth, touchEnd, endHandle);
    addEvent.call(iObj.nextMonth, touchStart, startHandle);
    addEvent.call(iObj.nextMonth, touchEnd, endHandle);
    addEvent.call(iObj.nextYear, touchStart, startHandle);
    addEvent.call(iObj.nextYear, touchEnd, endHandle);
}

第三步:触发监听事件

点击按钮时触发startHandle方法,点击按钮获取新的时间,再刷新前后的时间。

function startHandle() {
    var _this = iObj._this;
    if(/lastYear/.test(this.className)) {lastYear(); updateTime();}
    if(/lastMonth/.test(this.className)) {lastMonth(); updateTime();}
    if(/nextMonth/.test(this.className)) {nextMonth(); updateTime();}
    if(/nextYear/.test(this.className)) {nextYear(); updateTime();}
}

获取新的时间

function lastYear(e) {
    Calendar._Y_year = Calendar._Y_lastYear;
}
function nextYear(e) {
    Calendar._Y_year = Calendar._Y_nextYear;
}
function lastMonth(e) {
    if(Calendar._M_month == 1) {
        Calendar._Y_year = Calendar._Y_lastYear;
        Calendar._M_month = 12;
    }else {
        Calendar._M_month = Calendar._M_lastMonth;
    }
}
function nextMonth(e) {
    if(Calendar._M_month == 12) {
        Calendar._Y_year = Calendar._Y_nextYear;
        Calendar._M_month = 1;
    }else {
        Calendar._M_month = Calendar._M_nextMonth;
    }
}

更新时间

function updateTime(){
    getLastYear();
    getLastMonth();
    getNextMonth();
    getNextYear();
}
function getLastYear() {
    Calendar._Y_lastYear = Calendar._Y_year - 1;
}
function getNextYear() {
    Calendar._Y_nextYear = Calendar._Y_year + 1;
}
function getLastMonth() {
    if(Calendar._M_month == 1) {Calendar._M_lastMonth = 12; Calendar._Y_lastYear = Calendar._Y_year - 1;}
    else {Calendar._M_lastMonth = Calendar._M_month - 1;}
}
function getNextMonth() {
    if(Calendar._M_month == 12) {Calendar._M_nextMonth = 1;Calendar._Y_nextYear = Calendar._Y_year + 1;}
    else {Calendar._M_nextMonth = Calendar._M_month + 1;}
}

点击完按钮endHandle,摘除监听事件,把新获取的时间再按第一步重新计算。

function endHandle() {
    var _this = iObj._this;
    removeEvent.call(iObj.lastYear, touchStart, startHandle);
    removeEvent.call(iObj.lastYear, touchEnd, endHandle);
    removeEvent.call(iObj.lastMonth, touchStart, startHandle);
    removeEvent.call(iObj.lastMonth, touchEnd, endHandle);
    removeEvent.call(iObj.nextMonth, touchStart, startHandle);
    removeEvent.call(iObj.nextMonth, touchEnd, endHandle);
    removeEvent.call(iObj.nextYear, touchStart, startHandle);
    removeEvent.call(iObj.nextYear, touchEnd, endHandle);
    iObj.refresh();
}

至于下面的时分秒也很简单,给一个定时器setInterval,每一秒重新计算,再刷新时分秒的内容。

function run() {
    iObj.hours = doc.getElementsByClassName(‘myCal-hours‘)[0];
    iObj.minutes = doc.getElementsByClassName(‘myCal-minutes‘)[0];
    iObj.seconds = doc.getElementsByClassName(‘myCal-seconds‘)[0];
    iObj.hours.innerHTML = isZero(new Date().getHours());
    iObj.minutes.innerHTML = isZero(new Date().getMinutes());
    iObj.seconds.innerHTML = isZero(new Date().getSeconds());
}

到这里大功告成。还差最后一步,激活日历:

var calendar = new myCalendar(‘myCalendar‘,{
    width: ‘auto‘,
    height: ‘auto‘,
    btn: true,
    header: true,
    seconds: true,
    background: ‘rgba(48, 83, 173, 0.44)‘,
    color: ‘#000‘,
    todayColor: ‘#fff‘
});

下载完整的Demo

时间: 2024-12-23 06:19:27

编写一个日历控件的相关文章

Android UI-自定义日历控件

Android UI-自定义日历控件 本篇博客笔者给大家分享一个日历控件,这里有个需求:要求显示当前月的日期,左右可以切换月份来查看日期. 我们想一想会如何去实现这样的一个控件,有开源的,但可能不太满足我们的特定的需求,这里笔者自定义了一个,读者可以根据自己的需求来修改代码.下面来说一下实现的思路: 首先我们要显示当前月份,自然我们要计算出当前的日期,并且把每一天对应到具体的星期,我们会有以下效果: 我们先想一下这样的效果用什么控件可以实现?很自然可以想到用网格视图GridView,但这里笔者使

IOS自定义日历控件的简单实现(附思想及过程)

因为程序要求要插入一个日历控件,该空间的要求是从当天开始及以后的六个月内的日历,上网查资料基本上都说只要获取两个条件(当月第一天周几和本月一共有多少天)就可以实现一个简单的日历,剩下的靠自己的简单逻辑就OK了,下面开始自己从开始到完成的整个过程 1,首先做NSDate类目,扩展一些方法让日期之间转换更加方便 #import <Foundation/Foundation.h> @interface NSDate (LYWCalendar) #pragma mark - 获取日 - (NSInte

javascript日历控件

以前要用到日历控件都是直接从网上下载一套源码来使用,心里一直有个梗,就是想自己动手写一个日历控件,最近刚好来了兴趣,时间上也允许,于是自己摸索写了一个,功能还算完善,界面就凑合了.可能最值得说的一点就是让input控件内部右边显示一个按钮,我是直接给input加了个背景,然后把input的边框去掉实现的. 这个是最初版的,再往后打算做出纯javascript版的,再往后打算用JQuery做一套. <!doctype html> <html> <head> <met

为什么日历控件放在panel无法显示出来

前言 以前一直没有做过c/s这块开发,最近一段时间,刚接触.当然winform自己肯定会,但是只是很早以前自己玩的时候弄弄.最近做的时候,很简单的一个效果,自己怎么也实现不出来,最后没事和一个哥们私下弄得时候发现了奥妙,哈哈,可能大家做过winform的都知道,但是还是分享一下. 需求 form窗体上,放一个groupbox控件,放一个datagridview控件,放一个panel控件.groupbox中放一个textbox控件,dock属性为top,panel中放一个日历控件,gridview

Android自定义View(CustomCalendar-定制日历控件)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/54020386 本文出自:[openXu的博客] 目录: 1分析 2自定义属性 3onMeasure 4onDraw 绘制月份 绘制星期 绘制日期及任务 5事件处理 源码下载 ??应项目需求,需要做一个日历控件,效果图如下: ???? ??接到需求后,没有立即查找是否有相关开源日历控件可用.系统日历控件是否能满足 ,第一反应就是这个控件该怎么画?谁叫咱自定义控件技术牛逼呢O(∩_∩)O哈哈~

原创-前端控件之日历控件

很少发现网上有简洁好用的自定义前端控件的贴子,最近项目中需要,自己YY开始写前端控件,在此给大家分享 控件是基于jQuery.UI的Widget写的,写起来就方便很多,使用起来跟普通jQuery控件一样$(#id).control(option),看着眼熟吧,下面就开始了 首先说下控件的依赖包,加载控件的时候必须先加载jQuery, jQuqery.UI, 另外jquery-ui.css 这个包也需要引用,此包主要应用了jQuery拖拽和放缩的样式,控件样式方面大家自由发挥,给了个自己写的默认样

iOS开发一款小巧简洁的日历控件

iOS开发一款小巧简洁的日历控件 一.引言 日 历是iOS开发中有时会用到的一个UI控件,网上开源的代码也很多,我浏览过一些,大致有两种模式,一种是日历的逻辑由开发者自己实现,通过计算闰年与平 年来确定月份天数,另外一种模式是通过NSDate这个时间类,来获取日历的信息.我个人认为后一种更加安全,代码性能也会更加优质,下面就是我用这种模 式实现的一个日历控件. 二.设计思路 1.先来看下效果吧                    2.我们需要实现的功能 (1)每行7天,对应星期,列数为将当前月

转 My97日历控件常用功能记录

My97相信大家都不陌生,应该是我所见过的最强大的一个日历控件了,最近的项目中也比较多地用到了此控件,而且项目中经常会有不同时间范围的需求,在此列出一些比较常用的日期范围格式的设置,尽管在My97的官方文档中有很详细的介绍,正是因为很详细所以查找起来不是很方便. 1 可以选择任何日期 <input id="txtDate" class="Wdate" type="text" onfocus="WdatePicker()"

撸一个Android高性能日历控件,高仿魅族

Android原生的CalendarView根本无法满足我们日常开发的需要,在开发吾记APP的过程中,我觉得需要来一款高性能且美观简洁的日历控件,觉得魅族的日历风格十分适合,于是打算撸一款. github地址:https://github.com/huanghaibin-dev/CalendarView compile 'com.haibin:calendarview:1.0.2' 先上效果图: 动手之前我们需要分析一下魅族是怎么设计如此高性能的日历的,我们打开开发者选项中的显示布局边界: 好吧