在Leaflet弹窗标记中引入Twig页面出现语法错误求助
问题原因与解决方法
错误根源
控制台的Uncaught SyntaxError是由两个核心问题导致的:
- JavaScript字符串转义失败:将Twig模板内容直接嵌入JS字符串时,模板渲染后的换行、特殊字符未被转义,导致JS解析字符串时出现语法断裂,进而中断整个地图初始化代码,最终地图无法渲染。
- 子模板HTML语法错误:引入的
_popover_carto_dreqs.html.twig存在未闭合的<b>标签,且内容无合理分隔,既影响HTML渲染,也加剧了JS字符串的解析问题。
修复步骤
1. 修复JavaScript字符串转义
修改主模板中setContent的代码,使用Twig的escape('js')过滤器,确保渲染后的HTML内容被转义为合法的JavaScript字符串:
// 替换原setContent行 .setContent("{{ include('dreq/maps/_popover_carto_dreqs.html.twig', {'dreq': element})|escape('js') }}");
或者使用过滤器包裹语法,效果一致:
.setContent("{% filter escape('js') %} {% include 'dreq/maps/_popover_carto_dreqs.html.twig' with {'dreq': element} %} {% endfilter %}");
2. 修复子模板HTML语法
修正_popover_carto_dreqs.html.twig的语法错误,补全闭合标签并优化内容结构:
{{ operator(dreq.operator) }} channel: <b>{{ dreq.channelId }}</b> - file: <b>{{ dreq.fileName }}</b> - id: <b>{{ dreq.dreq_identifier }}</b><br> - protocol: <b>{{ getProtocolsLabel(dreq.dreq_protocol) }}</b> - direction: <b>{{ dreq.direction }}</b><br> file name: <b>{{ dreq.dreq_fileName }}</b> - file size: <b>{{ dreq.dreq_fileSize | formatSize }}</b><br> status: <b>{{ dreq.dreqStatus }}</b> - packet: <b>{{ dreq.dreqPacketTechnoLabels }}</b>
主要修改点:
- 补全最后一个
<b>标签的闭合</b> - 添加
<br>标签实现内容换行,避免JS字符串因换行断裂 - 调整内容间距,提升可读性
3. 逻辑说明
单个Twig元素能正常运行的原因是:单个变量渲染后为单行无特殊字符的字符串,JS可直接解析;而多行模板内容包含换行、潜在引号等,未转义时会破坏JS字符串结构,导致语法错误,中断地图初始化流程。
内容的提问来源于stack exchange,提问作者zackzulg
相关产品推荐
相关产品推荐

