[WEB插件]可自定义样式并从XML中读取数据的日历控件
文章来源:365jz.com 点击数:
487 更新时间:2009-10-05 21:44
参与评论
jquery的脚本代码(实现日历的行为){文件名:calendar.js}
//可直接通过 $("") 方式调用
(function($) {
$.wzjCalendar = function(element, config) { this.init(element, config); };
$.extend($.wzjCalendar.prototype, {
settings: {
cssYearMonth: "cal_full_date",
cssPrev: "cfd_p",
cssNext: "cfd_n",
cssShow: "cfd_m",
cssWeek: "cal_date_title",
cssDate: "cal_date",
cssCurMon: "cal_date_b",
cssOtherMon: "cal_date_a",
cssToday: "cal_date_c",
cssDayAct: "cal_date_d",
cssActive: "cal_date_act",
cssDivActive: "cal_active",
xmlSource: "xml/",
strPrev: "<a href='javascript:;' style='margin:auto; display:block;'>prev</a>",
strNext: "<a href='javascript:;' style='margin:auto; display:block;'>next</a>",
strFormat: "%year.%month",
mode: "click", //click、hover、
divActive: "<p><a target='_blank' href='%href' >%text</a></p>"
},
curDate: new Date(),
date: new Date(),
wrapper: null,
dnames: ['日', '一', '二', '三', '四', '五', '六'],
$prev: null,
$show: null,
$next: null,
$date: null,
$active: null,
$optionAct: null,
cache: [],
timer: null,
init: function(element, config) {
$.extend(this.settings, config);
this.extendDate();
this.wrapper = $(element);
this.renderControls();
this.date = new Date(this.curDate);
this.date.setDate(1);
this.updateMonth(0);
this.wire();
},
renderControls: function() {
//上一页 2009年1月 下一页
var $yearMonth = $("<div />");
$yearMonth.addClass(this.settings.cssYearMonth);
var $list = $("<ul/>");
this.$prev = $("<li/>");
this.$prev.addClass(this.settings.cssPrev).html(this.settings.strPrev);
this.$show = $("<li/>");
this.$show.addClass(this.settings.cssShow);
this.$next = $("<li/>");
this.$next.addClass(this.settings.cssNext).html(this.settings.strNext);
$list.append(this.$prev).append(this.$show).append(this.$next);
$yearMonth.append($list);
//一周
var $title = $("<div />");
$title.addClass(this.settings.cssWeek);
this.renderOptions($title, 7, this.dnames);
//日期
this.$date = $("<div />");
this.$date.addClass(this.settings.cssDate);
this.renderOptions(this.$date, 35);
this.$date.append("<div class='clear'></div>");
//活动层
this.$active = $("<div />");
this.$active.addClass(this.settings.cssDivActive);
//容器
this.wrapper.empty();
this.wrapper.append($yearMonth).append($title).append(this.$date).append(this.$active);
},
wire: function() {
var self = this;
this.$prev.children(0).click(function() {
self.updateMonth(-1);
});
this.$next.children(0).click(function() {
self.updateMonth(1);
});
},
updateMonth: function(n) {
this.$optionAct = null;
this.$active.hide();
this.adapter(n);
var xmlFile = this.date.getFullYear() + "_" + parseInt(this.date.getMonth() + 1);
this.preloadCache(xmlFile);
},
activeClick: function() {
var self = this;
$.each(self.cache, function() {
var $option = $("li[id='" + this.id + "']", self.$date);
if ($option) {
$option.addClass(self.settings.cssDayAct);
$option.unbind();
switch (self.settings.mode) {
case 'click': $option.click(function() { self.divActiveShow($(this)); }); break;
case 'hover': $option.hover(function() { self.divActiveShow($(this)); }, function() { self.divActiveHide(); });
self.$active.hover(function() { if (self.timer) clearTimeout(self.timer); }, function() { self.divActiveHide(); }); break;
}
}
});
},
divActiveHide: function() {
var self = this;
if (self.$active.css("display") == "none")
return;
self.timer = setTimeout(function() {
self.$active.hide();
}, 1000);
},
divActiveShow: function($option) {
if (this.timer)
clearTimeout(this.timer);
this.showActive($option);
},
renderOptions: function($wrap, count, array) {
var list = $("<ul/>");
for (j = 0; j < count; j++) {
var $li = $("<li/>")
if (array != null)
$li.html(array[j]);
list.append($li);
}
$wrap.append(list);
},
setMonth: function(date, $cal_date) {
var startDate = new Date(date);
startDate.setDate(startDate.getDate() - startDate.getDay());
for (j = 0; j < 35; j++) {
var addDate = startDate.getDate();
$li = $("li:eq(" + j + ")", $cal_date);
$li.text(addDate).removeClass().attr("id", startDate.getFormatDate());
if (startDate.toDateString() == this.curDate.toDateString())
$li.addClass(this.settings.cssToday);
else if (startDate.getMonth() == date.getMonth())
$li.addClass(this.settings.cssOtherMon);
else
$li.addClass(this.settings.cssCurMon);
startDate.setDate(startDate.getDate() + 1);
}
},
adapter: function(num) {
this.date.setMonth(this.date.getMonth() + num);
this.$show.text(this.date.getDateString(this.settings.strFormat));
this.setMonth(this.date, this.$date);
},
preloadCache: function(xmlname) {
var self = this;
$.ajax({
url: this.settings.xmlSource + xmlname + '.xml?' + new Date().getTime(),
type: 'GET',
dataType: 'xml',
timeout: 1000,
error: function(xml) {
$("li", self.$date).unbind();
//alert('Error loading XML document' + xml);
},
success: function(xml) {
$(xml).find("month").each(function(i) {
var $month = $(this);
self.cache = $month.children("date").map(function() {
var $date = $(this);
var id = $date.attr("id");
var active = $date.children("active").map(
function() {
var $active = $(this);
var name = $active.children("name").text();
var href = $active.children("href").text();
return { name: name, href: href };
});
return { id: id, active: active };
});
self.activeClick();
});
}
});
},
showActive: function($option) {
var offset = $option.offset();
this.$active.css({ display: 'block', position: 'absolute', left: offset.left, top: offset.top + $option.height() });
if (this.$optionAct) { this.$optionAct.toggleClass(this.settings.cssActive); }
$option.addClass(this.settings.cssActive);
this.loadActive($option);
this.$optionAct = $option;
},
loadActive: function($option) {
var self = this;
if (this.cache) {
$.each(this.cache, function() {
if (this.id == $option.attr("id")) {
var detailAct = "";
for (k = 0; k < this.active.length; k++) {
detailAct += self.settings.divActive.replace("%href", this.active[k].href).replace("%text", this.active[k].name);
}
self.$active.html(detailAct);
return;
}
});
}
},
extendDate: function() {
$.extend(Date.prototype, { getDateString: function(str) {
str = str.replace('%year', this.getFullYear());
str = str.replace('%month', this.getMonth() + 1);
return str;
},
getFormatDate: function() {
return this.getFullYear().toString() + parseInt(this.getMonth() + 1).toString() + this.getDate().toString();
}
});
}
});
$.fn.wzjCalendar = function(config) {
this.each(function() {
new $.wzjCalendar(this, config);
});
return this;
};
}
)(jQuery);
Css代码{文件名:calendar.css}
*{}{ margin: 0; padding: 0; }
.cal{}{ font-size: 9pt; list-style: none; overflow: hidden; width: 141px; margin:auto;}
.cal_full_date{}{ height: 25px; font-family:simsun,Verdana,Geneva,Arial,Helvetica,sans-serif}
.cal .cal_full_date li{}{ }
.cal .cal_full_date .cfd_p,.cal .cal_full_date .cfd_n{}{ width:36px; padding:2px 0 0 0;}
.cal .cal_full_date .cfd_m{}{ width:67px; font-weight:bold; color:#54320c;}
.cal .cal_date_title{}{clear: both; color: #54320c; height: 20px; font-weight:bold; background:url(../images/dotted.gif) no-repeat left bottom; }
.cal .cal_date_title li{}{ height: 20px; line-height: 20px; width: 7px; }
.cal .cal_date li,.cal .cal_full_date li,.cal .cal_date_title li{}{ display: inline; float: left; text-align: center; width:14%; }
.cal .cal_date li{}{ height: 19px; line-height: 19px; width: 19px; cursor:pointer; font-size:9px; color:Black;}
.cal .cal_date{}{ clear: both; height: auto !important; height: 1px; min-height: 1px; color:Black; font-size:12px;}
.cal .cal_date li{}{ border-left: 0; font-family: Tahoma; font-size: 9px; margin: 1px 1px 0 0; }
.clear{}{ background: transparent; clear: both; height: 1px; overflow: hidden; width: 100%; }
.cal .cal_date .cal_date_a{}{ color: #54320C; }
.cal .cal_date .cal_date_b{}{ color: Yellow; }
.cal .cal_date .cal_date_c{}{ font-weight:bold; background-color:Black; color: Pink;}
.cal .cal_date .cal_date_d{}{color: red; text-decoration: underline; }
.cal .cal_date .cal_date_act{}{color: green }
.cal .cal_active{}{ display:none; padding: 5px 5px 0 5px; text-align:left; color: green; background:white; border:1px solid Black; color:Black;}
.cal .cal_active p{}{height:20px; min-width:100px; width:150px;}XML代码{文件名:2009_9.xml} 附注:注意脚本中xml的路径(
xmlSource: "xml/")<?xml version="1.0" encoding="utf-8" ?>
<month>
<date id="200991" >
<active>
<name>新浪</name>
<href>http://www.sina.com</href>
</active>
</date>
<date id="2009910">
<active>
<name>我的博客园</name>
<href>http://wzjCode.cnblogs.com</href>
</active>
<active>
<name>Google</name>
<href>http://www.google.com</href>
</active>
</date>
</month>Html代码
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <link type="text/css" rel="Stylesheet" href="calender.css" /></head><body> <form id="form1" runat="server"> <div id="cal1" class="cal"></div> </form> <script type="text/javascript" src="jquery/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="calendar.js"></script> <script type="text/javascript"> $(function() {$(".cal").wzjCalendar({ mode: 'hover' });}) </script></body></html>
该控件的显示效果如下:
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛
------分隔线----------------------------