FullCalendar JavaScript日程调度器单引号渲染异常问题
我太懂这个糟心的问题了——手动拼接JS对象的时候,特殊字符(比如单引号)总能搞崩渲染,哪怕手动加转义也不管用,本质是模板渲染和JS字符串解析的双重规则冲突在搞鬼。咱们一步步来解决:
问题根源
你现在的写法是直接把模板变量塞进JS字符串里,比如title: "{{=row.evento.titolo}}"。如果标题里有单引号(比如"O'Neil's Workshop"),模板渲染后会变成title: "O'Neil's Workshop"——看起来JS语法没问题?但如果你的模板引擎自动转义了单引号(比如把'变成\'),或者标题里同时出现双引号,就会直接破坏字符串结构,导致FullCalendar解析失败。
最稳妥的解决方案:用JSON序列化代替手动拼接
与其手动处理每个字段的转义,不如让JSON来帮你搞定所有特殊字符。这种方法一劳永逸,不管标题里有单引号、双引号还是换行符,都能正确渲染。
步骤1:后端(控制器)生成JSON格式的事件列表
假设你用的是web2py(从模板语法看很匹配),在控制器里把事件数据整理成列表,再序列化为JSON:
import json # 整理事件数据 events_list = [] for row in rowseventi: event_data = { "title": row.evento.titolo, "id": row.evento.id, "resourceId": row.evento.risorsa, "start": row.evento.inizio, "end": row.evento.fine, "recurring": row.evento.ricorrenza, "color": row.evento.colore, "url": URL('mostra_evento', args=row.evento.id) } events_list.append(event_data) # 把JSON字符串传给视图 response.view_data['events_json'] = json.dumps(events_list)
步骤2:视图里直接使用JSON数据
在FullCalendar的初始化代码里,直接把JSON赋值给events选项:
$('#calendar').fullCalendar({ // 其他配置... events: {{=XML(events_json)}} });
XML()函数会确保JSON字符串被正确输出为JS能识别的对象数组,所有特殊字符都会被自动转义。
紧急临时方案:仅修改视图字段转义
如果不想改动后端代码,也可以在视图里对title字段做JS安全转义。用模板引擎的转义函数处理title:
{{for row in rowseventi:}} { title: "{{=XML(row.evento.titolo, quote=True)}}", id: '{{=row.evento.id}}', resourceId: '{{=row.evento.risorsa}}', start: '{{=row.evento.inizio}}', end: '{{=row.evento.fine}}', recurring: '{{=row.evento.ricorrenza}}', color : '{{=row.evento.colore}}', url: '{{=URL('mostra_evento',args=row.evento.id)}}', }, {{pass}}
这里quote=True会自动把字符串里的双引号转义为\",同时处理其他可能破坏JS字符串的特殊字符,确保title能被正确解析。
验证方法
修改后打开浏览器的开发者工具,查看页面源代码,找到生成的事件对象:
- 正常情况下,包含单引号的标题应该显示为
title: "O\'Neil's Workshop"(如果用双引号包裹)或者title: 'O\'Neil\'s Workshop'(如果用单引号包裹),这样FullCalendar就能正确渲染了。
内容的提问来源于stack exchange,提问作者Andrea Fae'

