我在beforeShowDay遇到问题.
当我的页面加载时,直到我点击日历中的一天,我突然显示的日期才会突出显示.此外,如果我单击下个月按钮并返回原始月份,则“选定”日期将按预期突出显示.
因此,只有在日历的初始绘制时,日期才会突出显示,因为我已经编程了它们.日历中的任何点击都会自行修复.
我错过了一个init选项吗?请参阅下面的代码示例.我的测试网址在受保护的目录中,用户/测试/测试通过.看看右栏底部的迷你卡.切换到下个月,然后回来查看我的问题.请注意5月份突出显示的日期.此外,请注意,在发生点击之前,“年份”下拉列表也会丢失.
http://www.urbanbands.com/dev/cgi-bin/links/eventmgr.cgi?do=list
代码:
<script> $(document).ready(function(){ // get the current date var today = new Date(); var m = today.getMonth(),d = today.getDate(),y = today.getFullYear(); // Need list of event dates for THIS month only from database. // Declare 'dates' var before adding "beforeShowDay" option to the datepicker,// otherwise,highlightDays() does not have the 'dates' array. dates = []; fetchEventDays(y,m+1); $('#datepicker').datepicker({ dateFormat: 'yy-mm-dd',changeMonth: true,changeYear: true,setDate: today,inline: false }); $('#datepicker').datepicker('option','onChangeMonthYear',fetchEventDays); $('#datepicker').datepicker('option','beforeShowDay',highlightDays); $('#datepicker').datepicker('option','onSelect',getday); // ------------------------------------------------------------------ // getday // ------------------------------------------------------------------ function getday(dateText,inst) { $('#content').load('http://www.mydomain/eventmgr.cgi?do=view_day;date='+dateText+' #eventMgr_content',function() { alert('Load was performed. '+dateText); }); } // ------------------------------------------------------------------ // fetchEventDays // ------------------------------------------------------------------ function fetchEventDays(year,month) { var paramStr ='?do=get_event_dates&yr=' + year + '&mo=' + month; $.get('<%config.db_cgi_url%>/eventmgr-ajax.cgi'+ paramStr,function(data) { var recur_dates = data.split(','); for(var i = 0; i < recur_dates.length; i++) { var date_parts = recur_dates[i].split('-'); dates.push(new Date(date_parts[0],date_parts[1]-1,date_parts[2])); } // This causes dates with events to highlight on initial draw,but // when clicking to the next month,it switches back to orig month. // $('#datepicker').datepicker('option',{}); // Refresh }); } // ------------------------------------------------------------------ // highlightDays // ------------------------------------------------------------------ function highlightDays(date) { for (var i = 0; i < dates.length; i++) { if ((dates[i].getTime() == date.getTime())) { return [true,'highlight']; } } return [true,'']; } }); </script>
解决方法
谢谢@kingjiv你是100%正确的.日历在get请求完成之前显示.我尝试使用when方法,但无法异步获取日期.基本上我必须在日历显示之前突出显示日期,所以我不得不使用async:false(不是true).
我已经包含了我的完整代码,演示了如何使用beforeShowDay选项突出显示从数据库中提取的多个事件.使用asyc:false修复了突出显示的日期未在初始绘制中突出显示的问题.还包括用于改变细胞背景颜色的css.
还有一个小问题,“年份”下拉菜单没有显示在初始抽奖中,但我确认这只发生在FireFox 4中.任何点击日历都会导致显示年份菜单. Safari在初始绘图时正确显示年份菜单.
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> <style type="text/css"> /* Dates with events on them. Text color - red,background - pastel yellow. */ td.highlight,table.ui-datepicker-calendar tbody td.highlight a { background: none !important; background-color: #fffac2 !important; color: #FF0000; } /* This is Today's day in rightsidebar mini calendar (datepicker). */ /* Restore style to that of a default day,then just bold it. */ .ui-state-highlight,.ui-widget-content .ui-state-highlight { border: 1px solid #d3d3d3; background: #e6e6e6 url(http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #555555; } /* This is the selected day in the inline datepicker. */ .ui-state-active,.ui-widget-content .ui-state-active { color: #000000; opacity: 1.0; filter:Alpha(Opacity=100); border: 1px solid #000000; } /* Add a little separation between month and year select menus */ .ui-datepicker select.ui-datepicker-month { width: 42%; margin-right: 6px; } </style> <script> $(document).ready(function(){ // get the current date var today = new Date(); var m = today.getMonth(),y = today.getFullYear(); // Get a list of dates that contain events in THIS month only from database. // Declare and populate 'eventDates' array BEFORE adding "beforeShowDay" option to // the datepicker. Otherwise,highlightDays() will have an empty 'eventDates' array. var eventDates = []; fetchEventDays(y,m+1); // Get events for the current year and month. $('#datepicker').datepicker(); $('#datepicker').datepicker('option',getday); $('#datepicker').datepicker('option','dateFormat','yy-mm-dd'); $('#datepicker').datepicker('option','changeYear',true); $('#datepicker').datepicker('option','changeMonth','yearRange','2010:2012'); $('#datepicker').datepicker('option','showButtonPanel',true); // Disable all dates prior to today. // $('#datepicker').datepicker('option','minDate',new Date(y,m,d)); // ------------------------------------------------------------------ // getday - Replaces the #content div of the current page with // the content of the page that is created and displayed via perl // ------------------------------------------------------------------ function getday(dateText,inst) { $('#content').load('<%config.db_cgi_url%>/eventmgr.cgi?do=view_day;date='+dateText+' #eventMgr_content',function() { // alert('load was performed. '+dateText); }); } // ------------------------------------------------------------------ // fetchEventDays - The ajax call below is synchronous (NOT asynchronous). // eventDates array must be populated prior to adding the beforeShowDay option // to the datepicker,otherwise,highlightDays() will have an empty eventDates array. // ------------------------------------------------------------------ function fetchEventDays(year,month,inst) { var url ='<%config.db_cgi_url%>/eventmgr-ajax.cgi?do=get_event_dates&yr=' + year + '&mo=' + month; $.ajax({ url: url,async: false,success: function(result){ var event_dates = result.split(','); for(var i = 0; i < event_dates.length; i++) { var date_parts = event_dates[i].split('-'); eventDates.push(new Date(date_parts[0],date_parts[2])); } } }); } // ------------------------------------------------------------------ // highlightDays - Add a custom css class to dates that exist in the // eventDates array. Must also add the css for td.highlight (above). // ------------------------------------------------------------------ function highlightDays(date) { for (var i = 0; i < eventDates.length; i++) { if ((eventDates[i].getTime() == date.getTime())) { return [true,'']; } }); </script>