最近接了一个需求,把excel做的表格开发到系统里,本来想直接做成表格的形式,后来考虑到数据库中的表结构不好设计,最后决定做成日历的形式;

先上成品图

需要引用的js,fullcalendar官网可以下载

<script src="~/Content/Scripts/jquery.fullcalendar/lib/moment.min.js"></script>
<link href="~/Content/Scripts/jquery.fullcalendar/fullcalendar.css" rel="stylesheet" />
<script src="~/Content/Scripts/jquery.fullcalendar/fullcalendar.js"></script>

先贴上页面的代码

<script>
function calender() {
var eventData = new Array();
var id = new Array();
var start = new Array();
var content = new Array();
//ajax 获取ecevnt数据
var durl = encodeURI('@Url.Action("GetEventData", "Plan")');
$.ajax({
type: "post",
url: durl,
async: false,
success: function (msg) {
var temp = msg.split("|");
id = temp[0].split(",");
start = temp[1].split(",");
content = temp[2].split(",");
for (var i = 0; i < id.length; i++) {
var TempObject = {};
TempObject["id"] = id[i];
TempObject["title"] = content[i];
TempObject["start"] = start[i]; eventData.push(TempObject);
alert(eventData[i].title);
//DataForMyChart2[i] = TempObject;
//TempObject = null;
//alert(DataForMyChart2[i].name);
//i++;
}
},
error: function () {
alert("出错了");
}
}); $('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,basicWeek,basicDay'
}, //defaultDate: '2017-05-12',
navLinks: true, // can click day/week names to navigate views
editable: true,
eventLimit: true, // allow "more" link when too many events
monthNames: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
monthNamesShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
dayNames: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
dayNamesShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
today: ["今天"],
buttonText: {
today: '今天',
month: '月',
week: '周',
day: '日',
prev: '上一月',
next: '下一月'
},
events: eventData,
dayClick: function (date, allDay, jsEvent, view) {
//alert(date);
//新加event var obj = new Array();
var reValue = window.showModalDialog('InsertPlan', obj, 'dialogWidth=400px;dialogHeight=200px;');
if (reValue == undefined) {
return false;
}
//alert(moment(date).format('YYYY-MM-DD'));
//alert($.fullCalendar.formatDate(date, "yyyy-MM-dd"));
//event.start.format('YYYY-MM-DD')
var durl = encodeURI('@Url.Action("InsertEventData", "Plan")?PlanContent=' + reValue + '&PlanDate=' + moment(date).format('YYYY-MM-DD'));
$.ajax({
type: "post",
url: durl,
async: false,
success: function (msg) {
if (msg > 0) {
//var tempcon = document.getElementById("tempcon").value;
//top.frames[tabiframeId()].windowload();
//alert("成功添加" + msg + "条记录");
//calender();
top.frames[tabiframeId()].Replace()
//closeDialog();
//SettagValue();
//alert("成功");
}
else {
alert("出错了!");
}
},
error: function () {
alert("出错了");
}
});
},
eventClick: function (event, jsEvent, view) {
alert(event.title);
var durl = encodeURI('@Url.Action("DeleteEventData", "Plan")?id='+event.id);
$.ajax({
type: "post",
url: durl,
async: false,
success: function (msg) {
if (msg > 0) {
alert("成功");
}
else {
alert("出错了!");
}
},
error: function () {
alert("出错了");
}
});
}
});
} $(document).ready(function() { calender(); }); </script>
<style> body {
margin: 40px 10px;
padding: 0;
font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif;
font-size: 14px;
} #calendar {
max-width: 900px;
margin: 0 auto;
} </style>
<body> <div id='calendar'></div> </body>

支持的数据格式

[
{
"title": "All Day Event",
"start": "2017-05-01"
},
{
"title": "Long Event",
"start": "2017-05-07",
"end": "2017-05-10"
},
{
"id": "999",
"title": "Repeating Event",
"start": "2017-05-09T16:00:00-05:00"
},
{
"id": "999",
"title": "Repeating Event",
"start": "2017-05-16T16:00:00-05:00"
},
{
"title": "Conference",
"start": "2017-05-11",
"end": "2017-05-13"
},
{
"title": "Meeting",
"start": "2017-05-12T10:30:00-05:00",
"end": "2017-05-12T12:30:00-05:00"
},
{
"title": "Lunch",
"start": "2017-05-12T12:00:00-05:00"
},
{
"title": "Meeting",
"start": "2017-05-12T14:30:00-05:00"
},
{
"title": "Happy Hour",
"start": "2017-05-12T17:30:00-05:00"
},
{
"title": "Dinner",
"start": "2017-05-12T20:00:00"
},
{
"title": "Birthday Party",
"start": "2017-05-13T07:00:00-05:00"
},
{
"title": "Click for Google",
"url": "http://google.com/",
"start": "2017-05-28"
}
]

后台c#获取string数据的方法

/// <summary>
/// 提供calendar数据
/// </summary>
/// <returns>id1,id2|date1,date2|conten1,conten2</returns>
public string GetEventData()
{
string sql = "select PlanID,Plandate,PlanContent from fy_plan where userid='" + ManageProvider.Provider.Current().UserId+"'";
DataTable dt = PlanBll.GetDataTable(sql);
string result = "";
string temp1 = "";
string temp2 = "";
string temp3 = "";
if (dt.Rows.Count > )
{
for (int i = ; i < dt.Rows.Count; i++)
{
temp1 = temp1 + dt.Rows[i][] + ",";
temp2 = temp2 + dt.Rows[i][] + ",";
temp3 = temp3 + dt.Rows[i][] + ",";
}
temp1 = temp1.Substring(, temp1.Length - );
temp2 = temp2.Substring(, temp2.Length - );
temp3 = temp3.Substring(, temp3.Length - );
}
result = temp1 + "|" + temp2 + "|" + temp3;
return result;
}

最后,总结几点使用中遇到的难点

1、fullcalendar插件中dayClick方法的date参数转换成正确的格式:moment(date).format('YYYY-MM-DD')

2、在拼接前台的字符串的时候要小心,大部分报错基本都是格式错误,我自己也检查了很多次才发现问题

---------------------------------------------------------------------分割线20170818,记录下fullcalendar  ajax获取数据实时更新的方法

1、实现需求,点击上一月下一月时重新获取数据,页面不刷新

实现步骤:1.1在fullcalendar.js 中的上一月下一月点击事件中添加自己的获取数据方法:

prev: function () {
//alert(11);
var prevInfo = this.view.buildPrevDateProfile(this.currentDate); if (prevInfo.isValid) {
this.currentDate = prevInfo.date; this.renderView();
ChangMonth(prevInfo.date.toString()); //此处是新添加的获取数据方法,传递了日期参数 } }, next: function () {
//alert(11);
var nextInfo = this.view.buildNextDateProfile(this.currentDate); if (nextInfo.isValid) {
this.currentDate = nextInfo.date; this.renderView();
ChangMonth(nextInfo.date.toString()); }

2.2  ChangMonth()实现方法

function ChangMonth(date)
{
//alert(11);
var eventData = new Array();
var id = new Array();
var start = new Array();
var content = new Array();
var color = new Array();
//ajax 获取ecevnt数据
var durl = encodeURI('@Url.Action("GetEventData", "Plan")?Date=' + date);
$.ajax({
type: "post",
url: durl,
async: false,
success: function (msg) {
if (msg == "|||") {
//没有数据的时候不做处理,不然分割的时候js会报错
}
else {
var temp = msg.split("|");
id = temp[0].split(",");
start = temp[1].split(",");
content = temp[2].split(",");
color = temp[3].split(",");
for (var i = 0; i < id.length; i++) {
var TempObject = {};
TempObject["id"] = id[i];
if (color[i] == "#36648B") {
TempObject["title"] = 1+" "+content[i];
}
else if (color[i] =="#388E8E")
{
TempObject["title"] = 2 + " " + content[i]; }
else if (color[i] == "#8B2252")
{
TempObject["title"] = 3 + " " + content[i];
}
else if (color[i] == "grey")
{
TempObject["title"] = 4 + " " + content[i];
}
else
{
TempObject["title"] = content[i];
}
TempObject["start"] = start[i];
TempObject["allDay"] = true;
TempObject["backgroundColor"] = color[i];
eventData.push(TempObject);
//alert(eventData[i].title);
//DataForMyChart2[i] = TempObject;
//TempObject = null;
//alert(DataForMyChart2[i].name);
//i++;
}
}
},
error: function () {
alert("出错了");
}
});
//fullcalendart
$('#calendar').fullCalendar('removeEvents');
$('#calendar').fullCalendar('renderEvents', eventData, true);
loadData();
}

注意最后两句,这两句是重新绘制数据,第一句移除原来的数据,第二句重新添加新获取的数据

$('#calendar').fullCalendar('removeEvents');

$('#calendar').fullCalendar('renderEvents', eventData, true);

Jquery 记一次使用fullcalendar的使用记录的更多相关文章

  1. jquery文件上传控件 Uploadify 问题记录

    Uploadify v3.2.1 首先引用下面的文件 <!--上传控件 uploadify--> <script type="text/javascript" s ...

  2. jquery实现对象数组 筛选出每条记录中的特定属性字段 及根据某个属性值筛选出指定的元素

    jquery实现对象数组 筛选出每条记录中的特定属性字段 直接上图: 源码: /** * 对后端返回的数据,筛选出符合报表的列项,多余的列项去除 */ function filterParams(da ...

  3. JQuery 记第N次被坑 - ajax请求字符集问题

    前言:两个功能差不多的页面,都是使用$.post()请求后台,页面A传递到后台的中文参数正常,页面B传递到后台的中文参数则为乱码 分析过程: ①使用chrome的开发者工具,分析两个页面的ajax请求 ...

  4. Jquery库自带的动画效果方法记录

    1.显示和隐藏hide()和show() <script type="text/javascript">             $(function() {      ...

  5. Jquery调用webService的四种方法 转载-记录

    我总结几个关键点 1. 服务必须声明为ScriptService(否则会出现下面的问题) 2.服务的方法不需要任何更改,保持原状 3.客户端用jquery的.ajax方法来调用 3.1 type必须是 ...

  6. jquery图片延迟加载 及 serializeArray、serialize用法记录

    1.使用jquery实现 图片延迟加载 由于用户访问页面需要加载很多的图片,延迟加载技术在电子商务网站领域越来越普及,淘宝商城,京东商城,凡客等访问量巨大的电子商务站点为了增加用户用户体验,访问速度以 ...

  7. 记一次创建LVM的日志记录

    先上一张鸟哥LVM的图.感觉这张最清楚了. #以下以Xshell的日志记录系统直接记录.上面添加了一些个人理解的注释 [BEGIN] 2016/9/13 9:22:24 #先查看下硬盘的情况. [ro ...

  8. 记一次socket_create()函数耗时异常记录

    背景: 下午开发时突然整个页面耗时增加,空接口每次都需要2-3秒的耗时,一开始以为连开发环境数据库出现问题,最后断开数据库跑,发现还是很慢 最终逐步调试此页面耗时,定位到了socket_create( ...

  9. 记jQuery.fn.show的一次踩坑和问题排查

    最近很少已经很少用jQuery,因为主攻移动端,常用Zepto,其实很多细节和jQuery并不一样.最近又无意中接触到了PC的需求和IE6, 使用了jQuery,刚好踩坑了,特意记录一下. 本文内容如 ...

随机推荐

  1. django-模板,过滤器

    for…in…:跟python中的for…in…是一样的用法 {% for m in modules %} {{ forloop.cpunter }} {{ m }} {% end %} forloo ...

  2. java.lang.VerifyError: Inconsistent stackmap frames at branch target 81

    java项目中有如下代码: @RequestMapping(value = "/getMxList") @ResponseBody public Map<String, Ob ...

  3. Radial Blur

    [Radial Blur] 核心代码如下: v2f vert (appdata_img v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.u ...

  4. 如何阅读一个Web项目 【转载】

    摘自网络博客. ============================================================================================ ...

  5. 2015年传智播客JavaEE 第168期就业班视频教程16-框架结构测试(加载全spring配置文件)+struts2属性驱动测试

    模块的规范化我们已经做完了,下面我们要做我们的功能了. 如果是模型驱动就是name="对应model的name" 如果用属性驱动的话,必须得把表现层(Action类)里面映射的用于 ...

  6. 因式分解 · Factor Combinations

    [抄题]: 给出 n = 8 返回 [[2,2,2],[2,4]] // 8 = 2 x 2 x 2 = 2 x 4 [暴力解法]: 时间分析: 空间分析: [思维问题]: [一句话思路]: 类似于全 ...

  7. windows 7 64 bit 注册dll

    手动需要run as admin, 也可以用下边的脚本自动注册 @echo off setlocal enableextensions set REGSVR= if defined PROCESSOR ...

  8. CRC32加密算法原理

    [转]:https://blog.csdn.net/android_mnbvcxz/article/details/78902737

  9. Java 设计模式系列(二)简单工厂模式和工厂方法模式

    Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...

  10. etl业务验证方法1

    /* Copyright (c) 2015 Xiamen Weixin Software Co., Ltd. All rights reserved *  * Create by huanglc@ho ...