Swift51.com
麦子学院 头像
麦子学院  2016-10-18 20:33

使用ajax自定义日历的源码分享

回复:0  查看:2510  

需求分析

在一些购物网站中,都会有促销活动,这些活动都在日历上标注出来,如何通过Ajax让日历读取数据库中的信息,正确的把促销活动标注在日历上,本文通过自定义日历来实现这个问题,希望可以帮助大家更好的学习ajax技术

 

技术难点

日历的布局

日历的初始化

日历的动态变化

日历的促销定制

 

实现方法

1、 先创建一个固定的日历,效果如下

使用ajax自定义日历的源码分享


html代码如下

<!DOCTYPE html><html><head>

    <meta charset="UTF-8">

    <title>Title</title>

    <style type="text/css">

        * {margin: 0; padding: 0;}

        body {font-size: 13px;}

        .calendar {width: 330px; margin: 0 auto;}

        .calendar .title {

            position: relative;

            width: 100%;

            height: 30px;

            line-height: 30px;

            background: #17a4eb;

        }

        .title div {position: absolute;}

        .prev {left: 10px; }

        .now {left: 40%;}

        .next {right: 10px;}

        input {height: 30px; width: 300px; margin: 100px 475px 0px;}

        table {width: 100%; border-collapse: collapse;}

        table th {border: 1px solid #ccc;}

        table td {text-align: center; border: 1px solid #ccc;}

    </style></head><body>

    <input type="text">

    <div>

        <div>

            <div>

                <span>08</span>月

            </div>

            <div>

                <span>2016</span>年

                <span>09</span>月

            </div>

            <div>

                <span>10</span>月

            </div>

        </div>

        <table>

            <!--星期部分-->

            <thead>

            <tr>

                <th>日</th>

                <th>一</th>

                <th>二</th>

                <th>三</th>

                <th>四</th>

                <th>五</th>

                <th>六</th>

            </tr>

            </thead>

            <!--日期部分-->

            <tbody>

            <tr>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

            </tr>

            <tr>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

                <td>1</td>

            </tr>

            </tbody>

        </table>

    </div></body></html>

当创建固定日历后,把日历的html部分注释掉(title和table),保留css部分

2、 通过javascript动态生成日历

window.onload = function () {

       var oInput = document.getElementsByTagName('input')[0];

       var oCalendar = document.getElementById('calendar');//           console.log(oCalendar);

       var oDate = new Date();

       var year = oDate.getFullYear();

       var month = oDate.getMonth()+1;


       //日期td

       var oTds = oCalendar.getElementsByTagName('td');


       var flag = false;

       oInput.onfocus = function () {

           showDate(year,month);

       }

       //显示日历

       function showDate(year,month) {

           if (false == flag) {


               var oTitle = document.('div');

               oTitle.className = 'title';


               oTitle.innerHTML = '<div> <span>'+(month-1)+'</span>月 </div> ' +

                       '<div> <span>'+year+'</span>年 <span>'+month+'</span>月 </div> ' +

                       '<div> <span>'+(month+1)+'</span>月 </div>';


               oCalendar.appendChild(oTitle);


               //月份span

                ospans = oCalendar.getElementsByTagName('span');

              // console.log(ospans);

                prevMonth = ospans[0];

                nextMonth = ospans[3];

                nowMonth = ospans[2];

                nowYear = ospans[1];


               //创建星期

               var otable = document.('table');

               var othead = document.('thead');

               var otr = document.('tr');

               var arr = ['日','一','二','三','四','五','六'];

               for (var i=0; i<arr.length; i++) {

                   //创建th

                   var oth = document.('th');

                   oth.innerHTML = arr[i];

                   otr.appendChild(oth);

               }

               othead.appendChild(otr);

               otable.appendChild(othead);

               oCalendar.appendChild(otable);



               //先获得当前月有多少天

               if (1 == month || 3 == month || 5 == month || 7 == month || 8 == month || 10 == month || 12 == month) {

                   var dayNum = 31;

               } else if (4 == month || 6 == month || 9 == month || 11 == month) {

                   var dayNum = 30;

               } else if (2 == month && isLeapYear(year)) {

                   var dayNum = 29;

               } else {

                   var dayNum = 28;

               }

               //确定当前月的1号是星期几

               oDate.setFullYear(year);

               oDate.setMonth(month-1);

               oDate.setDate(1);


               //日期

               var otbody = document.('tbody');

               for (var i=0; i<6; i++) {

                   var oTr = document.('tr');

                   //每行里面有7列

                   for (var j=0; j<7; j++) {

                       var oTd = document.('td');

                       //oTd.innerHTML = 1;

                       oTr.appendChild(oTd);

                   }

                   otbody.appendChild(oTr);

               }

               otable.appendChild(otbody);


               //获得今天1号对应的是星期几

               var week = oDate.getDay();

               var oTds = oCalendar.getElementsByTagName('td');

               //alert(week);

               for (var i=0; i<dayNum; i++) {

                   oTds[i+week].innerHTML = i+1;

               }


               //如果当前月month 是12或者1

               if (1 == month) {

                   prevMonth.innerHTML = 12;

               } else if (12 == month) {

                   nextMonth.innerHTML = 1;

               }

               //让当前日期显示红色、后面的显示蓝色

               showColor();

               //给左右月份绑定点击事件

                monthEvent();

               //给所有的td绑定点击事件

               tdClick();

               //判断最后一行是否全为空

               lastTr();

               //获得促销信息

               getPromotion();

               flag = true;

           }

       }

       //最后一行如果全部为空就将其隐藏

       function lastTr() {

           //查找最后一行的所有td

           var flag = true;

           for (var i=35; i<42; i++) {

               if (oTds[i].innerHTML != '') {

                   //有任何一个td不为空就设置为false

                   flag = false;

               }

           }

           //全部是空的

           if (flag) {

               for (var i=35; i<42; i++) {

                   oTds[i].style.display = 'none';

               }

           }

       }

       //给所有的td绑定点击事件

       function tdClick() {

           for (var i=0; i<oTds.length; i++) {

               oTds[i].onclick = function() {

                    if ('red' == this.className ||'blue' == this.className) {

                        var year = nowYear.innerHTML;

                        var month = nowMonth.innerHTML;

                        var date = this.innerHTML;

                        oInput.value = year +'-'+month+'-'+date;

                        flag = false;

                        oCalendar.innerHTML = '';

                    } else {

                        alert('您只能选择红色或蓝色区域');

                    }

               }

           }

       }

       //当前日期显示红色、后面的显示蓝色

       function showColor() {

           //当前的日期

           var oday = new Date().getDate();

           for (var i=0; i<oTds.length; i++) {

               if (oday == oTds[i].innerHTML) {

                   oTds[i].className = 'red';

                   var oindex = i;

               }

           }

           for (var j=oindex+1; j<oTds.length; j++) {

               oTds[j].className = 'blue';

           }

       }


       //给左右月份绑定点击事件

       function monthEvent() {

           //向左的月份div

           prevMonth.parentNode.onclick = function () {

               //alert('向左');

               flag = false;

               oCalendar.innerHTML = '';

               if (12 == prevMonth.innerHTML) {

                   showDate(year -= 1, 12);

               } else {

                   showDate(year,parseInt(prevMonth.innerHTML));

               }

           }

           //向左的月份div

           nextMonth.parentNode.onclick = function () {

               //alert('向右');

               flag = false;

               oCalendar.innerHTML = '';

               if (1 == nextMonth.innerHTML) {

                   showDate(year+=1,1);

               } else {

                   showDate(year,parseInt(nextMonth.innerHTML));

               }

           }

       }

       //判断是否是闰年

       function isLeapYear(year) {

           if (0 == year%100 && 0 == year%400) {

               return true;

           }else if (year%100 != 0 && year%4 ==0) {

               return true;

           } else {

               return false;

           }

       }

}

3、 从服务器获取促销的信息并在日历中显示

//从服务器获取促销信息

  function getPromotion() {

       $.request({

          method:"post", //获取方式

           url:"promotion.php", //从哪个文件中获取

           data:"",  //是否传递数据

           callback:function (res) {

               eval("var obj="+res);

               if (obj.status) {

                   var dates = obj.dates;

                   for (var i=0; i<dates.length; i++) {

                       for (var j=0; j<oTds.length; j++) {

                           if (oTds[j].innerHTML == dates[i]) {

                               oTds[j].innerHTML += "促销";

                               oTds[j].style.background = 'red';

                           }

                       }

                   }

               }

           }

       });

  }

$.request()是封装在js里的Ajax方法,代码如下:

var $ = {

    request:function(obj){

        var xhr;

        try {

            //主流浏览器里面的ajax对象

            xhr = new XMLHttpRequest();

        } catch(e) {

            //IE低版本的浏览器

            xhr = new ActiveXObject("Microsoft.XMLHTTP");

        }


        //建立和服务器的连接

        if (obj.method == 'get') {

            xhr.open(obj.method,obj.url+'?'+obj.data+'&'+Math.random(),true);

            xhr.send();

        } else if (obj.method == 'post') {

            xhr.open(obj.method,obj.url,true);

            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

            xhr.send(obj.data);

        }

        //监视服务器的处理状态

        xhr.onreadystatechange = function(){

            if (4 == xhr.readyState && 200 == xhr.status) {

                //说明请求成功了,输出服务器返回的数据

                obj.callback(xhr.responseText);

            }

        }

    }

}

promotion.php

<?php

    $data['status'] = 1;

    //促销时间

    $data['dates'] = array(28,29,30);


    echo json_encode($data);

最终效果图如下,样式不是很美观


使用ajax自定义日历的源码分享


文章来源:博客园