摘要:最近在做一个博客系统,其他需要用到博客日历控件,网上搜索了很多资料,其中大部分都是javascript的,经过总结使用jquery实现了博客日历效果。代码如下:

原文链接转载请注明:http://www.kwstu.com/ArticleView/admin_2013916154649951

一、效果图

二、页面文件

页面上需要添加<div id="cal"></div>标记。

三、JS代码

// JavaScript 日历

$(document).ready(function () {

    //当前时间

    $now = new Date();                      //当前的时间

    $nowYear = $now.getFullYear();          //当前的年

    $nowMonth = $now.getMonth();            //当前的月

    $nowDate = $now.getDate();              //当前的日

    $nowMonthCn = monthCn($nowMonth);       //格式化后的月

    //第一次设置当前时间

    calOpt($now);

    //上个月鼠标点击事件

    $('#prevMonth').live('click', function () {

        var year_text = $('.thisYear').text();

        var month_text = $('.thisMonth').text() - ;

        var date_text = $('.thisDate').text();

        $('#cal').html('');

        var d = new Date(year_text, month_text, date_text);

        calOpt(d);

        return false;

    });

    //下个月鼠标点击事件

    $('#nextMonth').live('click', function () {

        var year_text = $('.thisYear').text();

        var month_text = $('.thisMonth').text();

        var date_text = $('.thisDate').text();

        $('#cal').html('');

        var d = new Date(year_text, month_text, date_text);

        calOpt(d);

        return false;

    });

    //关闭日历鼠标点击事件

    $('#cal_close').live('click', function () {

        $('#cal').html('');

        $('#cal').hide();

        return false;

    });

});

//是否在数组中?返回下标+1

function inArray(val, arr) {

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

        if (val == arr[index]) {

            return index + ;

        }

    }

    return false;

}

//获取月份对应中文

function monthCn(month) {

    var m = new Array(, , , , , , , , , , , );

    return m[month];

}

//获取星期对应中文

function dayCn(day) {

    var w = new Array('日', '一', '二', '三', '四', '五', '六');

    return w[day];

}

//获取选择月对应的实际天数(也是本月的最后一天)

function getDates(year, month) {

    var d = new Date(year, month, ).getDate();

    return d;

}

//选择月的上个月的记录第几天

function prevDay(year, month, date) {

    var y = year;

    var m = month - ;

    var d = -(date - );

    var p = new Date(y, m, d).getDate();

    return p;

}

//选择月的下个月的记录第几天

function nextDay(year, month, date) {

    var y = year;

    var m = month;

    var d = ;

    var p = new Date(y, m, d).getDate();

    return p;

}

//活动数组数据解析--日期

function jsonDate(data) {

    var j = new Array();

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

        j.push(data[i].hDongD);

    }

    return j;

}

//活动数组数据解析--网址

function jsonUrl(data) {

    var j = new Array();

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

        j.push(data[i].hDongUrl);

    }

    return j;

}

//设置日历参数

function calOpt(date) {

    //获取选择系统时间

    var $year = date.getFullYear();         //年

    var $month = date.getMonth();           //月

    var $date = date.getDate();             //日

    var $day = date.getDay();               //星期

    var $monthCn = monthCn($month);         //格式化后的月

    //获取选择月的第一天对应的星期数+1

    var $fDay = new Date($year, $month, ).getDay() + ;

    //获取选择月对应的实际天数(也是本月的最后一天)

    var $lDate = getDates($year, $monthCn);

    //  alert('年:'+$year+'\n月:'+$monthCn+'\n日:'+$date+'\n选择月的第一天对应的星期数:'+$fDay+'\n选择月的最后一天:'+$lDate);

    //获取活动数组数据并输出日历

    //var test = new Array(

    //    { hDongD: 4, hDongUrl: 'http://www.ipiao.com' },

    //    { hDongD: 14, hDongUrl: 'http://www.1.com' }

    //);

    $.ajax({

        type:'post',

        url: "/PubConfig/getCalandDay",

        data:{'year':$year,'month':$monthCn},

        dataType:'json',

        success: function (result) {

            if(result == null){     //如果无活动数组数据,则声明一个空数据

                result = new Array();

            }

            calShow($fDay, $lDate, $date, $monthCn, $year, eval(result));

        },

        error: function (XMLHttpRequest, textStatus, errorThrown) { //发送失败事件

            alert(textStatus);

        }

    });

}

/*

输出日历

参数1:选择月的第一天对应的星期数+1;

参数2:选择月的最后一天;

参数3:选择的日;

参数4:选择的月;

参数5:选择的年;

参数6:活动数组数据;

*/

function calShow(fDay, lDate, date, monthCn, year, data) {

    var $dayN = ;      //记录第几天

    var $dayTd = ;     //记录第几天的TD

    var $rowMax = Math.ceil((lDate + fDay - ) / );  //总行数

    var $prev_dayN = prevDay(year, monthCn, fDay);//选择月的上个月的记录第几天

    var $next_dayN = nextDay(year, monthCn, fDay);//选择月的上个月的记录第几天

    //显示table>tr>th

    html = '<table>';

    html += '<tr><th colspan=7>';

    html += '<a id="prevMonth" href=""> << </a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';

    html += '<span class="thisYear">' + year + '</span>年' + '<span class="thisMonth">' + monthCn + '</span>月<span class="thisDate">' + date + '</span>';

    html += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a id="nextMonth" href=""> >> </a></th></tr>';

    html += '</th></tr>';

    //显示星期标题

    html += '<tr>';

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

        html += '<td>' + dayCn(i) + '</td>';

    }

    html += '</tr>';

    //显示日

    for (var row = ; row <= $rowMax; row++) {

        html += '<tr>';

        for (var col = ; col <= ; col++) {

            if ($dayTd < fDay) {

                html += '<td class="prev_dayN" dayn="' + $prev_dayN + '">' + $prev_dayN + '</td>';

                $dayTd++;

                $prev_dayN++;

            } else {

                var dayIndex = inArray($dayN, jsonDate(data));

                var urlIndex = jsonUrl(data)[dayIndex - ];

                //如果有活动则使用活动样式并加上活动链接

                if (dayIndex) {

                    //如果日期为当天则用红色加粗显示

                    if ($dayN == date && $nowMonth +  == monthCn && $nowYear == year) {

                        html += '<td class="activity now_date" dayn="' + $dayN + '" title="点击查看当天活动"><a href="' + urlIndex + '">' + $dayN + '</a></td>';

                    } else {

                        html += '<td class="activity" dayn="' + $dayN + '" title="点击查看当天活动"><a href="' + urlIndex + '">' + $dayN + '</a></td>';

                    }

                } else {

                    //如果日期为当天则用红色加粗显示

                    if ($dayN == date && $nowMonth +  == monthCn && $nowYear == year) {

                        html += '<td class="now_date" dayn="' + $dayN + '">' + $dayN + '</td>';

                    } else {

                        html += '<td dayn="' + $dayN + '">' + $dayN + '</td>';

                    }

                }

                $dayN++;

            }

            if ($dayN > lDate) {

                var $next_dayNum = (row *  - ($dayN - )) - ($dayTd - );

                for (var i = ; i < $next_dayNum; $next_dayNum--) {

                    html += '<td class="next_dayN" dayn="' + $next_dayN + '">' + $next_dayN + '</td>';

                    $next_dayN++;

                }

                break;

            }

        }

        html += '</tr>';

    }

    //结束输出table

    html += '</table>';

    html += '<div id="cal_bottom"><a id="cal_close" href="">关闭</a></div>';

    $('#cal').append(html);

}

四、CSS文件

@CHARSET "UTF-8";

* {

    list-style: none;

    margin: 0px;

    padding: 0px;

}

img {

    border: ;

}

a {

    text-decoration: none;

    color: #;

}

    a:hover {

        text-decoration: none;

    }

/* ================================================================================ */

/* 日历Div全局样式 */

#cal {

    width: 245px;

}

#cal_bottom {

    padding: 2px;

    border-top: ;

    text-align: right;

}

/* 日历Table样式 */

table {

    border: ;

    border-collapse: collapse;

    border-spacing: ;

}

tr {

    height: 30px;

    line-height: 30px;

}

th {

    font-weight: normal;

}

.thisDate {

    display: none;

}

#prevMonth {

}

.nextMonth {

}

th a {

    display: inline-block;

    vertical-align: 1px;

}

td {

    width: 35px;

    text-align: center;

}

    td a {

        display: inline-block;

        width: %;

        height: %;

    }

/* 当前日样式 */

.now_date {

    background: #BBB;

}

/* 月前,月后样式 */

.prev_dayN, .next_dayN {

    color: #CCC;

}

/* 活动数据样式 */

.activity {

}

    .activity a {

        color: #2F76AC;

        text-decoration: underline;

    }

五、后台代码

//日历控件获取当前月发布文章的天

        public ActionResult getCalandDay(string year, string month)

        {

            string userId = getBlogUserId();

            StringBuilder output = new StringBuilder("");

            DateTime dt = System.DateTime.Now;

            string curMonth = year.ToString() + (month.Length ==  ? ("" + month) : month);

            var res = db.Database.SqlQuery<CurMonthArticleViewModel>("select id,createtime from article where mid='" + userId + "' and to_char(createtime,'YYYYMM')='" + curMonth + "'").ToList();

            int i=;

            output.Append("new Array(");

            foreach (var cc in res)

            {

                if (i == )

                    output.Append("{ hDongD:"+cc.CREATETIME.Day+", hDongUrl: '"+cc.ID+"' }");

                else

                {

                    string curDay = cc.CREATETIME.Day.ToString();

                    string resultDay = output.ToString();

                    string[] str = resultDay.Split(','); //得到一个str的数组{“1”,”2“,“3”,”4“,“5”,”6“}

                    Boolean c = true;

                    foreach (string s in str)

                    {

                        if (s == curDay) c = false;

                    }

                    if (c)

                    {

                        output.Append(",{ hDongD:" + cc.CREATETIME.Day + ", hDongUrl: '/" + cc.ID + "--" + cc.CREATETIME + "' }");

                    }

                }

                i++;

            }

            output.Append(");");

            return Json(output.ToString());

            //return Json("new Array({ hDongD: 4, hDongUrl: 'http://www.ipiao.com' },  { hDongD: 14, hDongUrl: 'http://www.1.com' });");

        }

源码下载

.net mvc页面UI之Jquery博客日历控件的更多相关文章

  1. ASP.NET MVC页面UI之联动下拉选择控件(省、市、县联动选择)

    地区选择操作在WEB应用中比较常见的操作,本文在.net mvc3下实现了省市县三级联动选择功能. 本文博客出处:http://www.kwstu.com/ArticleView/admin_2013 ...

  2. jquery博客收集的IE6中CSS常见BUG全集及解决方案

    今天的样式调的纠结,一会这边一会那么把jquery博客折腾的头大,浏览器兼容性.晚上闲着收集一些常见IE6中的BUG 3像素问题及解决办法 当使用float浮动容器后,在IE6下会产生3px的空隙,有 ...

  3. JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客

    JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客https://blog.csdn.net/KooKing_L/article/details/79711379

  4. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

    博客分类: jquery-easyui jQueryAjax框架HTML  现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...

  5. 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”

    接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...

  6. jQuery 日历控件 FullCalendar 初识

    最近有个日程管理的需求,就学习了一下 FullCalendar 控件的一些基本知识,本文不是详细介绍该控件的 API 的文档,而是记录本人使用过程中的一些学习情况. 先看一下效果图  月/周/日视图 ...

  7. jquery的上传控件uploadly,每行都有一个这样的控件对id选择器的使用

    1.先看看预览图 这个是我的页面,其中如果我没点击添加一行的时候,会把本来有的数据进行循环出来,这个时候每个记录都必须有个上传图片的按钮,但是jquery的uploadly这个控件只是锁定id的,至少 ...

  8. jquery插件——日历控件

    今天在网上有看到一个jquery插件——日历控件,不过之前也在柯乐义的网站上看到了(http://keleyi.com/ 推荐下) 这个插件看着比较大气,所以干脆也分享下,以后自己也好用一点儿 1.页 ...

  9. mvc 日历控件

    第二个是日历控件,在网上查了一个普通的日历控件,也生成了下拉的日历样子,但是一些脚本比如选择年月,需要一些时间,最后只好套用了My97 DatePicker,这样以来其实简单多了. 第一步:下载 My ...

随机推荐

  1. Meteor入门

    转载Meteor入门介绍   Meteor是什么 基于nodejs的实时web APP开发框架. Meteor能带来什么 简单的说,你可以用js搞定客户端.服务端的开发.另外,客户端.服务端的界限被极 ...

  2. Android - JNI加入标准C++文件

    JNI加入标准C++文件 本文地址: http://blog.csdn.net/caroline_wendy 其余參考: http://blog.csdn.net/caroline_wendy/art ...

  3. 基于Hama并联平台Finding a Maximal Independent Set 设计与实现算法

    笔者:白松 NPU学生. 转载请注明出处:http://blog.csdn.net/xin_jmail/article/details/32101483. 本文參加了2014年CSDN博文大赛,假设您 ...

  4. 归并排序 & 快速排序

    归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有 ...

  5. 如此高效通用的分页存储过程是带有sql注入漏洞的

    原文:如此高效通用的分页存储过程是带有sql注入漏洞的 在google中搜索“分页存储过程”会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如 ...

  6. 网站静态化处理—CSI(5)

    网站静态化处理—CSI(5) 讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说 ...

  7. 让你的Windows不断重启的C语言代码

    原文:让你的Windows不断重启的C语言代码 没有写Linux的原因是因为搞不定Linux下的权限问题,而Windows下基本上使用电脑的用户都是管理员,所以钻个空了,不多说下面是代码#includ ...

  8. MySQL 一般查询日志(General Query Log)

    与大多数关系型数据库,日志文件是MySQL数据库的一个重要组成部分.MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志.慢查询日志,等等. 这些日志能够帮助我们定位mysqld ...

  9. C# Winform 界面线程的Invoke死锁,以及Application.DoEvent的问题

    1.对于非界面线程来说,Invoke是把一个操作丢到界面线程的队列里,然后阻塞,等到这个操作被界面线程完成后,才继续后续操作.也就是说,Invoke是同步的. 问题来了,如果界面线程此时正在等待这个非 ...

  10. td中的值自动换行

    设置td中的值自动换行在<td ></td> 中加上这样一句代码,可以简省设置,使长字符串换行.而不用设置width,height. style="word-wrap ...