quill富文本编辑器监听复制粘贴清除格式(防止粘贴滚动条回到顶部、网页抖动)

Quill编辑器粘贴功能优化

quill中文文档https://www.kancloud.cn/liuwave/quill/1409382

quill英文文档https://quilljs.com/

一、需求

1、保留图片跟空格

2、清除其余所以样式

真的是太开心的了在网上各种百度搜索终于找到了一个方法,

文档没有详细说明

下面看例子吧

quill.clipboard.addMatcher(Node.ELEMENT_NODE, (node, delta) => {
  delta.ops = delta.ops.map(op => {
    return {
      insert: op.insert
    }
  })
  return delta
})

试试会得到你想要的效果

二:如果你只是想保留纯文本

看一下试试如下效果

quill.clipboard.addMatcher(Node.ELEMENT_NODE, (node, delta) => {
  let ops = []
      delta.ops.forEach(op => {
        if (op.insert && typeof op.insert === 'string') {
          ops.push({
            insert: op.insert
          })
        }
      })
      delta.ops = ops
      return delta
})

<think>我们正在解决Quill富文本编辑器粘贴内容时滚动条自动回滚到顶部问题。根据引用[1]和引用[4],我们可以采用两种方法: 方法一(引用[1]):通过CSS样式设置容器高度和滚动条 方法二(引用[4]):通过重写剪贴板类的onPaste方法,在粘贴前保存滚动位置,粘贴后恢复 详细步骤: 方法一:CSS方法(简单易行) 在HTML页面中添加CSS样式,覆盖默认样式: ``` .ql-container { height: 500px !important; overflow: auto !important; } ``` 注意:这里设置了一个固定高度(500px),你也可以根据实际需要调整。 方法二:JavaScript方法(更精确控制) 通过自定义剪贴板行为,在粘贴前记录当前的滚动位置,粘贴完成后恢复滚动位置。 以下是引用[4]中提供的代码示例,我们将其整合到Quill编辑器中: ```javascript // 自定义剪贴板类,继承自Clipboard class CustomClipboard extends Clipboard { onPaste(e) { const top = window.pageYOffset; const left = window.pageXOffset; if (e.defaultPrevented || !this.quill.isEnabled()) return; let range = this.quill.getSelection(); let delta = new Delta().retain(range.index); // 将剪贴板容器定位到当前滚动位置,防止跳动 this.container.style.top = top + "px"; this.container.focus(); setTimeout(() => { this.quill.selection.update(Quill.sources.SILENT); let convertData = this.convert(); delta = delta.concat(convertData).delete(range.length); this.quill.updateContents(delta, Quill.sources.USER); this.quill.setSelection(delta.length() - range.length, Quill.sources.SILENT); let bounds = this.quill.getBounds(delta.length() - range.length, Quill.sources.SILENT); this.quill.scrollingContainer.scrollTop = bounds.top; // 粘贴后恢复窗口的滚动位置 window.scrollTo({ top, left }); }, 1); } } // 在创建Quill实例后,将剪贴板模块替换为自定义的 let quill = new Quill('#editor-container', { modules: { clipboard: { module: CustomClipboard } }, theme: 'snow' }); ``` 注意:方法二需要你熟悉JavaScriptQuill的内部模块。同时,注意代码中的`Delta`和`Quill`对象需要正确引入。 根据引用[5],我们了解到Quill编辑器的DOM结构,因此方法一中的CSS样式设置的是`.ql-container`,这个容器是编辑内容的父容器。 建议:如果问题不复杂,可以先尝试方法一,因为它简单。如果方法一无效,或者你需要更精确的控制,再使用方法二。 §§相关问题§§ 1. 如何自定义Quill编辑器的工具栏? 2. Quill编辑器如何实现图片上传功能? 3. 在Vue项目中如何使用Quill编辑器并解决粘贴滚动问题? </think>### 解决 Quill 富文本编辑器粘贴滚动条回顶问题 根据引用内容,以下是两种有效的解决方案: #### ✅ 方法一:CSS 样式覆盖(推荐) 在全局 CSS 文件中添加以下样式,覆盖默认样式: ```css .ql-container { height: 500px !important; /* 设置固定高度防止跳动 */ overflow: auto !important; /* 强制启用滚动条 */ } ``` **原理**: 通过强制设置编辑器容器高度和滚动模式(引用[1][5]),消除粘贴时因内容高度突变导致的滚动条跳动问题。高度值 `500px` 可根据实际需求调整。 #### ✅ 方法二:自定义粘贴事件处理 通过继承 `Clipboard` 类重写 `onPaste` 方法(引用[4]): ```javascript class CustomClipboard extends Clipboard { onPaste(e) { const top = window.pageYOffset; // 保存滚动位置 const left = window.pageXOffset; // 原有粘贴逻辑(此处简化) super.onPaste(e); // 恢复滚动位置 setTimeout(() => { window.scrollTo({ top, left }); }, 10); } } // 初始化时替换默认模块 new Quill(editor, { modules: { clipboard: { module: CustomClipboard } } }); ``` **原理**: 粘贴前保存滚动位置,操作完成后通过 `window.scrollTo()` 恢复原始视口位置(引用[4])。 --- ### 💡 注意事项 1. **CSS 优先级**: 确保自定义 CSS 优先级高于 Quill 默认样式(引用[1]),可通过 `!important` 或加载顺序控制 2. **容器高度关系**: Quill 容器层级为 `quill-editor > ql-container > ql-editor`(引用[5]),设置高度时需注意父子容器继承关系 3. **Vue 集成**: 在 Vue 项目中(引用[2]),可将方案一直接添加到全局样式文件,或通过 `<style scoped>` 覆盖组件样式 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值