contenteditable实战总结从基础到高级的全面解析

Prog.卜楷 交互 阅读 617
赞 63 收藏
二维码
手机扫码查看
反馈

为什么我要对比这几个方案

最近在项目里搞了个富文本编辑器,主要用到了contenteditable属性。说实话,这个属性挺方便的,但也有不少坑。今天就来聊聊我用过的几种实现方式,希望能帮到大家。

contenteditable实战总结从基础到高级的全面解析

谁更灵活?谁更省事?

我比较喜欢用纯HTML+JavaScript的方式来实现contenteditable,因为这样最灵活,可以完全按自己的需求来定制。不过,这种方式也有一些坑,后面会详细说。

纯HTML+JavaScript:核心代码就这几行

先来看看纯HTML+JavaScript的实现方式。其实很简单,只需要一个div加上contenteditable属性,然后写点JS来处理一些事件就行了。

<div id="editor" contenteditable="true">
  这里是可编辑的内容
</div>

<script>
  const editor = document.getElementById('editor');
  
  editor.addEventListener('input', (e) => {
    console.log('内容变化了:', e.target.innerHTML);
  });

  editor.addEventListener('focus', (e) => {
    console.log('编辑器获得了焦点');
  });

  editor.addEventListener('blur', (e) => {
    console.log('编辑器失去了焦点');
  });
</script>

上面的代码就是最基础的实现。通过监听input、focus和blur事件,可以实现基本的功能。不过,这种实现方式在实际使用中还是有一些问题的,比如处理粘贴、拖拽等复杂操作时会比较麻烦。

性能对比:差距比我想象的大

纯HTML+JavaScript的方式虽然灵活,但在性能上可能不如一些成熟的库。我之前用过几个第三方库,比如ProseMirror和TinyMCE,发现它们在处理大量内容时表现更好。

ProseMirror:功能强大,但配置复杂

ProseMirror是一个非常强大的富文本编辑器库,支持很多高级功能,比如协作编辑、自定义节点等。但是,它的配置相当复杂,学习曲线也比较陡峭。

import { EditorState } from 'prosemirror-state';
import { EditorView } from 'prosemirror-view';
import { Schema, DOMParser } from 'prosemirror-model';
import { exampleSetup } from 'prosemirror-example-setup';

const schema = new Schema({
  nodes: exampleSetup.nodes,
  marks: exampleSetup.marks
});

const doc = DOMParser.fromSchema(schema).parse(document.querySelector('#content'));

const state = EditorState.create({
  doc,
  plugins: exampleSetup.plugins
});

const view = new EditorView(document.querySelector('#editor'), {
  state
});

上面的代码只是ProseMirror的一个简单示例。如果你需要更复杂的功能,就得自己去配置各种插件和节点,折腾半天才发现还有很多坑要踩。

TinyMCE:简单易用,但灵活性有限

TinyMCE是一个非常流行的富文本编辑器,它的优点是简单易用,配置起来也很方便。不过,它的灵活性相对较低,有时候你想要的一些特殊功能可能就不太好实现。

<script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
<script>
  tinymce.init({
    selector: '#editor',
    plugins: 'link image code',
    toolbar: 'undo redo | bold italic | alignleft aligncenter alignright | code'
  });
</script>

<textarea id="editor">
  这里是可编辑的内容
</textarea>

上面的代码展示了如何初始化一个简单的TinyMCE编辑器。它的API还算丰富,但如果你想做一些非常规的操作,可能会发现有些地方不太方便。

我的选型逻辑

总的来说,选择哪种方案要看具体的需求和场景。如果项目比较简单,不需要太多高级功能,我会直接用纯HTML+JavaScript的方式。这样可以快速实现,而且改动起来也方便。

如果项目需要更多高级功能,比如协作编辑或者自定义节点,我会考虑用ProseMirror。虽然配置起来有点麻烦,但它的功能确实强大。

至于TinyMCE,我觉得它适合那些需要快速集成并且对功能要求不是特别高的场景。它简单易用,配置起来也很方便。

以上是我的对比总结,有不同看法欢迎评论区交流

希望这篇文章能帮到大家。如果你有其他更好的方案或者有不一样的看法,欢迎在评论区留言交流。大家一起进步嘛!

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论
W″智慧
读完这篇文章,我对自己的职业发展有了新的规划,更有方向感了。
点赞
2026-02-18 08:25