Quill 富文本编辑器二次封装

Quill 是一个很流行的富文本编辑器,github 上 star 大约 21k。但是很少项目中使用时直接使用它,都要对其进行二次封装,你作为一个页面仔是挡不住有想法的产品经理的。

安装 quill 库

  • 原生应用中使用
<link href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet" />
<script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>
  • spa 应用中使用
// npm install quill
import Quill from "quill";

实例化 Quil 对象

实例化 Quill,挂载到当前上下文中,然后就能使用它的相关方法及属性

import Quill from "quill";
import "quill/dist/quill.snow.css";const options = {debug: "warn",modules: {toolbar: [["bold", "italic", "underline", "blockquote"],[{ align: "justify" }, { align: "center" }, { align: "right" }]// ['link', 'image'],]},placeholder: this.props.placeholder || "请输入内容...",readOnly: false,theme: "snow"
};const quill = new Quill(".my-editer", options); // 将其实例化到dom树上.my-editor的节点上

getSelection

我们在插入内容时,要得知几个必要条件:

  • 1、从哪里开始插入
  • 2、插入的内容是什么 (文字、图片、标题、视频、音频)?
  • 3、插入的内容是否需要格式化?(标题的话,需要插入文本然后格式化成标题格式)

那么 getSelection() 方法便是用来获取光标的,就让我们知道了现在用户光标置于何处,那么就知道了第一个条件

this.quill.getSelection();

insertText

insertText() 方法是插入文本用的,一般都会在插入后,格式化其他格式,所以下面的方法基本要连用

format

format() 方法是格式化数据的,能将文本格式化成链接、标题、对齐、大小等等

// 格式化成标题
this.quill.insertText(section_index, getFieldValue("title"));
this.quill.getSelection();
this.quill.format("header",toolbar[activeToolIndex].value,getFieldValue("title")
);// 格式化成链接
getFieldValue("link") && this.quill.format("link", getFieldValue("link"));

on

on() 是监听某些变化用的,比如 text-change,就是在富文本中的编辑内容更改时会触发,这里面会处理很多的变化相关

this.quill = new Quill(".mys-editor", this.options);
this.quill.on("text-change", this.handleChange.bind(this));

注册自定义的标签

因为 quill 中的标签是有限的,如果要使用其他标签的话,需要注册进去,以 video 标签为例:

  • 同级目录下新建 quil-video.js
const Quill = require("quill");
const BlockEmbed = Quill.import("blots/block/embed");
export class VideoBlot extends BlockEmbed {static create(value: any) {let node = super.create();node.setAttribute("src", value.url);node.setAttribute("controls", value.controls);node.setAttribute("width", value.width);node.setAttribute("height", value.height);node.setAttribute("webkit-playsinline", true);node.setAttribute("playsinline", true);node.setAttribute("x5-playsinline", true);return node;}static value(node: any) {return {url: node.getAttribute("src"),controls: node.getAttribute("controls"),width: node.getAttribute("width"),height: node.getAttribute("height")};}
}

然后在富文本编辑器的组件中在实例化的 Quill 上注册该标签

import Quill from "quill";
import { VideoBlot } from "./quill-video";VideoBlot.blotName = "simpleVideo";
VideoBlot.tagName = "video";
Quill.register({ "formats/simpleVideo": VideoBlot }, true);

便可以在相应的位置进行插入 video 标签了

const p = this.getSelection(); // 获取插入的光标位置
this.quill.insertEmbed(p, "simpleVideo", {url, // 视频的地址controls: "controls",width: "100%"
});

oss 加密引起问题

图片、视频使用三方 oss 存储,那么存在一个问题,就是回显图片时需要图片地址后面带上 ossToken,上传数据保存时,需要去除 ossToken,所以需要以下正则来实现,就是富文本最终结果是个字符串,使用正则匹配每个 img,video 标签的 src,将其对应的替换:

  • 上传时清除 ossToken
export function formatEditData(value: string) {const imgReg = /<img.*?(?:>|\/>)/gi;const videoReg = /(<video.*?)\<\/video>/gi;if (value.match(imgReg)) {value = changeImgurl(value);}if (value.match(videoReg)) {value = changeVideoUrl(value);}return value;
}export function changeImgurl(value: string) {const result = value.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function(match,capture) {const ret = capture.replace("https://img.schtwz.cn/", "");const result = ret.slice(0, ret.indexOf("?"));return `<img src="${result}">`;});return result;
}export function changeVideoUrl(value: string) {const result = value.replace(/<video [^>]*src=['"]([^'"]+).*?\<\/video>/gi,function(match, capture) {const ret = capture.replace("https://img.schtwz.cn/", "");const result = ret.slice(0, ret.indexOf("?"));return `<video src="${result}" controls="controls" width="100%" height="undefined" webkit-playsinline="true" playsinline="true" x5-playsinline="true"></video>`;});return result;
}
  • c 端解析富文本地址
export function changeUrl(value: string) {if (typeof value != "string") return "";let result = value.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function(match,capture) {return `<img src="${signatureUrl(capture)}">`;});result = result.replace(/<video [^>]*src=['"]([^'"]+).*?\<\/video>/gi,function(match, capture) {// console.log(capture);return `<video src="${signatureUrl(capture)}" controls="controls" width="100%" height="undefined" webkit-playsinline="true" playsinline="true" x5-playsinline="true"></video>`;});return result;
}

Quill 富文本编辑器二次封装相关推荐

  1. quill富文本编辑器——修改默认图片、视频上传功能

    quill富文本编辑器默认的图片上传是将图片地址转换为base64格式,可能会导致字段过长:默认的视频上传是插入iframe标签,与需要的video标签不符合 图片上传 初始化编辑器时重写image上 ...

  2. quill 富文本编辑器自定义格式化

    quilljs 现在富文本编辑器轮子太多了,Github 上随便搜一下就有一堆,我需要实现的功能很简单,所以就佛系地选了 quilljs,quilljs 是一个轻量级的富文本编辑器. 链接: 官网:q ...

  3. vue quill富文本编辑器上传图片遇到的坑

    在使用quill富文本编辑器上传图片的时候,很多地方都是成功的,但是唯有一处,上传图片总是失败,由此后端的朋友就说可以html标签转换成JSON字符串上传上去,展示的时候在转换回来,即可解决问题. 由 ...

  4. quill 富文本编辑器

    富文本quill 富文本框中上传图片的缩放功能 vue.config.js添加如下配置 import "./resizeImg.js"➡ resizeImg.js下载链接 3.以下 ...

  5. vue中使用quill富文本编辑器

    因为公司的需求,对比了线在很火的几款富文本编辑器,最终选定了quill,他够轻量,拓展性也比较高,除了文档是英文的阅读不方便之外,都很适合公司项目.故整理出来,也方便以后使用. 在网上找了一个中文文档 ...

  6. *使用quill富文本编辑器的插件,自定义formData图片上传

    官网地址:https://quilljs.com 项目需求:自带的上传图片是base64,直接入库的话,请求头太长,导致网页十分十分的卡,所以才改用formData自定义上传(改完之后,相当于覆盖了他 ...

  7. quill富文本编辑器quill粘贴图片上传服务器

    强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...

  8. 实现一个简易的富文本编辑器(二):给富文本添加自定义事件

    为富文本添加一个提交按钮,点击按钮可以获取富文本内容.但是在提交前或者提交后我想做一些操作,比如内容校验内容清空等等. 我们直接在该按钮上绑定点击事件同样可以达到目的,但是为了组件化,所以本例打算为提 ...

  9. Quill富文本编辑器的使用

    1.快速起步 <!-- Include stylesheet --> <link href="https://cdn.quilljs.com/1.3.6/quill.sno ...

最新文章

  1. Python面向对象篇(2)-继承
  2. 网页设计师的最佳设计工具名单出炉
  3. 从梯度下降到ADMM-学习记录
  4. python内嵌函数和闭包与java 匿名内部类_Java匿名内部类构造原理分析
  5. python程序设计是干什么的_python程序员有学设计模式的必要吗?
  6. 跨域支持与返回json数据--mvc访问api接口
  7. 博弈论——战略式博弈
  8. python 全栈开发,Day126(创业故事,软件部需求,内容采集,显示内容图文列表,MongoDB数据导入导出JSON)...
  9. PGP的安装及使用,利用加密软件PGP对邮件内容进行加密和解密,保姆级教学
  10. excel删除重复值并原位置保留第一个值方法步骤
  11. 大疆飞行模拟器 下载、安装及使用教程
  12. WIN10系统如何开启终端
  13. 雷军亲自打造的套餐了解下:用多少付多少
  14. Abaqus中C3D8R单元和C3D8I单元的区别
  15. 工程图学及计算机绘图宋卫卫,工程图学及计算机绘图习题集
  16. 36.深度解密三十六:网络舆情监测之另类“免费监测”方法详解
  17. CentOS 5.5 下开源的系统监控工具 cacti 的安装
  18. 2021-09-15 如何退出微信小程序
  19. 为什么没有幼年、青年、老年危机?
  20. 计算机网络工程期刊,信息工程学院李挥教授课题组在计算机网络顶级期刊JSAC上发表学术论文...

热门文章

  1. 2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种
  2. 阿里云后台研发电话面试凉凉
  3. 浩辰CAD看图王手机版中添加的图片批注在电脑端如何查看?
  4. Angular-CLI工具使用文档翻译
  5. 为什么会有工频干扰_工频干扰产生原因及解决方案【转载】
  6. 设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声
  7. SQL基础系列(四)——多表查询
  8. Marvell 88NV1120固态硬盘开卡图文教程+量产开卡软件下载
  9. spring源码分析系列(一)
  10. 在Centos7上安装osp