You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

jQuery Datepicker需求:高亮指定日期/整周及设置周一为首日

日历脚本需求解决方案

嘿,我来帮你搞定这三个日历脚本的问题!咱们逐个击破:

1. 高亮文本框中已填入的所有日期

要实现这个功能,我们需要解析文本框里的日期,然后给日历中对应的日期单元格添加高亮样式。先写一个通用的高亮函数,再绑定到文本框的变化事件和日历初始化完成的时机:

// 高亮文本框中已保存的日期
function highlightSavedDates() {
  // 先移除所有旧的高亮标记
  document.querySelectorAll('.highlighted-date').forEach(el => el.classList.remove('highlighted-date'));
  
  // 解析文本框内容(假设日期用逗号分隔,格式为YYYY-MM-DD)
  const dateInput = document.getElementById('your-date-input');
  const savedDates = dateInput.value.split(',').map(d => d.trim()).filter(d => d.length > 0);
  
  // 给每个匹配的日期单元格加高亮
  savedDates.forEach(dateStr => {
    const dateCell = document.querySelector(`[data-date="${dateStr}"]`);
    if (dateCell) {
      dateCell.classList.add('highlighted-date');
    }
  });
}

// 监听文本框输入变化,实时高亮
document.getElementById('your-date-input').addEventListener('input', highlightSavedDates);
// 日历初始化完成后,立即执行一次高亮
highlightSavedDates();

再添加CSS样式,让高亮更明显:

.highlighted-date {
  background-color: #ffeb3b; /* 亮黄色,可根据需求调整 */
  border-radius: 50%;
  font-weight: bold;
}

2. 选择「上一周」时自动高亮整个日期范围

点击「上一周」按钮时,我们需要先计算出上一周的完整日期范围(周一到周日,因为我们要把周起始改成周一),然后遍历这些日期给对应单元格加范围高亮:

// 绑定「上一周」按钮的点击事件
document.getElementById('prev-week-btn').addEventListener('click', function() {
  // 先移除之前的范围高亮
  document.querySelectorAll('.range-highlight').forEach(el => el.classList.remove('range-highlight'));
  
  // 计算上一周的周一和周日
  const now = new Date();
  // 先找到当前周的周一
  const currentMonday = new Date(now.setDate(now.getDate() - (now.getDay() + 6) % 7));
  // 上一周的周一
  const prevWeekMonday = new Date(currentMonday);
  prevWeekMonday.setDate(prevWeekMonday.getDate() - 7);
  // 上一周的周日
  const prevWeekSunday = new Date(prevWeekMonday);
  prevWeekSunday.setDate(prevWeekSunday.getDate() + 6);
  
  // 遍历上一周的所有日期,添加范围高亮
  let currentDate = new Date(prevWeekMonday);
  const weekDates = []; // 可选:收集日期填入文本框
  while (currentDate <= prevWeekSunday) {
    const dateStr = currentDate.toISOString().split('T')[0];
    weekDates.push(dateStr);
    const dateCell = document.querySelector(`[data-date="${dateStr}"]`);
    if (dateCell) {
      dateCell.classList.add('range-highlight');
    }
    currentDate.setDate(currentDate.getDate() + 1);
  }
  
  // 可选:把上一周的日期填入文本框
  document.getElementById('your-date-input').value = weekDates.join(', ');
  // 触发文本框的高亮逻辑
  highlightSavedDates();
});

对应的范围高亮CSS:

.range-highlight {
  background-color: #e3f2fd; /* 淡蓝色,和单个日期高亮区分开 */
}

3. 修正周起始日为周一的问题(firstDay:1未达预期)

你设置firstDay:1后没达到预期,大概率是因为周范围计算逻辑没有同步调整,还是沿用了周日作为起始的规则。这里分两种情况处理:

如果是使用第三方日历库(比如FullCalendar)

除了设置firstDay:1,还要确保:

  • 周视图的表头顺序调整为「周一、周二...周日」
  • 禁用库默认的周范围计算,改用自定义的周一到周日逻辑

如果是自定义开发的日历

需要调整日历渲染的核心逻辑,确保每周从周一开始生成日期:

// 生成指定起始日期所在周的所有日期(周一到周日)
function generateWeekDates(startDate) {
  const weekDates = [];
  // 先把传入的日期调整为所在周的周一
  const monday = new Date(startDate);
  monday.setDate(startDate.getDate() - (startDate.getDay() + 6) % 7);
  
  // 生成周一到周日的日期数组
  for (let i = 0; i < 7; i++) {
    const date = new Date(monday);
    date.setDate(monday.getDate() + i);
    weekDates.push(date.toISOString().split('T')[0]);
  }
  return weekDates;
}

同时,记得修改日历的表头,把「周一」放在最左侧,这样视觉上完全符合周起始为周一的预期。


内容的提问来源于stack exchange,提问作者Developer

火山引擎 最新活动