记一次解决 quill(vue-quill-editor) 编辑器中莫名多出一行“<p><br></p>”的过程...

问题描述:
在使用 vue-quill-editor 富文本编辑器过程中,加载已有的富文本数据到编辑器,经常会出现编辑器中莫名其妙多出一段换行内容 <p><br></p>(一般出现在段落与其他内容之间,例如标题,引用,列表),每次重新编辑之前的内容时都必须手动删除这些空行,否则这些换行就会越积越多。这让我们的文案小伙伴很不开心。

问题必须得解决,否则就又要换编辑器了。
先尝试直接使用 DOM 设置 innerHtml 进行设置原始内容,发现没有成功(在浏览器控制台可以成功,但是代码中无法设置,原因不明,猜测编辑器内部做了保护)。

然后看了一下 vue-quill-editor 中代码,发现很简单,它在 init 组件的时候调用了 quillpasteHTML方法。

// Set editor content
if (this.value || this.content) {
    this.quill.pasteHTML(this.value || this.content)
}

开始翻 quill 的源代码,搜索 pasteHTML,发现该方法(将被弃用)调用了dangerouslyPasteHTML方法。该方法里有这么一行是设置内容的:

this.quill.setContents(this.convert(index), html);

打印 convert函数的结果,发现返回的是 delta 对象。发现在多出换行的那个位置多出了一些'\n'字符,在控制台里显示这样↵↵

convert函数调用的是traverse函数,该函数把 node 转化成了 delta对象 。
traverse函数中使用一系列的Matchers进行内容匹配,其中最让我关注的两个Matcher函数是matchNewlinematchSpacing,因为只有这两个函数执行了delta.insert('\n');,在插入\n的这两个地方进行测试输出,发现主要问题在matchSpacing。该函数内有这么一行:

var nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom);
if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight * 1.5) {
  delta.insert('\n');
}

计算 node 的实际高度 nodeHeight,然后拿下一个兄弟元素的 offsetTopnode.offsetTop + nodeHeight * 1.5进行比较,如果前者比后者大,则插入一个换行。(不是很清楚这么做的目的,有想法的朋友可以留言说一下~),我们打印一下这三个值,发现系数1.5有点小,后来我改成了2,基本就不会有这种问题出现了。

也就是说,我目前的解决办法是把 quill.js 里系数1.5改成了2.....

ps:打印出 margin 的值,发现结果都是 0,设置 paddingline-height 也对这三个数据没有任何影响。

希望有其他看法或者解决方案的朋友可以留言说一下.

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
vue-quill-editor是一个可以在Vue项目使用的富文本编辑器组件。它支持上传图片和调整图片大小的功能。为了实现这些功能,你需要安装两个插件:quill-image-drop-module和quill-image-resize-module。首先,你需要通过npm命令安装这两个插件。然后,你需要修改配置文件,以便在Vue项目使用这些插件。具体的安装和配置步骤如下: 1. 打开终端,进入你的Vue项目所在的目录,并执行以下命令来安装quill-image-drop-module和quill-image-resize-module插件: ``` npm install quill-image-drop-module -S npm install quill-image-resize-module -S ``` 2. 在Vue2,你需要修改配置文件。具体的修改方式可以参考插件的文档或示例代码。 3. 在Vue3,你需要先安装vue-quill-editor组件。执行以下命令来安装vue-quill-editor: ``` npm install @vueup/vue-quill@alpha --save ``` 4. 在你的main.js文件,导入vue-quill-editor组件,并将其注册为全局组件: ``` import { createApp } from 'vue'; import { QuillEditor } from '@vueup/vue-quill'; import '@vueup/vue-quill/dist/vue-quill.snow.css'; createApp(App) .component('QuillEditor', QuillEditor) .mount('#app'); ``` 5. 在需要使用富文本编辑器的组件,使用<quill-editor>标签来引入vue-quill-editor组件,并传入相应的属性和事件监听: ```html <template> <quill-editor content-type='html' :content='content' :options='options' @blur='editorBlur($event)' /> </template> <script setup> import { ref } from 'vue'; let content = ref("<p>初始内容...</p>"); let options = {/* 配置选项 */} </script> ``` 以上是使用vue-quill-editor的基本步骤。希望对你有帮助!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值