为了账号安全,请及时绑定邮箱和手机立即绑定

DatePicker组件开发

  • 二、date.js

    (function() { // 为了防止模块编写的时候污染外部环境,就会用匿名函数。
      let datepicker = {};
      datepicker.getMonthData = function(year, month) {
        let ret = [];
        if (!year && !month && month !==0) {
          let today = new Date();
          year = today.getFullYear();
          month = today.getMonth() + 1;
        }
        let firstDay = new Date(year, month - 1, 1);
        let firstDayWeekDay = firstDay.getDay();
        if (firstDayWeekDay === 0) {
          firstDayWeekDay = 7;
        }
        year = firstDay.getFullYear(); // 哪年
        month = firstDay.getMonth() + 1; // 哪月
        let lastDayOfLastMoth = new Date(year, month - 1, 0); // 上个月最后一天
        let lastDateOfLastMonth = lastDayOfLastMoth.getDate(); // 上个月最后一天是几号
        let preMonthDayCount = firstDayWeekDay - 1; // 上个月最后一天是星期几
        let lastDay = new Date(year, month, 0); // 这个月最后一天
        let lastDate = lastDay.getDate(); // 这个月最后一天是几号
        for (let i = 0; i < 7*6; i++) {
          let date = i - preMonthDayCount + 1; // 距离上个月最后一天多长时间(单位:天)
          let showDate = date;
          let thisMonth = month;
          if (date <= 0) {
            // 上一月
            thisMonth = month - 1; // 上个月月份
            showDate = lastDateOfLastMonth + date; // 上个月日期
          } else if (date > lastDate) {
            // 下一月
            thisMonth = month + 1; // 下个月月份
            showDate = showDate - lastDate; // 下个月日期
          }
          // if (thisMonth === 0) {
          //   thisMonth = 12;
          // }
          // if (thisMonth === 13) {
          //   thisMonth = 1;
          // }
          thisMonth = thisMonth === 0 ? 12 :thisMonth === 13 ? 1 : thisMonth;
          ret.push({
            month: thisMonth,
            date: date,
            showDate: showDate
          });
        }
        return {
          year: year,
          month: month,
          days: ret
        };
      };
      window.datePicker = datepicker;
    })();

    三、main.js

    (function() {
      let datePicker = window.datePicker;
      let monthData;
      let $wrapper;
      datePicker.buildUi = function(year, month) {
        monthData = datePicker.getMonthData(year, month);
        let html = '<div class="ui-datepicker-head">'+
          '<a class="ui-datepicker-btn ui-datepicker-prev-btn">&lt;</a>'+
          ' <a class="ui-datepicker-btn ui-datepicker-next-btn">&gt;</a>'+
        ' <span class="ui-datepicker-curr-month">' + monthData.year + '- ' + monthData.month + '</span>'+
        ' </div>'+
        ' <div class="ui-datepicker-body">'+
        ' <table>'+
        ' <thead>'+
        '  <tr>'+
          '<th>一</th>'+
          ' <th>二</th>'+
        ' <th>三</th>'+
        '<th>四</th>'+
        '<th>五</th>'+
        ' <th>六</th>'+
        ' <th>七</th>'+
       '   </tr>'+
          '</thead>'+
         ' <tbody>';
        for (let i = 0; i < monthData.days.length; i++) {
          let date = monthData.days[i];
          if (i % 7 === 0) {
            html += '<tr>';
          }
          html += '<td data-date="' + date.date + '">' + date.showDate + '</td>';
          if (i % 7 === 6) {
            html += '</tr>';
          }
        }
        html += '</tbody>' +
            '</table>' +
            '</div>';
        return html;
      };
      datePicker.render = function(direction) {
        let year,month;
        if (monthData) {
          year = monthData.year;
          month = monthData.month;
        }
        if (direction === 'prev') {
          month--;
        }
        if (direction === 'next') {
          month++;
        }
        let html = datePicker.buildUi(year, month);
        $wrapper = document.querySelector('.ui-datepicker-wrapper');
        if (!$wrapper) {
          $wrapper = document.createElement('div');
          document.body.appendChild($wrapper);
          $wrapper.className = 'ui-datepicker-wrapper';
        }
        $wrapper.innerHTML = html;
      };
      datePicker.init = function($dom) {
        datePicker.render();
        let $input = document.querySelector($dom);
        let isOpen = false;
        // $dom点击后,日历显示出来,日历位置适应。
        $input.addEventListener('click', function() {
          if (isOpen) {
            $wrapper.classList.remove('ui-datepicker-wrapper-show');
            isOpen = false;
          } else {
            $wrapper.classList.add('ui-datepicker-wrapper-show');
            let left = $input.offsetLeft;
            let top = $input.offsetTop;
            let height = $input.offsetHeight;
            $wrapper.style.top = top + height + 2 + 'px';
            $wrapper.style.left = left + 'px';
            isOpen = true;
          }
        }, false);
        // $wrapper.querySelector('.ui-datepicker-btn').addEventListener();
        // 每次渲染完重新绑定事件
        // 为不变的元素绑定事件
        $wrapper.addEventListener('click', function(e) {
          let $target = e.target;
          // let containsBtn = $target.classList.contains('ui-datepicker-btn');
          if (!$target.classList.contains('ui-datepicker-btn')) {
            return;
          }
          if ($target.classList.contains('ui-datepicker-prev-btn')) {
            datePicker.render('prev');
          } else if ($target.classList.contains('ui-datepicker-next-btn')) {
            datePicker.render('next');
          }
        }, false);
        $wrapper.addEventListener('click', function(e) {
          let $target = e.target;
          if ($target.tagName.toLowerCase() !== 'td') {
            return;
          }
          let date = new Date(monthData.year, monthData.month - 1, $target.dataset.date);
          $input.value = format(date);
          $wrapper.classList.remove('ui-datepicker-wrapper-show');
          isOpen = false;
        })
      }
      function format(date) {
        let ret = '';
        let shuffle = function(num) {
          if (num <= 9) {
            return `0${num}`;
          }
          return num;
        };
        ret += date.getFullYear() + '-';
        ret += shuffle(date.getMonth() + 1) + '-';
        ret += shuffle(date.getDate());
        return ret;
      }
    })();


    查看全部
    3 采集 收起 来源:总结

    2018-07-26

  • 一、优化方向:

    1、如何在移动端使用这个组件。

    2、页面定位比较复杂时,如何处理弹出框的位置。

    3、如何让上一个月,下一个月,使用不同的样式。

    4、如何让某些日期可点,某些日期不可点。

    查看全部
    1 采集 收起 来源:总结

    2018-07-26

  • 一、<a href=""> 写了href,但是里面没有赋值,导致点击a链接会重新刷新页面,一直不能跳转到上一个月。这个bug找了很久。

    查看全部
    1 采集 收起 来源:月份切换

    2018-07-26

  • 一、为了防止模块编写的时候污染环境,就会用匿名函数。


    查看全部
    0 采集 收起 来源:获取日历数据

    2018-07-25

  • 一、日期对象:new Date(year, month-1, date)

    1、月份需要-1.

    2、越界自动进(退)位

    3、getFullYear() / getMonth() / getDate()

    4、getYear():当前年距离1900年多少年。

    5、getDay():当前日期是周几

    二、日期

    1、当月第一天:new Date(year, month-1, 1)。

    2、当月最后一天:new Date(year, month, 0)。

    3、星期一-星期天[1, 2, 3, 4, 5, 6, 0]

    查看全部
    0 采集 收起 来源:前置知识

    2018-07-25

  • 一、webstorm:从1到10递增快捷键:li{$}*10

    查看全部
    1 采集 收起 来源:静态结构

    2018-07-25

  • 一、日历制作过程

    1、静态结构编写。

    2、日历数据。

    3、数据渲染。

    4、事件处理。

    查看全部
    0 采集 收起 来源:课程介绍

    2018-07-25

  • 当月第一天,最后一天

    查看全部
    0 采集 收起 来源:前置知识

    2018-07-09

  • cursor:pointer;是鼠标指针移上去显示手形状

    查看全部
    0 采集 收起 来源:样式编写

    2018-04-23

  • datepicker.init = function (input, year, month) { var html = datepicker.buildUi(year, month), $wrapper = document.createElement("div"); $wrapper.className = "ui-datepicker-wrapper"; $wrapper.innerHTML = html; document.body.appendChild($wrapper); var $input = document.querySelector(input), isOpen = false; $input.addEventListener("click",function () { if(isOpen){ $wrapper.classList.remove("ui-datepicker-wrapper-show"); isOpen = false; }else { $wrapper.classList.add("ui-datepicker-wrapper-show"); var left = $input.offsetLeft, top = $input.offsetTop, height = $input.offsetHeight; $wrapper.style.top = top +height + 2 + "px"; $wrapper.style.left = left + "px"; isOpen = true; } },false);
    查看全部
    0 采集 收起 来源:展开收起

    2018-03-22

  • //循环获取当前月的每一天 for(var i=0; i<42; i++){ //算出真实日期是多少(只看day 不考虑month) var date = i - preMonthDayCount +1; var showDate = date; //指定当前月 var thisMonth = month; //处理上一月与下一月 if(date <= 0){ //上一月 thisMonth = month - 1; showDate = lastDateOfLastMonth + date; }else if(date > lastDate){ //下一月 thisMonth = month + 1; showDate = showDate - lastDate; } //修正月显示 if(thisMonth === 0) thisMonth =12; if(thisMonth === 13) thisMonth = 1; //返回相关数据 ret.push({ month:thisMonth, date:date, showDate:showDate }) } return ret; }; window.datepicker = datepicker; })();
    查看全部
    1 采集 收起 来源:获取日历数据

    2018-03-22

  • (function () { var datepicker = {}; datepicker.getMonthDate = function (year, month) { var ret = []; //如果没有传入年月,则获取当前年月 if(!year || !month){ var today = new Date(); year = today.getFullYear(); month = today.getMonth() + 1; } //获取本月的第一天 var firstDay = new Date(year, month - 1, 1); //判断当天是周几 var firstDayWeekDay = firstDay.getDay(); //修正星期天显示为0 if(firstDayWeekDay === 0) firstDayWeekDay = 7; //获取上个月的最后一天 var lastDayOfLastMonth = new Date(year, month - 1, 0); var lastDateOfLastMonth = lastDayOfLastMonth.getDate(); //获取上个月应该显示的天数 var preMonthDayCount = firstDayWeekDay - 1; //获取当月的最后一天 var lastDay = new Date(year, month, 0); var lastDate = lastDay.getDate();
    查看全部
    0 采集 收起 来源:获取日历数据

    2018-03-15

  • 当月的第一天 new Date(year, month-1, 1) 当月的最后一天 new Date(year, month, 0) getFullyear() 获取年份 getMonth() 获取月份 getDate() 获取天 getDay() 获取星期几
    查看全部
    0 采集 收起 来源:前置知识

    2018-03-06

举报

0/150
提交
取消
课程须知
需要有HTML/CSS/JavaScript基础
老师告诉你能学到什么?
1、使用HTML和CSS编写组件的静态UI 2、使用原生javascript完成日历数据的获取 3、使用原生javascript实现静态UI和动态数据的结合,完成日历数据的渲染 4、事件绑定处理 5、前端组件的基本构成和编写模式

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!