从URL检索日历数据通常涉及获取ICS/iCalendar格式的文件或其他日历API返回的数据。要在这样的日历上突出显示特定日期,需要以下几个步骤:
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: {
url: 'your-calendar-url.ics', // 替换为你的日历URL
format: 'ics'
},
eventDidMount: function(info) {
// 检查是否是特定日期
var eventDate = info.event.start;
var targetDate = new Date('2023-12-25'); // 要突出显示的日期
if (eventDate.getDate() === targetDate.getDate() &&
eventDate.getMonth() === targetDate.getMonth() &&
eventDate.getFullYear() === targetDate.getFullYear()) {
// 应用突出显示样式
info.el.style.backgroundColor = '#ffcc00';
info.el.style.borderColor = '#ff9900';
}
}
});
calendar.render();
});
async function fetchAndHighlightCalendar() {
try {
// 从URL获取日历数据
const response = await fetch('your-calendar-url.ics');
const calendarData = await response.text();
// 解析ICS数据(这里简化处理,实际需要完整解析)
const events = parseICalendar(calendarData); // 需要实现parseICalendar函数
// 创建日历DOM
const calendarContainer = document.getElementById('calendar');
const monthView = createMonthView(new Date()); // 需要实现createMonthView函数
// 突出显示特定日期
const highlightDate = new Date('2023-12-25');
events.forEach(event => {
if (isSameDay(event.start, highlightDate)) {
const dayElement = document.querySelector(`[data-date="${formatDate(highlightDate)}"]`);
if (dayElement) {
dayElement.classList.add('highlighted-day');
dayElement.innerHTML = `<div class="event-marker"></div>${dayElement.innerHTML}`;
}
}
});
calendarContainer.appendChild(monthView);
} catch (error) {
console.error('Error loading calendar:', error);
}
}
// 辅助函数示例
function isSameDay(date1, date2) {
return date1.getFullYear() === date2.getFullYear() &&
date1.getMonth() === date2.getMonth() &&
date1.getDate() === date2.getDate();
}
function formatDate(date) {
return `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
}
// 调用函数
fetchAndHighlightCalendar();
.highlighted-day {
background-color: #fff3cd;
border: 2px solid #ffc107;
border-radius: 4px;
}
.event-marker {
width: 8px;
height: 8px;
background-color: #ff6b6b;
border-radius: 50%;
display: inline-block;
margin-right: 4px;
}
原因:服务器和客户端时区不一致导致日期判断错误 解决:在比较日期时统一转换为UTC或本地时区
function isSameDay(date1, date2) {
const utcDate1 = new Date(Date.UTC(date1.getFullYear(), date1.getMonth(), date1.getDate()));
const utcDate2 = new Date(Date.UTC(date2.getFullYear(), date2.getMonth(), date2.getDate()));
return utcDate1.getTime() === utcDate2.getTime();
}
原因:每次渲染都进行日期比较 解决:预先创建需要突出显示的日期集合
const highlightDates = {
'2023-12-25': true,
'2024-01-01': true
// 其他日期...
};
// 然后在渲染时检查
if (highlightDates[formatDate(event.start)]) {
// 应用样式
}
原因:日历已有样式覆盖了自定义样式 解决:使用更具体的CSS选择器或!important
#calendar .fc-daygrid-day.highlighted-day {
background-color: #fff3cd !important;
}
通过以上方法,你可以有效地从URL检索日历数据并在其中突出显示特定日期。
没有搜到相关的文章