laydate通过ready/change回调结合lay-ymd属性标记待红点日期:先用AJAX获取ISO格式日期数组,转为YYYYMMDD后,在回调中遍历匹配td并添加laydate-day-hint类实现红点。
laydate 怎么加载后端返回的待标记日期数组
laydate 本身不提供「红点标记」能力,但支持通过 ready 和 change 钩子 + 自定义 css 渲染节点。核心是:先用 ajax 拿到带红点的日期列表(如 ["2024-05-10", "2024-05-15"]),再在日历渲染完成后,遍历所有日期单元格,比对并添加红点 dom 元素。
注意:必须等 laydate 实例完全渲染完才操作 DOM,否则找不到目标节点。推荐在 ready 回调中执行标记逻辑,而非 change(后者每次切月都会触发,易重复插入)。
- 后端接口建议返回 ISO 格式字符串数组(
["2024-05-10"]),避免时区/格式歧义 - 前端需缓存该数组(如挂到实例对象上),供后续切月时复用,避免反复请求
- 日期比对前统一转为
YYYY-MM-DD格式(用laydate.now(0, 'YYYY-MM-DD')或new Date().toISOString().slice(0,10))
如何给指定日期单元格插入红点 DOM
laydate 渲染的日历表格中,每个日期 td 元素带有 lay-ymd 属性,值为 YYYYMMDD(如 20240510)。这是最可靠的选择器依据,比文本匹配或位置索引更稳定。
红点一般用绝对定位小圆点实现,CSS 可复用:
.laydate-day-hint {
position: relative;
}
.laydate-day-hint::after {
content: '';
position: absolute;
width: 6px;
height: 6px;
background: #ff5722;
border-radius: 50%;
top: 4px;
right: 4px;
}
JS 插入逻辑示例:
const markedDates = ["2024-05-10", "2024-05-15"];
const ymdList = markedDates.map(d => d.replace(/-/g, ''));
// 在 ready 回调里执行
ready: function(elem, date, endDate) {
ymdList.forEach(ymd => {
const td = elem.next('.layui-laydate-main').find(`[lay-ymd="${ymd}"]`);
if (td.length && !td.hasClass('laydate-day-hint')) {
td.addClass('laydate-day-hint');
}
});
}
切换年月时红点消失?怎么保持标记同步
laydate 切换年月会销毁并重建整个日历 DOM,所以之前加的 class 或 ::after 会丢失。不能只靠 ready 一次执行 —— 必须每次渲染都重打标记。
- 把标记逻辑封装成独立函数(如
markDays(elem, markedDates)) - 在
ready和change两个回调里都调用它(change参数含当前年月,可用来过滤仅渲染当月数据,提升性能) - 如果后端支持按年月分页查询,可在
change里动态拉取当月标记数据,避免一次性加载过大数组
注意:change 触发时,DOM 已更新,但尚未完成动画,建议加 setTimeout(..., 0) 确保节点就绪。
为什么用 lay-ymd 而不用日期文本匹配
直接读 td 文本内容(如 $(td).text() === "10")极易出错:同一天在不同月份可能重复出现;中文版可能带「今日」标红;移动端适配时文本可能被截断或换行。
lay-ymd 是 laydate 内部生成的唯一、无歧义标识,且稳定存在于所有版本(v2.8+ 均支持)。只要不手动删改该属性,就是最安全的锚点。
额外提醒:若后端返回的是时间戳或毫秒数,务必在前端统一转成 YYYYMMDD 字符串再比对,别用 new Date().getDate() 去提取日份——跨月时会漏掉 1 号以外的日期。


















