• js 面向对象 模拟日历


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
        * {
            padding:0;
            margin:0;
        }
        
        #calendar {
            width:408px;
            height:370px;
            /*border:1px solid #57abff;*/
            margin:100px auto;
        }
        #calendar .inputBox {
            width:200px;
            height:25px;
            margin:2px;
        }
        #calendar .dataBox {
            display:none;
            
        }
    
        #calendar select {
             height:25px;
        }
    
        #calendar .selectMonth {
            width:60px;
        }
        #calendar .selectYear {
             width:100px;
        }
    
        #calendar .selectMonth {
            width:60px;
        }
    
        #calendar .dataBox table {
            width:100%;
            height:308px;
            text-align:center;
            margin-top:6px;
            border-top:1px solid #57abff;
        }
        #calendar .dataBox table tr:first-child{
            height:12%;
        }
        
        #calendar .dataBox table,#calendar .dataBox th,#calendar .dataBox td {
            border-collapse:collapse;
            border-bottom:1px solid #ccc;
        }
        
        /*#calendar .dataBox table .current{
            border:2px solid red;
        }*/
        
        #calendar .dataBox table .current{
            background-color:#FF9966;
        }
        
        #calendar .dataBox table .notCurMonth{
            color:#ccc;
        }
    
        </style>
        
    </head>
    <body>
        <div id="calendar">
            <!-- <input type="text" class="inputBox">
            <div class="dataBox">
                <select name="" id="" class="selectYear">
                    <option value="1992">1992</option>
                    <option value="1993">1993</option>
                </select>
                <select name="" id="" class="selectMonth">
                    <option value="1">1</option>
                    <option value="2">2</option>
                </select>
                <table>
                    <tr>
                        <th>一</th>
                        <th>二</th>
                        <th>三</th>
                        <th>四</th>
                        <th>五</th>
                        <th>六</th>
                        <th>日</th>
                    </tr>
                    <tr>
                        <td class="current"><a href="">1</a></td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                        <td>6</td>
                        <td class="current">7</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                        <td>6</td>
                        <td>7</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                        <td>6</td>
                        <td>7</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                        <td>6</td>
                        <td>7</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                        <td>6</td>
                        <td>7</td>
                    </tr>
                </table>
            </div> -->
        </div>
        <script src="js/calendar.js"></script>
        <script type="text/javascript">
            new Calendar({
                "id":"calendar"
            });
        </script>>
    </body>
    </html>
    (function(){
        window.Calendar = Calendar;
        function Calendar(JSON){
            this.inputBox = null;
            this.calendarDiv = null; /*存放日历的容器*/
            this.selectYear = null;
            this.selectMonth = null;
            this.tds = null;
            this.curYear = null;
            this.curMonth =null;
            this.curDate = null;
            this.dom = null;
            /*初始框架*/
            this.init(JSON);
            /*获取日期*/
            this.getData();
            this.bindEvent();
        }
    
        Calendar.prototype.init = function(Json){
            /*初始化当前的日期*/
            this.curYear = new Date().getFullYear();
            this.curMonth = new Date().getMonth()+1;
            this.curDate = new Date().getDate();
            
            /*框架的渲染*/
            this.dom = document.getElementById(Json["id"]);
            /*创建输入框 上dom树*/
            this.inputBox = document.createElement('input');
            this.inputBox.className = 'inputBox';
            this.dom.appendChild(this.inputBox);
            this.calendarDiv = document.createElement('div');
            this.calendarDiv.className = 'dataBox';
            this.dom.appendChild(this.calendarDiv);
            this.selectYear = document.createElement('select');
            this.selectYear.className='selectYear';
            for(var i=1990;i<2024;i++){
                var option = document.createElement('option');
                option.value = i;
                option.innerHTML = i;
                this.selectYear.appendChild(option);
            }
            this.calendarDiv.appendChild(this.selectYear);
    
            this.selectMonth = document.createElement('select');
            this.selectMonth.className = 'selectMonth';
            for(var i=1;i<13;i++){
                var option = document.createElement('option');
                option.value = i;
                option.innerHTML = i;
                this.selectMonth.appendChild(option);
            }
            this.calendarDiv.appendChild(this.selectMonth);
            /*创建 table */
            var table = document.createElement('table');
            var tr = document.createElement('tr');
            var week = ["一","二","三","四","五","六","日"];
            for(var i=0;i<7;i++){
                var th = document.createElement('th');
                th.innerHTML = week[i];
                tr.appendChild(th);
            }
            table.appendChild(tr);
            for(var i=0;i<6;i++){
                var tr = document.createElement('tr');
                for(var j=0;j<7;j++){
                    var td = document.createElement('td');
                    //td.innerHTML = 1;
                    tr.appendChild(td);
                }
                table.appendChild(tr);
            }
            this.calendarDiv.appendChild(table);
            this.tds = document.getElementsByTagName('td');
        };
        
        /*渲染日期*/
        Calendar.prototype.getData = function(){    
            this.curDate = this.curDate?this.curDate:1;
            var date = new Date(this.curYear,this.curMonth-1,1);
            //当月第一天是星期几
            this.curMonthFirstDay = date.getDay();
            //当月一共有多少天
            this.curMonthFirstDay = this.curMonthFirstDay?this.curMonthFirstDay:7;
            this.curMonthDays = new Date(new Date(this.curYear,this.curMonth,1)-1).getDate();        
            //上月最后一天是几号
            this.lastMonthLastDate = new Date(date-1).getDate();    
            var lastMonthValue = this.lastMonthLastDate;
            //console.log("cur.curMonthFirstDay:",this.curMonthFirstDay,"cur.curMonthDays:",this.curMonthDays);
            //渲染上月的
            for(var i = this.curMonthFirstDay-2; i>=0; i--){
                this.tds[i].innerHTML = lastMonthValue;    
                this.tds[i].className = 'notCurMonth';
                lastMonthValue--;        
            }    
            //渲染当月的
            for(var i = this.curMonthFirstDay-1; i<(this.curMonthDays+this.curMonthFirstDay-1);i++){    
                this.tds[i].innerHTML = (i-(this.curMonthFirstDay-1))+1;
                this.tds[i].className = '';
            }
            
            //渲染下月的
            for(i = this.curMonthFirstDay+this.curMonthDays-1;i<42;i++){
                this.tds[i].innerHTML = (i-(this.curMonthFirstDay+this.curMonthDays-1))+1;
                this.tds[i].className = 'notCurMonth';
            }
            
            /*获取当天的*/
            var curentdate = new Date(this.curYear,this.curMonth-1,this.curDate).getDate();
            var index = this.curMonthFirstDay+curentdate-2;
            this.tds[index].className = 'current';    
            this.selectYear.value = this.curYear;        
            this.selectMonth.value = this.curMonth; //这里就是需要写option value
            this.inputBox.value = this.curYear+"-"+this.curMonth+"-"+this.curDate;
            
        };
        
        /*绑定事件*/
        Calendar.prototype.bindEvent = function(){
            this.curDate = 1;
            var _this = this;
            this.selectYear.onchange = function(){
                _this.curYear = _this.selectYear.value;
                _this.getData(); /*重绘日期*/            
            }
            this.selectMonth.onchange = function(){
                _this.curMonth = _this.selectMonth.value;
                _this.getData(); /*重绘日期*/
            }
            
            this.inputBox.onkeyup = function(event){    
                var event = window.event || event;
                if(event.keyCode == 13){
                    var inputVlaueStr = _this.inputBox.value;
                    //console.log("inputVlaue:",inputVlaueStr);
                    var reg = /^(d{4})-(d{1,2})-(d{1,2})$/g; //记得括号
                    if(!inputVlaueStr.match(reg)){
                        alert("date input is error!");
                        return;
                    }
                    var inputVlaueArr = inputVlaueStr.split('-');
                    _this.curYear = inputVlaueArr[0];
                    _this.curMonth = inputVlaueArr[1];
                    _this.curDate = inputVlaueArr[2];
                    _this.getData();
                }
            };
            
            /*实现calendarDiv 开始隐藏,鼠标聚焦到inputBox上在显示出来*/
            this.inputBox.onfocus = function(){
                _this.dom.style.border = '1px solid #57abff';
                _this.calendarDiv.style.display = 'block';
            };
            
            /*实现鼠标点击文档空白处div隐藏*/
            document.addEventListener("click",function(event){
                var event = window.event || event;
                if(event.target != _this.inputBox && event.target != _this.selectYear 
                   && event.target != _this.selectMonth && event.target.nodeName != 'TH' && event.target.nodeName != 'TD' && event.target != _this.calendarDiv && event.target != _this.dom){
                    _this.dom.style.border = 'none';
                    _this.calendarDiv.style.display = 'none';
                }
            });    
            
            /*点击上月和下月的日期能够跳转到对应的月*/    
            for(var i=0;i<this.tds.length;i++){    
                (function(m){
                    _this.tds[m].onclick = function(){
                        if(m < _this.curMonthFirstDay-1){
                            _this.curMonth = _this.curMonth-1;
                            if(_this.curMonth < 1){
                                _this.curMonth = 12;
                                _this.curYear = _this.curYear-1;
                            }
                            _this.getData();
                        }else if(m >= (_this.curMonthFirstDay+_this.curMonthDays-1)){
                            _this.curMonth = _this.curMonth+1;
                            if(_this.curMonth > 12){
                                _this.curMonth = 1;
                                _this.curYear = _this.curYear+1;
                            }
                            _this.getData();
                        }
                    }
                })(i);
           }
        };
    
    })();

     

  • 相关阅读:
    (转)ELK Stack 中文指南--性能优化
    (转)如何在CentOS / RHEL 7上安装Elasticsearch,Logstash和Kibana(ELK)
    (转)GlusterFS 01 理论基础,企业实战,故障处理
    (转)CentOS7.4环境下搭建--Gluster分布式集群存储
    (转)DB2性能优化 – 如何通过调整锁参数优化锁升级
    (转)架构师之DNS实战CentOS7VSCentOS6
    PHP:计算文件或数组中单词出现频率
    [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...
    Windows下配置环境变量和需不需要重启问题
    CENTOS 下安装APK反编译工具 APKTOOL
  • 原文地址:https://www.cnblogs.com/moon-yyl/p/9896424.html
Copyright © 2020-2023  润新知