笔记很乱,有空再整理一下。。。
新建事件触发 dhtmlxscheduler.js下
dhtmlxEventable=function(obj){
...
obj.eventCatcher-->obj.callEvent
...
}展开repeat event:即循环事件(6个参数,大致7种情况),函数大部分在dhtmlxscheduler_recurring.js文件中
循环事件函数: get_repeat_code(dates) 返回类型和相对应的图:
day_1_ _ _#no
------------------------------------------
week_1___1,2,3,4,5#20
-------------------------------------------
week_2___3,6#
------------------------------------------
month_2___#no
上图中每隔两个月的3号,3体现在event_length=的值
------------------------------------------
month_1_0_2_#10
上图为每个月的第2个星期天,星期天为0
------------------------------------------
month_2_6_1_#no
上图为每年的三月2号
------------------------------------------
year_1_3_2_#no
上图为每年一月第二个星期三
------------------------------------------
先贴张图:初始化重复事件的方法属性
function get_repeat_code(dates) {
var code = [get_value(els, "repeat")];
get_rcode[code[0]](code, dates);
while (code.length < 5) code.push(""); //code长度小于5则赋值空字符串 例如:code=["day",1,"","",""]
var repeat = "";
var end = get_end_rule(els);//获取结束规则参数,即井号后的值(“no”,"end_of_date"结束日期,"occurences_count"循环次数)
if (end == "no") {
dates.end = new Date(9999, 1, 1);//无结束时间的循环,设置默认结束时间
repeat = "no";
} else if (end == "date_of_end") {
dates.end = str_date(get_value(els, "date_of_end"));
} else {
scheduler.transpose_type(code.join("_"));//设置days值,定义this.date[f],this,date[gf]方法体
repeat = Math.max(1, get_value(els, "occurences_count"));//从els中得到重复的次数
var transp = 0;
dates.end = scheduler.date.add(new Date(dates.start), repeat + transp, code.join("_"));
}
return code.join("_") + "#" + repeat;
---循环事件生成结束时间end_date函数:
scheduler.date.add(new Date(dates.start),repeat+transp,code.join("_"));
---dhtmlx日程控件显示每个方格的事件:
scheduler.repeat_date = function(ev, stack, non_render, from, to, maxCount) {
this.transpose_type(ev.rec_pattern);//解析 循环规则字符串:例如参数1_参数2_参数3_参数4_参数5#参数6
scheduler.transpose_day_week = function(sd, list, cor, size, cor2);//解析第5个参数的函数:}
scheduler._waiAria = {...} // 日程方格一个一个的显示当天事件
得到rec_type 事件的开始时间,结束时间
var code;//例如["month","1","1","1","","no"] month_1_1_1_#no
var ev_start_date=?; var ev_end_date=?;//得到时间输入框的开始时间和结束时间
var dates_start = new Date(ev_start_date);var dates_end;//事件开始和结束时间
var rec_type;var str;var step;var day = 60 * 60 * 24 * 1000;var days = null;var dates_dot_start;
var this_transponse_size={
day:1, week:7, month:1, year:12
};
var repeat_type =""?;// 值为第一个参数 day month week year
//得到重复类型 赋值repeat_type--------如果repeat_type有值则为重复事件,为空则为单个事件
//repeat_type有值,执行get_rcode方法
if(repeat_type!=""){
switch(repeat_type){
case "day":
code.push("day");
if () {//选择每隔几天
code.push(Math.max(1, day_count每个几天));
}else {//选择每个工作日
code.push("week");
code.push(1);
code.push("");
code.push("");
code.push("1,2,3,4,5");//recurring_workdays每个工作日,可固定写成"1,2,3,4,5"
code.splice(0, 1);
}
break;
case "week":
code.push("week");
code.push(Math.max(1, week_count每几周));
code.push("");
code.push("");
var t = [];
var col = [];//得到哪几天 例如星期2 星期5 星期天为0 逗号拼接
var day = dates_start.getDay();
var start_exists = false;
for (var i = 0; i < col.length; i++){
t.push(col[i]);
start_exists = start_exists || col[i] == day;
}
if (!t.length){
t.push(day);
start_exists = true;
}
t.sort();
if (false){//scheduler.config.repeat_precise=true
dates_start = scheduler_date_week_start(dates_start);
dates_dot_start = true;
} else if (!start_exists){
dates_start=scheduler_transpose_day_week(dates_start, t, 1, 7);
dates_dot_start = true;
}
code.push(t.join(","));
break;
case "month":
code.push("month");
if (?) {//选择每隔几个月的几号
code.push(Math.max(1, month_count隔几个月));
dates_start.setDate(month_day几号);
} else {//选择每隔几个月的第几个星期几
code.push(Math.max(1, month_count2每隔几个月));
code.push(month_day2星期几);
code.push(Math.max(1, month_week2第几个));
}
dates_dot_start = true;
break;
// case "year":
// code.push("year");
// if () {//每年几月几号
// code.push("1");
// dates.start.setMonth(0);
// dates.start.setDate(year_day几号);
// dates.start.setMonth(year_month几月);//1月为0
// } else {//每年几月份的第几个星期几
// code.push("1");
// code.push(year_day2星期几);
// code.push(year_week2第几个);
// dates_start.setDate(1);
// dates_start.setMonth(year_month2几月);//1月为0
// }
// dates_dot_start = true;
// break;
}
}
rec_type = get_repeat_code();//赋值循环字符串
function get_repeat_code(dates) {
while (code.length < 5) code.push("");
var repeat = "";
var end = ?;//结束规则 3种值--"no" "date_of_end" "occurences_count"
if (end == "no") {
dates_end = new Date(9999, 1, 1);
repeat = "no";
}
else if (end == "date_of_end") {
dates_end = ?;//结束日期
}
else {
scheduler_transpose_type(code.join("_"));
repeat = Math.max(1, occurences_count具体循环的次数);
var transp = 0;
dates_end = scheduler_date_add(new Date(dates_start), repeat + transp, code.join("_"));
}
return code.join("_") + "#" + repeat;
};
function scheduler_date_add(dates_start_date,inc,mode){
if (str[0] == "day" || str[0] == "week") {
return this_date_gf1(dates_start_date,inc);
}else if (str[0] == "month" || str[0] == "year") {
return this_date_gf2(dates_start_date,inc);
}
};
function this_date_gf1(sd, inc) {
var nd = new Date(sd.valueOf());
if (days) {
for (var count = 0; count < inc; count++)
scheduler_transpose_day_week(nd, days, 0, step);
} else
nd.setDate(nd.getDate() + inc * step);
return nd;
};
function this_date_gf2(sd, inc) {
var nd = new Date(sd.valueOf());
nd.setMonth(nd.getMonth() + inc * step);
if (str[3])
scheduler_date_day_week(nd, str[2], str[3]);
return nd;
};
function scheduler_date_day_week(sd,day,week){
sd.setDate(1);
week = (week - 1) * 7;
var cday = sd.getDay();
var nday = day * 1 + week - cday + 1;
sd.setDate(nday <= week ? (nday + 7) : nday);
};
function scheduler_transpose_type(type){
str = type.split("_");
step = this_transponse_size[str[0]] * str[1];
if (str[0] == "day" || str[0] == "week") {
if (str[4]) {
days = str[4].split(",");
if (scheduler.config.start_on_monday) {//start_on_monday=1
for (var i = 0; i < days.length; i++)
days[i] = (days[i] * 1) || 7;
days.sort();
}
}
}
};
function _get_node_numeric_value(els, name){
var value = scheduler.form_blocks["recurring"]._get_node_value(els, name);
return ((value * 1) || 0);
};
function _get_node_value(els, name, multiselect){
var col = els[name];
if(!col) return "";
if(col.length){
if(multiselect){
var res = [];
for (var i = 0; i < col.length; i++)
if (col[i].checked) res.push(col[i].value);
return res;
}else{
for (var i = 0; i < col.length; i++)
if (col[i].checked) return col[i].value;
}
}
if(col.value)
return !multiselect ? col.value : [col.value];
};
function scheduler_transpose_day_week(sd, list, cor, size, cor2) {
var cday = (sd.getDay() || (scheduler.config.start_on_monday ? 7 : 0)) - cor;//start_on_monday=1
for (var i = 0; i < list.length; i++) {
if (list[i] > cday)
return sd.setDate(sd.getDate() + list[i] * 1 - cday - (size ? cor : cor2));
}
scheduler_transpose_day_week(sd, list, cor + size, null, cor);
};
function scheduler_date_week_start(date){
var shift=date.getDay();
if (scheduler.config.start_on_monday){//start_on_monday=1
if (shift===0) shift=6;
else shift--;
}
return this.date_part(this.add(date,-1*shift,"day"));
}
本文详细解析了DHTMLX Scheduler中的循环事件实现原理及配置方法。介绍了如何通过不同的参数组合来设定各种复杂的循环事件,如按日、周、月、年的循环模式,并解释了这些模式的具体应用场景。
368

被折叠的 条评论
为什么被折叠?



