contentEditable仅关闭重开浏览器后生效,Flask渲染Pandas表格异常
问题场景
我参考contentEditable演示demo做开发,CSS和JS代码完全沿用原demo写法,仅对HTML做小幅修改,修改后代码如下:
<div id="wrapper"> <section> <h1 class="headline">contentEditable Demonstration</h1> <button id="editBtn" type="button">Edit Document</button> <div id="editDocument"> <h1 id="title">A Nice Heading.</h1> <p>Last Edited by <span id="author">Monty Shokeen</span></p> <div id="content">{{temp_df | safe}}</div> </div>
我将原demo中id为content的p标签替换为div标签,div内的{{temp_df | safe}}是通过Flask框架从Python端传入的Pandas DataFrame调用to_html方法生成的内容。
异常表现
理想状态下页面应渲染出和demo其他元素一致的可编辑表格,但实际运行时表格完全不显示。经测试复现规律如下:
- 运行程序后首次打开浏览器访问页面时表格不显示
- 关闭浏览器后重新打开访问,表格即可正常展示
该问题在多款浏览器中均可复现,可排除单一浏览器兼容性问题。
运行日志参考
全流程终端输出日志如下:
各阶段对应说明:
- 运行Flask程序时的日志
- 点击网站按钮触发表格展示操作时的日志(此时表格未显示)
- 关闭浏览器重新打开访问程序时的日志(此时表格正常显示)
根因分析
该问题由原demo的JS执行逻辑和数据加载时序不匹配导致:
原demo的默认逻辑会在页面初始化阶段就将#editDocument节点的内容缓存到变量中,后续编辑、展示都直接读取该缓存内容。如果temp_df是点击按钮后才异步从后端获取赋值、或者页面初始化渲染时temp_df还未完成赋值,那么JS初始化缓存的内容就是没有表格的空内容,自然不会显示表格。
当你关闭浏览器重新打开时,temp_df已经存储在后端Session/缓存中,页面初始化渲染时就能直接将表格内容嵌入HTML,JS初始化时就能拿到包含表格的完整内容,因此显示正常。
解决方案
可根据业务逻辑选择以下任意一种方案修复:
- 修改JS缓存时机:将原demo中缓存编辑区域内容的逻辑从页面初始化阶段,调整到点击「编辑文档」按钮时实时读取
#editDocument的最新innerHTML,保证每次触发编辑时都能拿到最新的表格内容。 - 数据加载后刷新缓存:如果是点击按钮异步加载表格数据的场景,在表格内容成功插入到
#content节点后,手动调用原demo中缓存编辑内容的逻辑,更新JS侧的缓存值。 - 调整后端数据传递时序:确保Flask渲染对应HTML模板前,
temp_df变量已经完成赋值,保证页面初次渲染时就带有完整的表格内容。
内容的提问来源于stack exchange,提问作者Jonathan Chen
相关产品推荐
相关产品推荐

