YCOE

You Can't stOp mE!

FullCalendar的二次开发、扩展

Posted on 2010-06-06 10:25 YCOE 阅读(3007) 评论(10) 编辑 收藏

FullCalendar:

官方网址
http://arshaw.com/fullcalendar/

FullCalendar是一个jQuery日历插件,它使用Ajax来获取每一个月的日历事件并能够配置成使用自己的日历事件来源比如从Google Calendar获取事件。支持拖放日历中的事件,自定义点击和拖放事件。默认的截图如下:

 

官方的版本,其实还有很多需要扩展的,比如添加事件、鼠标效果、事件样式等。项目需要,对它作了一次扩展,应该是很常用的功能吧,因此把它写下来,为有需要的人准备。

 1. 鼠标事件。移上去后当日背景色改变。这个功能我查了官方的文档,发现它们只是对事件有响应,并没有对当前日期的响应,对事件响应的名称是:eventMouseover和enentMouseout 可以做到当鼠标放到事件上时,可以改变事件的背景、文本等效果。添加这个效果很容易,直接使用jQuery的hover方法就可以了:

$(".fc-state-default").hover(
    
function(){
        $(
this).addClass("calendar_hover");
    },
    
function(){
        $(
this).removeClass("calendar_hover");
    }
);


添加一个样式:.calendar_hover{background:red;}

 2. 鼠标移上去出现添加事件的符号。这里需要改动它的核心JS了(没办法啦,要不使用jQuery插进去,不过既然改了,就不要在乎这些啦,唉...)

打开fullcalendar.js

找到第1094行,即是renderGrid方法里的一个生成td标签的循环,在生成日期数的前面添加一段:

<span date='"+d.format("yyyy-MM-dd")+"' class='add_opt'></span>

这里的d.format(....)方法是对JS中date类的扩展方法:

/*
 * 时间对象的格式化; 
 
*/  
Date.prototype.format 
= function(format) { 
     
/* 
      * eg:format="YYYY-MM-dd hh:mm:ss"; 
      
*/  
     
var o = {  
         
"M+" :this.getMonth() + 1// month  
         "d+" :this.getDate(), // day  
         "h+" :this.getHours(), // hour  
         "m+" :this.getMinutes(), // minute  
         "s+" :this.getSeconds(), // second  
         "q+" :Math.floor((this.getMonth() + 3/ 3), // quarter  
         "S" :this.getMilliseconds()  
     
// millisecond  
     }  
   
     
if (/(y+)/.test(format)) {  
         format 
= format.replace(RegExp.$1, (this.getFullYear() + "")  
                 .substr(
4 - RegExp.$1.length));  
     }  
   
     
for ( var k in o) {  
         
if (new RegExp("(" + k + ")").test(format)) {  
             format 
= format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k]  
                     : (
"00" + o[k]).substr(("" + o[k]).length));  
         }  
     } 
     
return format;  
 }  

因为点击添加按钮以后,需要获取当天的日期,所以我将日期写到div的属性里面,方便获取。

当然,如果点击上一月下一月的按钮的时候,这个数会改变,所以再找到1160行的:td.find('div.fc-day-number').text(d.getDate());

在后面添加一个改变日期的脚本: td.find("span.add_opt").attr("date",d.format("yyyy-MM-dd"));

这样,即使改变了日期,也可以跟着改变了。接下来的处理就容易了。

按钮的样式,随便自己写了,我是把它设置为隐藏,图片作背景。当鼠标放到日期上时显示,鼠标放上去后改变背景图片。点击显示事件添加框。 

$(".fc-state-default").hover(
    
function(){
        $(
this).find(".add_opt").css('display','inline-block');//显示
        $(this).addClass("calendar_hover");
    },
    
function(){
        $(
this).find(".add_opt").hide();//限期添加按钮
        $(this).removeClass("calendar_hover");
    }
);
//添加按钮点击事件
$(".fc-state-default .add_opt").click(function(){
    
var date = $(this).attr("date");
    
var top = $(this).offset().top;
    
var left = $(this).offset().left;
    $(
"#new_action").css({top:top,left:left});//设置添加框的位置
    $("#new_action").slideDown();
    $(
"#new_action input[name='date']").val(date);//添加框内form的date值设置
});

其它代码自己写了,这样事件添加就完成了

3. 改变事件样式。不知道为什么,在文档里面都没有说明可以配置事件的样式:className

[{
    
'id':1,
    
'title':'Test',
    
'start':'2010-06-06',
    
'end':'2010-06-07',
    
'url':'http://www.youyu.us',
    
'className':'myStyle'//这里可以设置此action的样式
}]

4. 配置中设置样式,这个功能是我找到className时使用的,后来一直没有删掉。

找到_renderDaySegs方法,在此方法完成前添加以下代码:

    if(options.type!=null){
        
for (var key in options.type){
            $("."+key+" a").css(options.type[key]);
        }
    }

这样就可以在配置文件中设置action对应的样式了,配置中添加:

 type:{'myStyle':{'background':'red','font-size':14}}

这功能貌似多余了,呵呵

最终的效果如下图:

 

 

 

标签: JavaScript

Feedback

#1楼  回复 引用 查看   

2010-07-29 11:00 by LG-小亦      
O(∩_∩)O谢谢啦 有问题再来请教

#2楼  回复 引用 查看   

2010-08-10 16:21 by vivlan      
您好,我想问一下 你的那个改变事件样式是如何设置的?

#3楼  回复 引用 查看   

2010-08-10 16:21 by vivlan      
您好,我想问一下 你的那个改变事件样式是如何设置的? 就是你的事件前面有个图标 》 能否详细说明下? 3Q

#4楼  回复 引用 查看   

2010-08-10 16:23 by vivlan      
我的Email liujian.sky@163.com

#5楼[楼主]  回复 引用 查看   

2010-08-10 20:40 by YCOE      
在事件配置的时候,多一个参数就可以了,如:
[{
'id':1,
'title':'Test',
'start':'2010-06-06',
'end':'2010-06-07',
'url':'http://www.youyu.us',
'className':'myStyle'//这里可以设置此action的样式
}]

这里设置好className以后,在生成的html里面就会有这个class在里面,然后你就可以对它作任何事情了。这是一种思路,不用改它的源码就可以实现的,还有另一种思路就是改它的源码,我这里用到的第二种,图个方便,我在事件的DIV里面添加了一个<span class="icon"></span>(大概在源码的724行和1446行两个位置)。

#6楼  回复 引用 查看   

2010-08-23 15:24 by LG-小亦      
能给个 点击显示事件添加框 的dome吗?
254397034@qq.com

#7楼  回复 引用 查看   

2010-08-31 17:04 by LG-小亦      
按你的思路和代码。 就是搞弹不出事件层。。
“其它代码自己写了,这样事件添加就完成了” 还要什么代码呀 自己弄个new_action就是了吧。。
求解!!!

#8楼  回复 引用 查看   

2010-09-25 15:55 by zout      
你好,不知你遇到过这样的问题没有:
这个组件默认的日期总是比实际日期少一天,能说说你是如何解决的吗?非常感谢!

#9楼  回复 引用 查看   

2010-12-29 14:48 by angxuan      
不知楼主用的是什么版本,有些地方没有讲清楚

#10楼  回复 引用 查看   

2011-04-19 13:27 by fengqingsadan      
博主您好,我最近就是在研究这个fullcalendar啊,好多都不懂啊,文档又是全英文的东东。我现在最大的疑问就是fullcalendar和后台数据交互的问题。events是数据源的配置吧,但是我就是不知道怎么把这个配置成从数据库中取数据,还有就是日程内容的内容显示方面,fullcalendar是以(具体时间+上/下午+titile)的格式显示,能不能自定义内容的显示呢......还望博主能多多指点。。。。。。