定制富文本编辑器

定制富文本编辑器
简介
var quill = new Quill('#editor', {modules: { toolbar: true },theme: 'snow'})
如何在Quill上定制功能
quill提供了非常细粒度,定义良好的API,我们可以在此基础之上进行定制化开发自己的富文本编辑器。(环境为vue + iview,使用iview进行辅助样式开发)
首先我们从最简单的demo入手。
<template><div id="editor" class="editor">div>template><script>import Quill from "quill";export default {mounted() {const quill = new Quill("#editor", {theme: "snow",placeholder: "请在此开始编辑..."});}};script>
这是一个替代参数条件下的一个富文本编辑器,我们首先对Toolbar进行替换,Toolbar是modules的一部分。

我们需要在新建quill实例的时候覆盖原来的工具栏,并使用自己的工具栏元素。
<template><div class="container"><div id="toolbar"><Tooltip content="加粗" placement="bottom"><button class="ql-bold">button>Tooltip><Tooltip content="倾斜" placement="bottom"><button class="ql-italic">button>Tooltip><Tooltip content="下划线" placement="bottom"><button class="ql-underline">button>Tooltip><Tooltip content="删除线" placement="bottom"><button class="ql-strike">button>Tooltip>div><div id="editor" class="editor">div>div>template><script>import Quill from "quill";export default {mounted() {const quill = new Quill("#editor", {theme: "snow",modules: {toolbar: "#toolbar"},placeholder: "请在此开始编辑..."});}};script><style lang="less" scoped>style>

<template><div class="”container“"><div id="toolbar"><Tooltip content="添加卡片" placement="bottom"><button class="ql-card"><Icon type="md-card" />button>Tooltip>div><div id="editor" class="editor">div>div>template><script>import Quill from "quill";export default {mounted() {const quill = new Quill("#editor", {theme: "snow",modules: {toolbar: {container: "#toolbar",handlers: {card: () => { // 属性名称要与 ql-xxx 对应console.log(`点击了 card`);}}}},placeholder: "请在此开始编辑..."});}};script><style lang="less" scoped>style>
const BlockEmbed = Quill.import('blots/block/embed')function customCard(node) {// 在一个节点中插入自定义的 domconst leftDiv = document.createElement('div')leftDiv.className = 'media-container'const mediaDiv = document.createElement('div')mediaDiv.style['background-image'] = `url(${value.image})`mediaDiv.className = 'media'leftDiv.appendChild(mediaDiv)const rightDiv = document.createElement('div')rightDiv.className = 'content-container'const titleP = document.createElement('p')titleP.className = 'title'titleP.innerText = value.titleconst authorP = document.createElement('p')authorP.className = 'author'authorP.innerText = value.authorconst contentP = document.createElement('p')contentP.className = 'content'contentP.innerText = value.contentrightDiv.appendChild(titleP)rightDiv.appendChild(authorP)rightDiv.appendChild(contentP)node.appendChild(leftDiv)node.appendChild(rightDiv)}// 自定义卡片节点class CardBlot extends BlockEmbed {static create(value) {const node = super.create()// 新建节点时传入的数据node.dataset.title = value.titlenode.dataset.image = value.imagenode.dataset.content = value.contentnode.dataset.author = value.authorcustomizeCard(node)node.setAttribute('contenteditable', false) // 设置该节点不可编辑return node}static value(node) {// 这里需要返回 create 函数中传入的数据return node.dataset}}CardBlot.blotName = 'card' // quill 中的标记名称CardBlot.tagName = 'div' // dom 节点名称CardBlot.className = 'card' // dom 中真实的 class 名称Quill.register(CardBlot)
const CARD_INFO = {title: 'Quill 编辑器',author: 'jhchen',content:'Quill是一种现代的富文本编辑器,旨在实现兼容性和可扩展性。它由Jason Chen和Byron Milligan创建,并由Slab积极维护。 ',image:'http://neau-lib-static.test.upcdn.net/quill/resource/1576812308405-0.0544z7sqq9au-quill.png'}new Quill('#editor', {theme: 'snow',modules: {toolbar: {container: '#toolbar',handlers: {card: () => {const addRange = this.quill.getSelection() || 0 // 获取当前光标选中的位置this.quill.insertEmbed(addRange,'card',CARD_INFO,Quill.sources.USER) // 插入 card blotsthis.$nextTick(() => {this.quill.setSelection(addRange + 1, Quill.sources.SILENT)}) // 插入完成后将光标向后移动一位}}}},placeholder: '请在此开始编辑...'})
本文完~

评论
