zoukankan      html  css  js  c++  java
  • easyui源码翻译1.32--Calendar(日历)

    前言

      前几天加班比较忙 未能及时更新翻译的 今天多发布几篇。。下载该插件翻译源码

         日历控件显示一个月的日历,允许用户选择日期和移动到下一个或上一个月。默认情况下,一周的第一天是周日。它可以通过设置'firstDay'属性的值来更改设置

    源码

    /**
     * jQuery EasyUI 1.3.2
     * 
     *翻译:qq 1364386878
     */
    (function ($) {
        //调整日历大小
        function _resize(jq) {
            var opts = $.data(jq, "calendar").options;
            var t = $(jq);
            if (opts.fit == true) {
                var p = t.parent();
                opts.width = p.width();
                opts.height = p.height();
            }
            var header = t.find(".calendar-header");
            t._outerWidth(opts.width);
            t._outerHeight(opts.height);
            t.find(".calendar-body")._outerHeight(t.height() - header._outerHeight());
        };
        // 包裹日历
        function wrapCalendar(jq) {
            //wrapInner()方法使用指定的 HTML 内容或元素,来包裹每个被选元素中的所有内容 (inner HTML)。
            //详情参考http://www.w3school.com.cn/jquery/manipulation_wrapinner.asp
            $(jq).addClass("calendar").wrapInner("<div class="calendar-header">"
                + "<div class="calendar-prevmonth"></div>"
                + "<div class="calendar-nextmonth"></div>"
                + "<div class="calendar-prevyear"></div>"
                + "<div class="calendar-nextyear"></div>"
                + "<div class="calendar-title">"
                + "<span>Aprial 2010</span>"
                + "</div>"
                + "</div>"
                + "<div class="calendar-body">"
                + "<div class="calendar-menu">"
                + "<div class="calendar-menu-year-inner">"
                + "<span class="calendar-menu-prev"></span>"
                + "<span><input class="calendar-menu-year" type="text"></input></span>"
                + "<span class="calendar-menu-next"></span>"
                + "</div>"
                + "<div class="calendar-menu-month-inner">"
                + "</div>"
                + "</div>"
                + "</div>");
            //日历头部“年月”hover、click事件
            $(jq).find(".calendar-title span").hover(function () {
                $(this).addClass("calendar-menu-hover");
            }, function () {
                $(this).removeClass("calendar-menu-hover");
            }).click(function () {
                var menu = $(jq).find(".calendar-menu");
                if (menu.is(":visible")) {
                    menu.hide();
                } else {
                    showMenu(jq);//显示年份和月份选择的菜单
                }
            });
            //日历头部四个按钮hover、click事件
            $(".calendar-prevmonth,.calendar-nextmonth,.calendar-prevyear,.calendar-nextyear", jq).hover(function () {
                $(this).addClass("calendar-nav-hover");
            }, function () {
                $(this).removeClass("calendar-nav-hover");
            });
            $(jq).find(".calendar-nextmonth").click(function () {
                toMonth(jq, 1);//下月
            });
            $(jq).find(".calendar-prevmonth").click(function () {
                toMonth(jq, -1);//上月
            });
            $(jq).find(".calendar-nextyear").click(function () {
                toYear(jq, 1);//下年
            });
            $(jq).find(".calendar-prevyear").click(function () {
                toYear(jq, -1);//上年
            });
            $(jq).bind("_resize", function () {
                var options = $.data(jq, "calendar").options;
                if (options.fit == true) {
                    _resize(jq);
                }
                return false;
            });
        };
        //上一月、下一月选择按钮处理方法 1:表示下月;-1:表示上月
        function toMonth(jq, tag) {
            var opts = $.data(jq, "calendar").options;
            opts.month += tag;
            if (opts.month > 12) {
                opts.year++;
                opts.month = 1;
            } else {
                if (opts.month < 1) {
                    opts.year--;
                    opts.month = 12;
                }
            }
            renderCalendar(jq);
            //日历头部月份更改
            var inner = $(jq).find(".calendar-menu-month-inner");
            inner.find("td.calendar-selected").removeClass("calendar-selected");
            inner.find("td:eq(" + (opts.month - 1) + ")").addClass("calendar-selected");
        };
        //上一年、下一年选择按钮处理方法   (1:表示下年;-1:表示上年)
        function toYear(jq, tag) {
            var options = $.data(jq, "calendar").options;
            options.year += tag;
            renderCalendar(jq);
            ////日历头部年份更改
            var year = $(jq).find(".calendar-menu-year");
            year.val(options.year);
        };
        //显示年份和月份选择的菜单
        function showMenu(jq) {
            var opts = $.data(jq, "calendar").options;
            $(jq).find(".calendar-menu").show();
            if ($(jq).find(".calendar-menu-month-inner").is(":empty")) {
                $(jq).find(".calendar-menu-month-inner").empty();
                ////表格布局月份选择菜单
                var t = $("<table></table>").appendTo($(jq).find(".calendar-menu-month-inner"));
                var idx = 0;
                for (var i = 0; i < 3; i++) {
                    var tr = $("<tr></tr>").appendTo(t);
                    for (var j = 0; j < 4; j++) {
                        $("<td class="calendar-menu-month"></td>").html(opts.months[idx++]).attr("abbr", idx).appendTo(tr);
                    }
                }
                $(jq).find(".calendar-menu-prev,.calendar-menu-next").hover(function () {
                    $(this).addClass("calendar-menu-hover");
                }, function () {
                    $(this).removeClass("calendar-menu-hover");
                });
                //下年按钮click事件
             
                $(jq).find(".calendar-menu-next").click(function () {
                    var y = $(jq).find(".calendar-menu-year");
                    if (!isNaN(y.val())) {
                        y.val(parseInt(y.val()) + 1);
                    }
                });
                //上年按钮click事件
                $(jq).find(".calendar-menu-prev").click(function () {
                    var y = $(jq).find(".calendar-menu-year");
                    if (!isNaN(y.val())) {
                        y.val(parseInt(y.val() - 1));
                    }
                });
                //菜单年份输入框keypress事件
                $(jq).find(".calendar-menu-year").keypress(function (e) {
                    if (e.keyCode == 13) {
                        hideMenu();
                    }
                });
                //菜单月份hover、click事件
                $(jq).find(".calendar-menu-month").hover(function () {
                    $(this).addClass("calendar-menu-hover");
                }, function () {
                    $(this).removeClass("calendar-menu-hover");
                }).click(function () {
                    var menu = $(jq).find(".calendar-menu");
                    menu.find(".calendar-selected").removeClass("calendar-selected");
                    $(this).addClass("calendar-selected");
                    hideMenu();
                });
            }
            //隐藏菜单
            function hideMenu() {
                var menu = $(jq).find(".calendar-menu");
                var year = menu.find(".calendar-menu-year").val();//获取菜单年份输入框值
                var _1b = menu.find(".calendar-selected").attr("abbr");//获取菜单选择的月份值
                if (!isNaN(year)) {
                    opts.year = parseInt(year);
                    opts.month = parseInt(_1b);
                    renderCalendar(jq);
                }
                menu.hide();
            };
    
    
            var body = $(jq).find(".calendar-body");
            var menu = $(jq).find(".calendar-menu");
            var yearInner = menu.find(".calendar-menu-year-inner");
            var monthInner = menu.find(".calendar-menu-month-inner");
            yearInner.find("input").val(opts.year).focus();//默认年份输入框获得焦点
            monthInner.find("td.calendar-selected").removeClass("calendar-selected");
            monthInner.find("td:eq(" + (opts.month - 1) + ")").addClass("calendar-selected");
            menu._outerWidth(body._outerWidth());
            menu._outerHeight(body._outerHeight());
            monthInner._outerHeight(menu.height() - yearInner._outerHeight());
        };
        //根据年月获取日历所要显示的日期数组
        function getDateArray(jq, year, month) {
            var opts = $.data(jq, "calendar").options;
            var dateArray = [];
            var date = new Date(year, month, 0).getDate();
            for (var i = 1; i <= date; i++) {
                dateArray.push([year, month, i]);
            }
            //dates是存放星期六-星期天的日期的二维数组
            //result是存放dates的数组
            //result格式:[[[year,month,day],...,[]],...,[]]
            var result = [], dates = [];
            var _29 = -1;
            while (dateArray.length > 0) {
                //shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
                var date = dateArray.shift();
                dates.push(date);
                var day = new Date(date[0], date[1] - 1, date[2]).getDay();
                if (_29 == day) {
                    day = 0;
                } else {
                    if (day == (opts.firstDay == 0 ? 7 : opts.firstDay) - 1) {
                        result.push(dates);
                        dates = [];
                    }
                }
                _29 = day;
            }
            if (dates.length) {
                result.push(dates);
            }
            var firstWeek = result[0];//获取第一个星期
            //若不足7天,取前面日期补足
            if (firstWeek.length < 7) {
                while (firstWeek.length < 7) {
                    var firstDate = firstWeek[0];
                    var date = new Date(firstDate[0], firstDate[1] - 1, firstDate[2] - 1);
                    firstWeek.unshift([date.getFullYear(), date.getMonth() + 1, date.getDate()]);
                }
            } else {
                var firstDate = firstWeek[0];
                var dates = [];
                for (var i = 1; i <= 7; i++) {
                    var date = new Date(firstDate[0], firstDate[1] - 1, firstDate[2] - i);
                    dates.unshift([date.getFullYear(), date.getMonth() + 1, date.getDate()]);
                }
                //unshift()方法可向数组的开头添加一个或更多元素,并返回新的长度。
                result.unshift(dates);
            }
            var lastWeek = result[result.length - 1];//获取最后一个星期
            //若不足7天,取后面日期补足
            while (lastWeek.length < 7) {
                var lastDate = lastWeek[lastWeek.length - 1];
                var date = new Date(lastDate[0], lastDate[1] - 1, lastDate[2] + 1);
                lastWeek.push([date.getFullYear(), date.getMonth() + 1, date.getDate()]);
            }
            if (result.length < 6) {
                var lastDate = lastWeek[lastWeek.length - 1];
                var dates = [];
                for (var i = 1; i <= 7; i++) {
                    var date = new Date(lastDate[0], lastDate[1] - 1, lastDate[2] + i);
                    dates.push([date.getFullYear(), date.getMonth() + 1, date.getDate()]);
                }
                result.push(dates);
            }
            return result;
        };
        // 渲染日历
        function renderCalendar(jq) {
            var opts = $.data(jq, "calendar").options;
            $(jq).find(".calendar-title span").html(opts.months[opts.month - 1] + " " + opts.year);//设置日历头部年月值
            var body = $(jq).find("div.calendar-body");
            body.find(">table").remove();//清空日历body
            //table布局日历body
            var t = $("<table cellspacing="0" cellpadding="0" border="0"><thead></thead><tbody></tbody></table>").prependTo(body);
            var tr = $("<tr></tr>").appendTo(t.find("thead"));
           
            for (var i = opts.firstDay; i < opts.weeks.length; i++) {
                tr.append("<th>" + opts.weeks[i] + "</th>");
            }
            for (var i = 0; i < opts.firstDay; i++) {
                tr.append("<th>" + opts.weeks[i] + "</th>");
            }
            var _32 = getDateArray(jq, opts.year, opts.month);
            for (var i = 0; i < _32.length; i++) {
                var _33 = _32[i];
                var tr = $("<tr></tr>").appendTo(t.find("tbody"));
                for (var j = 0; j < _33.length; j++) {
                    var day = _33[j];
                    $("<td class="calendar-day calendar-other-month"></td>").attr("abbr", day[0] + "," + day[1] + "," + day[2]).html(day[2]).appendTo(tr);
                }
            }
            t.find("td[abbr^="" + opts.year + "," + opts.month + ""]").removeClass("calendar-other-month");
            var now = new Date();
            var _34 = now.getFullYear() + "," + (now.getMonth() + 1) + "," + now.getDate();
            t.find("td[abbr="" + _34 + ""]").addClass("calendar-today");
            if (opts.current) {
                t.find(".calendar-selected").removeClass("calendar-selected");
                var _35 = opts.current.getFullYear() + "," + (opts.current.getMonth() + 1) + "," + opts.current.getDate();
                t.find("td[abbr="" + _35 + ""]").addClass("calendar-selected");
            }
            var _36 = 6 - opts.firstDay;
            var _37 = _36 + 1;
            if (_36 >= 7) {
                _36 -= 7;
            }
            if (_37 >= 7) {
                _37 -= 7;
            }
            t.find("tr").find("td:eq(" + _36 + ")").addClass("calendar-saturday");
            t.find("tr").find("td:eq(" + _37 + ")").addClass("calendar-sunday");
            t.find("td").hover(function () {
                $(this).addClass("calendar-hover");
            }, function () {
                $(this).removeClass("calendar-hover");
            }).click(function () {
                t.find(".calendar-selected").removeClass("calendar-selected");
                $(this).addClass("calendar-selected");
                var _38 = $(this).attr("abbr").split(",");
                opts.current = new Date(_38[0], parseInt(_38[1]) - 1, _38[2]);
                opts.onSelect.call(jq, opts.current);
            });
        };
        //初始化日历
        $.fn.calendar = function (options, parm) {
            if (typeof options == "string") {
                return $.fn.calendar.methods[options](this, parm);
            }
            options = options || {};
            return this.each(function () {
                var calendar = $.data(this, "calendar");
                if (calendar) {
                    $.extend(calendar.options, options);
                } else {
                    calendar = $.data(this, "calendar",
                        { options: $.extend({}, $.fn.calendar.defaults, $.fn.calendar.parseOptions(this), options) });
                    wrapCalendar(this);
                }
                if (calendar.options.border == false) {
                    $(this).addClass("calendar-noborder");
                }
                _resize(this);
                renderCalendar(this);
                $(this).find("div.calendar-menu").hide();
            });
        };
        //日历默认方法
        $.fn.calendar.methods = {
            //返回参数对象。
            options: function (jq) {
                return $.data(jq[0], "calendar").options;
            },
            //调整日历大小
            resize: function (jq) {
                return jq.each(function () {
                    _resize(this);
                });
            },
            //移动日历到指定日期
            moveTo: function (jq, date) {
                return jq.each(function () {
                    $(this).calendar({ year: date.getFullYear(), month: date.getMonth() + 1, current: date });
                });
            }
        };
        //解析器配置
        $.fn.calendar.parseOptions = function (target) {
            var t = $(target);
            return $.extend({}, $.parser.parseOptions(target, ["width", "height", { firstDay: "number", fit: "boolean", border: "boolean" }]));
        };
        //日历默认 属性和事件
        $.fn.calendar.defaults = {
            //日历控件宽度
             180,
            //日历控件高度
            height: 180,
            //当设置为true的时候,将设置日历控件大小自适应父容器
            fit: false,
            //定义是否显示边框
            border: true,
            //定义一周的第一天是星期几。0=星期日、1=星期一 等
            firstDay: 0,
            //显示的周列表内容
            weeks: ["S", "M", "T", "W", "T", "F", "S"],
            //显示的月列表内容
            months: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
            //年日历。下面的例子显示了如何使用指定的年份和月份创建一个日历
            year: new Date().getFullYear(),
            //月日历。
            month: new Date().getMonth() + 1,
            //当前日期
            current: new Date(),
            //在用户选择一天的时候触发
            onSelect: function (_3e) {
            }
        };
    })(jQuery);
    View Code

    示例代码

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Basic Calendar - jQuery EasyUI Demo</title>
        <link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
        <link rel="stylesheet" type="text/css" href="../../themes/icon.css">
        <link rel="stylesheet" type="text/css" href="../demo.css">
        <script type="text/javascript" src="../../jquery-1.8.0.min.js"></script>
        <script src="../../plugins2/jquery.parser.js"></script>
        <script src="../../plugins2/jquery.calendar.js"></script>
    </head>
    <body>
        <h2>Basic Calendar</h2>
        <div class="demo-info" style="margin-bottom:10px">
            <div class="demo-tip icon-tip"></div>
            <div>Click to select date.</div>
        </div>
        
        <div class="easyui-calendar" style="180px;height:180px;"></div>
    
    </body>
    </html>
    View Code

    插件效果

    热爱编程,热爱技术,热爱生活
  • 相关阅读:
    Markdown 语法说明 (简体中文版)
    Markdown Reference
    BZOJ 2229 最小割
    BZOJ 3569 DZY Loves Chinese II
    BZOJ 3563 DZY Loves Chinese
    BZOJ 2956 模积和
    BZOJ 2957 楼房重建
    查漏补缺:面向对象设计原则
    添砖加瓦:设计模式(简单工厂模式)
    添砖加瓦:设计模式(总述)
  • 原文地址:https://www.cnblogs.com/DemoLee/p/3474735.html
Copyright © 2011-2022 走看看