日历组件

结构

var _args = {
p: $DB,
defDate:(new Date().date2Str()).split(‘ ‘)[0],//2016-1-2 10:12:32
computeM:todayM,
computeY:todayY,
dateHead:[‘日‘,‘一‘,‘二‘,‘三‘,‘四‘,‘五‘,‘六‘],
month:[{idx:1,text:1},{idx:2,text:2},{idx:3,text:3},{idx:4,text:4},{idx:5,text:5},{idx:6,text:6},{idx:7,text:7},{idx:8,text:8},{idx:9,text:9},{idx:10,text:10},{idx:11,text:11},{idx:12,text:12}],
year:itemsYear,
headClick: me._fn,
bodyClick: me._fn
}

WT.UI.F_calendar = function(j) {
    var me = this;
    me.comType = ‘F_calendar‘;
    WT.ext(me, WT.Util);
    //--------------------
    //获取年份数组,f前f年(包括当年),n后n年
    var yearMin = 2;
    var yearMax = 2;
    var itemsYear = getNyear(yearMin,yearMax,[2016,8,2]);
    var today = new Date();
    var todayY = today.getFullYear();
    var todayM = today.getMonth()+1;
    //-------------------
    var _args = {
        p: $DB,
        defDate:(new Date().date2Str()).split(‘ ‘)[0],//2016-1-2 10:12:32
        computeM:todayM,
        computeY:todayY,
        dateHead:[‘日‘,‘一‘,‘二‘,‘三‘,‘四‘,‘五‘,‘六‘],
        month:[{idx:1,text:1},{idx:2,text:2},{idx:3,text:3},{idx:4,text:4},{idx:5,text:5},{idx:6,text:6},{idx:7,text:7},{idx:8,text:8},{idx:9,text:9},{idx:10,text:10},{idx:11,text:11},{idx:12,text:12}],
        year:itemsYear,
        headClick: me._fn,
        bodyClick: me._fn
    }
    me.args = me.initArgs(j, _args);
    var c_date, _baseDiv,_body;

    me.computDate = me.get(‘defDate‘);
    me.setTime = me.get(‘defDate‘);
    //设置年份,dStr:日期(2016-1-1);min:相对于dstr的前min年;max:后max年
    me.setDate =function(dStr,min,max){
        me.setTime = dStr;
        var _a=dStr?dStr.split(‘-‘):me.get(‘defDate‘).split(‘-‘);
        me.args.year = getNyear(min,max,_a);
        me.args.computeM = _a[1];
        me.args.computeY = _a[0];
        me.computDate = _a;
        _baseDiv.head.h(laytpl(WT.UI.Temp.calendar_head.help()).render(me.args));
        drawMonth(dStr);
    }

    var layout = function() {
        var _b = me.base = me.get(‘p‘).adElm(‘‘, ‘div‘);
        _b = _b.adElm(‘‘, ‘div‘).cn(‘h300 w300 pa ml5 b_18 mt3‘);
        _baseDiv = new WT.UI.BaseDiv({
            p: _b,
            head_h: 50,
            foot_h: 0
        })
        _baseDiv.head.adElm(‘‘, ‘div‘).h(laytpl(WT.UI.Temp.calendar_head.help()).render(me.args));
        _body = _baseDiv.body.ac(‘mt5‘);
        drawMonth();
    }
    //画月份
    var drawMonth = function(dStr){
        var _a=dStr?dStr.split(‘-‘):me.get(‘defDate‘).split(‘-‘);
        dStr=(_a[0]+‘-‘+_a[1]+‘-‘+‘1‘);
        me.computDate = (_a[0]+‘-‘+_a[1]+‘-‘+_a[2]);
        var _d1=new Date(dStr);
        var _day = new Date(dStr).getDay();
        _d1.setDate(_d1.getDate()-_day-1);
        var _month=new Date(dStr).getMonth();
        var dTmp=‘<div class="dib"><span dStr={4} class="dib cp tac pt10 {3}" isDisabled={5} isTody={6} isSelect={7} style="height:{0}px;width:{1}px">{2}</span></div>‘;
        var _dateAry=[];
        var _h = (_body.csn(‘height‘)-4)/6-10;
        var _w = (_body.csn(‘width‘)-4)/7;

        for(var i=0;i<42;i++){
            _d1.setDate(_d1.getDate()+1);
            if(today.date2Str().split(‘ ‘)[0] === _d1.date2Str().split(‘ ‘)[0]) {//今天
                _dateAry.push(dTmp.format(_h,_w,_d1.getDate(),‘bc_17‘,_d1.date2Str().split(‘ ‘)[0],(_month==_d1.getMonth())? 0 : 1,1,0))
            }else if(me.selElm && me.selElm.attr(‘dstr‘)===_d1.date2Str().split(‘ ‘)[0]){//选中
                _dateAry.push(dTmp.format(_h,_w,_d1.getDate(),‘bc_18‘,_d1.date2Str().split(‘ ‘)[0],(_month==_d1.getMonth())? 0 : 1,0,1))
            }else{//其他
                _dateAry.push(dTmp.format(_h,_w,_d1.getDate(),(_month==_d1.getMonth())?‘c_10 F_calendar‘:‘c_17 cna‘,_d1.date2Str().split(‘ ‘)[0],(_month==_d1.getMonth())? 0 : 1,0,0))
            }
        }
        _body.h(_dateAry.join(‘‘));
    }
    //参数:1加一个月 -1 减一个月
    var monthDo = function(n){
        var _d1= new Date(me.computDate);
        _d1.setMonth(_d1.getMonth()+1*n);
        drawMonth(_d1.date2Str().split(‘ ‘)[0]);
        me.computDate=_d1.date2Str().split(‘ ‘)[0];
        var _computeD = me.computDate.split(‘-‘);
        me.args.computeM=_computeD[1];
        me.args.computeY=_computeD[0];
        return 1;
    }
    function getNyear(f,n,dStr){
        var _year = [];
        var _d=dStr?new Date(dStr[0],dStr[1],dStr[2]):new Date();
        var _nYear = _d.getFullYear();
        var _upYear = _nYear-f;
        for(var i=0; i<f+n; i++){
            _year.push({idx:i,text:++_upYear})
        }
        return _year;
    }
    var eventBind = function() {
        me.base.evt(‘click‘,function(e){
            var e = WT.e.fix(e),_e = e.t;
            e.stop();
            if(_e.attr(‘opt‘) == ‘head_month‘){//月
                _e.evt(‘change‘,function(e){
                    var _d1= new Date(me.computDate);
                    _d1.setMonth(+_e.value-1);
                    drawMonth(_d1.date2Str().split(‘ ‘)[0]);
                    me.computDate=_d1.date2Str().split(‘ ‘)[0];
                })
            }else if(_e.attr(‘opt‘) === ‘head_year‘){//年
                _e.evt(‘change‘,function(e){
                    var _d1= new Date(me.computDate);
                    _d1.setYear(+_e.value);
                    drawMonth(_d1.date2Str().split(‘ ‘)[0]);
                    me.computDate=_d1.date2Str().split(‘ ‘)[0];
                })
            }else if(_e.attr(‘opt‘) === ‘left‘){//左TODO:向左添加月份约束
                if ((+(me.setTime.split(‘-‘)[0])-yearMin+1) <= +me.computDate.split(‘-‘)[0]){
                    monthDo(-1) && _baseDiv.head.h(laytpl(WT.UI.Temp.calendar_head.help()).render(me.args));
                    //console.log(me.computDate);
                }
                else
                    alert(‘不在区间内‘);
            }else if(_e.attr(‘opt‘) === ‘right‘){//右TODO:向右添加月份约束
                if ((+(me.setTime.split(‘-‘)[0])+yearMax) >= +me.computDate.split(‘-‘)[0]){
                    monthDo(1) && _baseDiv.head.h(laytpl(WT.UI.Temp.calendar_head.help()).render(me.args));
                    //console.log(me.computDate);
                }
                else
                    alert(‘不在区间内‘);
            }else if(_e.tagName === ‘SPAN‘ && _e.attr(‘isDisabled‘) === "0"){//选中日期,显示在input中
                if (me.selElm) {
                    me.selElm.dc(‘bc_18‘);
                    me.selElm.attr(‘isSelect‘,"0");
                    if ( _e.attr(‘isTody‘) !== "0") {
                        me.selElm.ac(‘F_calendar‘);
                    }
                }
                me.selElm = _e;
                _e.dc(‘F_calendar‘);
                _e.ac(‘bc_18‘);
                me.selElm.attr(‘isSelect‘,"1");
                me.get(‘bodyClick‘)(_e);//点击日期后的回调函数,参数: _e.attr(‘dStr‘)即获取的日期
            }
        })
    }
    me.init = function() {
        layout();
        eventBind();
    }
    if (arguments.length) {
        me.init();
    }
    return me;
}

字符串模板
calendar_head: function() {
        /*
            <div class="tac p2">
                <span opt="left" class="fa fa-arrow-left mr30 c_13"></span>
                <div class="dib">
                    <select opt="head_month">
                        {{# for(var i=0;i<d.month.length;i++){ }}
                            {{# if(d.computeM == d.month[i].text){ }}
                                <option selected idx={{d.month[i].idx}}>{{d.month[i].text}}</option>
                            {{# }else{ }}
                                <option idx={{d.month[i].idx}}>{{d.month[i].text}}</option>
                            {{# } }}
                        {{# } }}
                    </select>
                    <select opt="head_year">
                        {{# for(var i=0;i<d.year.length;i++){ }}
                            {{# if(d.computeY == d.year[i].text){ }}
                                <option selected idx={{d.year[i].idx}}>{{d.year[i].text}}</option>
                            {{# }else{ }}
                                <option idx={{d.year[i].idx}}>{{d.year[i].text}}</option>
                            {{# } }}

                        {{# } }}
                    </select>
                </div>
                <span opt="right" class="fa fa-arrow-right ml30 c_13"></span>
                <div opt="calendarWeek" class="pt10">
                    {{# for(var i=0;i<d.dateHead.length;i++){ }}
                        <span class="m0lr5 fwb">{{d.dateHead[i]}}</span>
                    {{# } }}
                </div>
            </div>
         */
    }

写的比较久,也比较烂。。。

时间: 2024-10-09 22:27:46

日历组件的相关文章

第二百一十四节,jQuery EasyUI,Calendar(日历)组件

jQuery EasyUI,Calendar(日历)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Canlendar(日历)组件的使用方法,这个组件不依赖于其 他组件. 一.加载方式 class 加载方式 <div id="box" class="easyui-calendar" style="width:200px;height:200px;"></div>

vue2.0项目 calendar.js(日历组件封装)

最近一直闲来无事,便寻思着做一下自己的个人项目,也想说能使用现在比较流行的一些mvvm框架来做,于是就选用了这样的一个技术栈vue2.0+vue-router+vuex+webpack来做,做得也是多页面应用,使用vue-router,也是想说把多个功能模块化,单个模块spa,实现更高的效果.当然现在还在做的过程中,如果感兴趣可以过来star一下,哈哈,https://github.com/xiaobinwu/Wuji,git clone下来看看. 今天要说的是在做这个项目的过程中,自己想加一个

javascript动手写日历组件(2)——优化UI和添加交互(by vczero)

一.优化UI 继上一篇,http://www.cnblogs.com/vczero/p/js_ui_1.html.开始优化UI,主要优化的部分有: (1)增加星期行.(2)字体设置.(3)日期垂直居中.(4)将单元格->底部线条.(5)修改文本的颜色对比.(6)将内部调用的函数加前缀_,如_addHeader()._addWeekday(). 修改的后基本效果如下图: 整个代码做了小修小改: 1 var Calendar = function(div){ 2 this.div = documen

javascript动手写日历组件(1)——构建日历逻辑 (by vczero)

一.分析日历的组成部分和交互要素 (1)组成部分:选择年月部分.星期显示.包含本月(或者有前月和下一个月部分日子) (2)根据选择的年和月份,动态绘制日历面板. (3)一个日历 7(天) * 5(周) = 35格表格. (4)一个月份是统一的一个面板:一个月的头一天一定在日历面板的第一行,根据该天的“星期几”确定位置. (5)第一格子是星期一,最后一个格子是星期日,为5周的日历面板. 二.确定逻辑设计 日历上面的日历,8月1号建军节为什么会出现在这一格?因为一个月的天数是小于5周(35天)的,因

javascript动手写日历组件(3)——内存和性能优化(by vczero)

一.列表 javascript动手写日历组件的文章列表,主要是通过原生的JavaScript写的一个简约的日历组件: (1)javascript动手写日历组件(1)——构建日历逻辑:http://www.cnblogs.com/vczero/p/js_ui_1.html (2)javascript动手写日历组件(2)——优化UI和添加交互:http://www.cnblogs.com/vczero/p/js_ui_2.html (3)javascript动手写日历组件(2)——内存和性能优化:h

vue初学实践之路——vue简单日历组件

---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不需要用到node服务器,只需要一个Html文件即可. 项目基本目录 首先在引入 vue.js <script src="https://unpkg.com/vue/dist/vue.js"></script> 贴上最主要的html和js代码 <div id=&

Vue自定义日历组件

今天给大家介绍Vue的日历组件,可自定义样式.日历类型及支持扩展,可自定义事件回调.Props数据传输. 线上demo效果 示例 Template: <Calendar :sundayStart="true" :calendarType="1" :markDate="markDate" :markDateClass="markDateClass" :agoDayPrevent="agoDayPrevent&qu

基于Vue2-Calendar改进的日历组件(含中文使用说明)

一,前言 我是刚学Vue的菜鸟,在使用过程中需要用到日历控件,由于项目中原来是用jQuery写的,因此用了bootstarp的日历控件,但是配合Vue实在有点蛋疼,不够优雅…… 于是网上搜了好久找到了Vue2-Calendar,不用说,挺好用的,但是同时也发现这个组件有些问题,有些功能挺不符合我们的要求,于是着手改了一版 二,改进的功能 在Vue2-Calendar v2.2.4 版基础上作了优化. 改进原控件无法切换语言的BUG,支持 lang='zh-CN'和'en'. 日历面板增加一个位置

vue之手把手教你写日历组件

---恢复内容开始--- 1.日历组件 1.分析功能:日历基本功能,点击事件改变日期,样式的改变 1.结构分析:html 1.分为上下两个部分 2.上面分为左按钮,中间内容展示,右按钮 下面分为周几展示和日期展示 3.基本结构页面html书写 <template>    <div class="calender2">        <div class="date-header">            <div class

使用vue实现日历组件的封装

前言 因项目的需要,而且当前组件库并不支持业务,所以,重新对日历组件进行封装.该篇博客就对实现日历的思路进行存档,方便以后的查阅. 先上图:UI小哥哥的原型图.接下来的思路都是根据该图进行解说 逻辑 1.组件的拆分,分出哪些是业务,哪些是基础组件. 整体来说,这就是在日历的基础上添加业务,所以日历组件应该是基础组件,而业务应该是通过插槽插入进去的.那么,右上方的分入分出合计以及每个日历中的分入,分出都是需要插入的.其余的均是日历本身的功能. 2.那么接下来,我们先完成日历组件的封装,首先,我们要