当前位置: 首页 > news >正文

contenteditable 深度交互教程

contenteditable 交互式教程 - 百灵AI

🧠 contenteditable 深度交互教程

每个示例均可直接编辑,右侧实时显示 HTML 输出。点击按钮体验高级功能!

基础可编辑段落 & 实时输出

原理: 添加 contenteditable="true" 属性使任何元素可编辑。
特点: - 支持富文本(粘贴带格式文本、Ctrl+B 加粗等)
- 输入时自动更新 innerHTML
- 占位符通过 CSS :empty 伪类实现

这是可编辑段落。试试:选中文字后按 Ctrl+B 加粗,或粘贴带格式的文本。

// 编辑内容将实时显示在这里...

工具栏带格式的编辑器

原理: 使用 document.execCommand()(虽然已废弃但广泛兼容)或现代 Selection API
注意: execCommand 在现代项目中建议用库替代(如 Tiptap),但此例用于教学
选中这段文字,然后点击工具栏按钮试试效果!
// 格式化后的HTML将显示在这里

UX智能占位符 & 输入检测

技术: - CSS :empty:not(:focus):before 实现无 JS 占位符
- JS 监听 input 事件实现动态提示
字符数: 0

数据表格单元格编辑

应用场景: 在线 Excel、数据看板、后台管理系统
实现: 为每个 td 添加 contenteditable,监听变化保存数据
产品价格库存
iPhone 15¥7999100
MacBook Pro¥1299945
// 点击保存查看 JSON 数据

高级多用户编辑模拟(带光标显示)

模拟原理: - 通过 input 事件广播变更- 使用不同颜色边框区分用户- 实际项目需配合 WebSocket + Operational Transformation

你的编辑区(蓝色边框)

开始输入,右侧将实时同步显示

其他用户看到的内容(绿色边框)

等待你的输入...

安全防止 XSS 攻击的内容清洗

风险: 用户可能粘贴 <script>alert('XSS')</script>
解决方案: 提交前用 textContent 或 DOMPurify 清洗 HTML
尝试粘贴:<script>alert('XSS!')</script><img src=x onerror=alert(1)>
// 安全输出将显示在这里
由蚂蚁集团百灵AI提供技术支持 | contenteditable 虽然强大,但生产环境建议使用专业库(如 Quill、Tiptap)处理复杂富文本
<script>// 全局状态指示器控制function setStatus(id, isEditing) {const indicator = document.getElementById(id);indicator.classList.toggle('editing', isEditing);}// 示例1:实时输出HTMLconst demo1 = document.getElementById('demo1');const output1 = document.getElementById('output1');demo1.addEventListener('focus', () => setStatus('status1', true));demo1.addEventListener('blur', () => setStatus('status1', false));demo1.addEventListener('input', () => {output1.textContent = demo1.innerHTML;});// 示例2:富文本工具栏function formatText(command, value = null) {document.execCommand(command, false, value);updateOutput2();}function insertLink() {const url = prompt('请输入链接地址:', 'https://');if (url) document.execCommand('createLink', false, url);updateOutput2();}function clearFormat() {document.execCommand('removeFormat', false, null);updateOutput2();}function updateOutput2() {document.getElementById('output2').textContent = document.getElementById('demo2').innerHTML;}const demo2 = document.getElementById('demo2');demo2.addEventListener('focus', () => setStatus('status2', true));demo2.addEventListener('blur', () => setStatus('status2', false));demo2.addEventListener('input', updateOutput2);// 示例3:占位符与字符统计const demo3 = document.getElementById('demo3-placeholder');const charCount = document.getElementById('charCount');demo3.addEventListener('input', () => {charCount.textContent = `字符数: ${demo3.textContent.length}`;});function togglePlaceholder() {const placeholder = demo3.getAttribute('data-placeholder');if (demo3.textContent.trim() === '') {demo3.innerHTML = `占位符已禁用 - 现在为空区域`;} else {demo3.innerHTML = ''; // 清空后CSS占位符重新出现}}// 示例4:表格数据提取function saveTableData() {const rows = document.querySelectorAll('#editableTable tr');const data = [];rows.forEach(row => {const cells = row.querySelectorAll('td');data.push({product: cells[0].innerText,price: cells[1].innerText,stock: cells[2].innerText});});document.getElementById('tableOutput').textContent = JSON.stringify(data, null, 2);}// 监听表格编辑状态document.querySelectorAll('#editableTable td').forEach(td => {td.addEventListener('focus', () => setStatus('status4', true));td.addEventListener('blur', () => setStatus('status4', false));});// 示例5:协作编辑模拟const collabEditor = document.getElementById('collab-editor');const collabViewer = document.getElementById('collab-viewer');collabEditor.addEventListener('input', () => {// 模拟网络延迟setTimeout(() => {collabViewer.innerHTML = collabEditor.innerHTML;}, 300 + Math.random() * 500);setStatus('status5', true);setTimeout(() => setStatus('status5', false), 1000);});// 示例6:安全清洗演示function showUnsafeHTML() {const html = document.getElementById('unsafe-editor').innerHTML;document.getElementById('safeOutput').innerHTML = `危险输出(未清洗):\n${html}`;}function showSafeText() {const text = document.getElementById('unsafe-editor').textContent;document.getElementById('safeOutput').textContent = `安全文本(纯文本):\n${text}`;}function showSafeHTML() {const dirty = document.getElementById('unsafe-editor').innerHTML;// 使用浏览器DOM清洗(简单示例)const div = document.createElement('div');div.textContent = dirty; // 自动转义HTMLconst clean = div.innerHTML;// 更专业的做法:使用 DOMPurify.sanitize(dirty)document.getElementById('safeOutput').innerHTML = `清洗后HTML(安全):\n${clean}`;}// 实时状态检测document.querySelectorAll('[contenteditable="true"]').forEach(el => {el.addEventListener('focus', () => {document.getElementById('globalStatus').classList.add('editing');});el.addEventListener('blur', () => {document.getElementById('globalStatus').classList.remove('editing');});});// 初始化输出window.onload = () => {output1.textContent = demo1.innerHTML;updateOutput2();};</script>
http://www.hskmm.com/?act=detail&tid=28803

相关文章:

  • 距离和
  • 2025风机盘管厂家口碑推荐榜:高效节能与稳定性能的行业首选
  • 痞子衡嵌入式:在i.MXRT下测试启动特性时可改写OTP Shadow寄存器而不烧OTP
  • 直流微电网运行控制仿真算法设计与实现
  • 基于MATLAB的多棵树分类器(随机森林)
  • 车载360环视平台:米尔RK3576开发板支持12路低延迟推流
  • 2025双氧水厂家最新推荐榜:品质卓越与环保安全的首选品牌!
  • TDengine 3.3.6.0 使用Docker部署3节点集群
  • 05-字符设备驱动之ioctl
  • 2025氧化镁厂家最新推荐榜:高纯度与稳定性能的行业佼佼者!
  • 从“视频孤岛”到“统一视界”:解析视频汇聚平台EasyCVR的核心功能与应用场景
  • 个人博客作业 1:就《现代软件工程》提 5 个问题
  • 2025 年锅炉优质厂家最新推荐榜单:高效节能与环保性能全方位剖析,助您选到靠谱锅炉供应商
  • 2025 年商用洗碗机源头厂家最新推荐榜:聚焦实力企业,为餐饮及企事业单位选购提供可靠参考
  • EHOME平台EasyCVR视频诊断功能指南:一文读懂其可识别的所有视频质量问题
  • html介绍+运用
  • 2025 年 氨糖软骨素厂家哪家好?傦力宝产品选购指南,解析研发实力与品质优势
  • 【SPIE出版】2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025)
  • go读取二进制文件编译信息
  • 2025锯床厂家最新推荐榜:精准切割与高效性能的行业首选!
  • 2025.10.10 图论
  • xshell把界面转发到xming
  • 使用AI创建angular项目
  • 大模型在软件研发协同演进
  • NocoBase 走进德国大学课堂
  • 2025青海视频号运营最新推荐:创意内容与高效推广策略的完美
  • 008_函数
  • 内存分析记录
  • 详细介绍:构建生产级多模态数据集:视觉与视频模型(参照LLaVA-OneVision-Data和VideoChat2)
  • 2025 年图书杀菌机生产厂家最新推荐排行榜:聚焦高效杀菌技术与优质服务,优质企业全面盘点自助图书/臭氧图书/消毒图书/图书杀菌机厂家推荐