最简双栏同步可用marked+原生DOM实现:左侧textarea输入,右侧div用marked.parse()渲染;需监听input事件并节流更新,开启breaks换行,右侧设overflow-wrap防溢出;拖拽分隔需JS监听鼠标/触摸事件并重置滚动位置;XSS防护用DOMPurify白名单过滤;IE11兼容需锁定marked@3.0.8并降级API。

用 marked + 原生 DOM 实现最简双栏同步
不需要框架也能跑通核心流程:左侧 实操建议: 纯 CSS 无法响应式拖拽分隔,必须用 JS 监听鼠标事件。核心是计算鼠标在容器内的相对位置,动态设置左侧 常见错误现象: 推荐直接用 实操建议: 把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。 使用场景判断: 双栏同步本身不复杂,真正耗时的是光标定位同步、粘贴内容解析、以及各种输入法下的行为对齐——这些细节没标准解法,只能按实际测试反复补丁。 输入,右侧 marked.parse() 渲染。关键在于监听输入并节流更新,否则滚动或快速打字时渲染卡顿明显。
input 事件(不是 keyup)捕获所有修改,包括粘贴、撤销、IME 输入requestIdleCallback 或简单 setTimeout(..., 16) 节流,避免每键都触发解析marked.setOptions({ breaks: true }) 开启换行转 ,否则段落内回车不生效style="overflow-wrap: break-word;" 防止长链接撑破布局左右栏等宽拖拽调整宽度的实现要点
flex-basis 或 width。
textarea 的 scrollLeft 和 scrollTop
mouseup 时清除 document.onmousemove,导致持续响应touchstart/touchmove/touchend,且未调用 event.preventDefault() 阻止默认滚动resize-observer-polyfill 配合 flex 布局,比手写拖拽更稳。渲染安全:防止 XSS 的最小代价处理
marked 默认不转义 HTML,用户输入 <script>alert(1)</script> 会直接执行。不能简单关掉 HTML 支持(会丢掉合法 等),得做白名单过滤。
DOMPurify.sanitize(marked.parse(input)),比 marked 自带的 sanitize 选项更可靠marked.setOptions({ sanitizer: DOMPurify.sanitize }) 即可DOMPurify 默认不放行 target="_blank",需显式配置 ADD_ATTR: ['target']
IE11 兼容性踩坑与降级策略
marked@4+ 已放弃 IE 支持,marked@3.0.8 是最后一个能跑通的版本。但即使如此,textarea 的 selectionStart/selectionEnd 在 IE 中对中文输入法支持极差。
marked@3.0.8,禁用 gfm(表格、任务列表)等新特性document.selection + TextRange 替代现代 selection API,仅用于光标定位修复innerHTML 而非 textContent,否则 IE 下样式丢失严重!window.Proxy 直接提示“请升级浏览器”,省去大量边界逻辑
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










