使用Zabuto Calendar结合Ajax数据高亮日期时遇jQuery语法错误问题
解决Zabuto Calendar结合Ajax高亮日期时的jQuery语法错误问题
我之前也碰到过一模一样的问题,这个“Syntax error, unrecognized expression”基本上都是选择器格式不对或者Ajax返回的数据不符合要求导致的,结合你用的jQuery 3.2.1和Zabuto Calendar,咱们一步步来排查解决:
一、先检查Ajax返回的JSON格式是否标准
Zabuto Calendar对高亮日期的数据格式有明确要求,而且jQuery 3.x对JSON的解析要求更严格,这是最容易踩坑的点:
- 首先打开浏览器控制台(F12),在Network标签里找到你的Ajax请求,查看Response内容,确保返回的是标准的JSON数组,比如:
注意必须用双引号,不能用单引号,数组里的每个对象要包含[ {"date": "2024-05-20", "classname": "highlight"}, {"date": "2024-05-25", "classname": "highlight"} ]date(格式yyyy-mm-dd)和classname(自定义高亮类)字段。 - 如果后端返回的是字符串而不是JSON,一定要在Ajax请求里加上
dataType: 'json',或者手动用JSON.parse()解析,最好用try-catch包裹避免解析失败:success: function(response) { let highlightDates; try { highlightDates = JSON.parse(response); } catch(err) { console.error('JSON解析失败:', err); return; } // 后续处理逻辑 }
二、确保日期选择器的语法绝对正确
如果你是手动操作DOM来高亮日期(而不是用Zabuto自带的data参数),那一定要注意Zabuto的日期单元格结构:每个日期单元格都带有data-date属性,值是yyyy-mm-dd格式,所以正确的选择器写法应该是:
// 假设date是从Ajax返回的"2024-05-20" const selector = '.zabuto-calendar [data-date="' + date.trim() + '"]'; const $dateCell = $(selector);
- 千万不能漏掉属性选择器里的双引号,不然如果日期里的
-符号会破坏选择器结构,直接触发语法错误。 - 最好给日期字符串加个
trim(),避免后端返回的日期带前后空格,导致选择器匹配不到元素还报错。
三、推荐用Zabuto自带的方式加载高亮日期
其实Zabuto本身就支持直接传入日期数据初始化日历,这种方式比手动操作DOM靠谱多了,完全避免选择器错误的问题,示例代码如下:
$(document).ready(function() { $.ajax({ url: '你的接口地址', method: 'GET', dataType: 'json', success: function(highlightDates) { // 把返回的数据转换成Zabuto需要的格式(如果后端已经符合要求可以直接用) const calendarEvents = highlightDates.map(item => ({ date: item.date, classname: 'highlight', // 自定义高亮样式类 badge: true // 可选,给日期加个小徽章 })); // 初始化日历,直接传入高亮数据 $('#calendar').zabuto_calendar({ data: calendarEvents, weekstartson: 0, // 设置周日为一周的开始,可选 action: function() { return handleDateClick(this.id, false); } }); }, error: function(xhr, status, err) { console.error('加载高亮日期失败:', err); } }); }); // 日期点击事件的自定义逻辑 function handleDateClick(id, fromModal) { const clickedDate = $("#" + id).data("date"); alert(`你点击了日期:${clickedDate}`); }
四、最后加个自定义高亮样式
在CSS里写个高亮类,让效果更明显:
.zabuto-calendar .highlight { background-color: #ffd54f; color: #212121; border-radius: 50%; }
调试小技巧
如果还是报错,在控制台打印关键信息排查:
- 打印Ajax返回的数据:
console.log('返回数据:', data),确认结构和格式是否正确。 - 打印构造的选择器:
console.log('选择器:', selector),看看有没有引号不匹配或者多余字符。
内容的提问来源于stack exchange,提问作者theEUG
相关产品推荐
相关产品推荐

