You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask与JavaScript转义文本展示异常问题求助

问题概述

开发卡片式首页,点击卡片触发弹窗。Flask模板中通过onclick传递从MySQL获取的row.full_text(含希腊文和引号)时,控制台报SyntaxError: Unexpected EOF,尝试过转义、Jinja的safe/escape/tojson等过滤器及JSON.parse均未解决。

解决方案

核心问题是HTML属性中嵌套字符串的转义不彻底,以下是两种可行方案:

方案1:事件委托+数据属性(推荐,更安全)

步骤1:修改Flask模板,添加数据属性

移除原有onclick绑定,给触发元素添加data-full-text属性,用tojson处理文本:

<div class="format-rows">
  {% for row in cartelles|reverse %}
  <div>
    <img class="card-image" src="{{ url_for('static', filename=row.img_url) }}">
    <div class="text-box">
      <p class="card-trigger" data-full-text="{{ row.full_text|tojson }}">{{ row.question }}</p>
    </div>
  </div>
  {% endfor %}
</div>
<div id="grey-blur"></div>
<div id="popup">
  <div>
    <button class="close" onclick="closePopup()"></button>
    <img id="popup-image"
      src="https://images.unsplash.com/photo-1543207564-1271b510019d?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2ODI3NjY4ODM&ixlib=rb-4.0.3&q=85">
  </div>
  <div id="popup-textbox"></div>
</div>

步骤2:用事件委托绑定点击事件

替换原有popupAction函数,通过父容器统一处理点击,安全读取数据属性:

document.addEventListener('DOMContentLoaded', function() {
  document.querySelector('.format-rows').addEventListener('click', function(e) {
    if (e.target.classList.contains('card-trigger')) {
      const fullText = JSON.parse(e.target.dataset.fullText);
      
      const popup = document.getElementById('popup');
      const greyBlur = document.getElementById('grey-blur');
      const popupText = document.getElementById('popup-textbox');

      popup.classList.add('active');
      greyBlur.classList.add('active');
      popupText.innerHTML = fullText;
    }
  });
});

function closePopup() {
  const popup = document.getElementById('popup');
  const greyBlur = document.getElementById('grey-blur');
  
  popup.classList.remove('active');
  greyBlur.classList.remove('active');
}

原理:tojson将字符串转为合法JSON格式,自动处理引号、特殊字符(含希腊文);事件委托避免了每个元素单独绑定事件,dataset读取后用JSON.parse还原文本,彻底规避HTML属性的字符串嵌套冲突。

方案2:修复原有onclick写法(兼容旧代码)

若需保留onclick属性,直接将tojson输出作为JS参数,无需额外引号:

<p onclick='popupAction({{ row.full_text|tojson }})'>{{ row.question }}</p>

tojson会自动为字符串添加双引号并转义内部特殊字符,确保JS解析时无语法错误。

关键注意点
  • 优先使用事件委托+数据属性的方式,避免在HTML属性中直接拼接动态字符串,减少XSS风险和语法错误
  • tojson是Jinja处理JS动态字符串的最优选择,自动兼容Unicode字符和转义规则
  • 不要手动转义引号,容易遗漏嵌套或特殊字符的处理

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:52:56