如何在非Vue项目中使用vue-quill-editor实现粘贴纯文本功能?-灵析社区

元气满满才怪啊

在一个非Vue项目构建的、仅是普通的JavaScript项目里,只是简单地在页面引入了quill.js、vue-quill-editor.js、vue.js。 1. 需要实现在vuequilleditor中粘贴文本时,将粘贴的富文本转换文纯文本,并插入到光标所在位置。 2. 如果光标选中了部分内容,需要将选中的内容替换为粘贴文本。 3. 插入文本后,需要修改光标位置到插入文本的后面 4. 即使当前光标所在的位置(选中的文本)带有css样式,粘贴后的文本也不能带有样式。 Vue.use(window.VueQuillEditor) var toolbarOptions = [ ['bold', 'underline'], [{ 'color': ['blue', 'red', 'black'] }], ['link'], ['clean'] ] var main = new Vue({ el: "#main", data: { QuillEditors: [], editorOption: { scrollingContainer: null, modules: { toolbar: toolbarOptions }, theme: 'snow' }, }, methods: { } }) 我尝过使用mounted函数,监听‘paste’事件,然后获取剪切板内容的文本格式(text/plain),再调用quill的insertText方法将文本内容插入。 但是插入后,文本内容会受到 插入index所在的delta的样式的影响? 同样,删除时使用deleteText、insertText方法,结果也都不理想。 * * * 经过maxkiicc大佬的帮助,我已经解决了 1. 需要实现在vuequilleditor中粘贴文本时,将粘贴的富文本转换文纯文本,并插入到光标所在位置。 2. 插入文本后,需要修改光标位置到插入文本的后面 3. 即使当前光标所在的位置(选中的文本)带有css样式,粘贴后的文本也不能带有样式。 尚未解决的问题为: 2. 如果光标选中了部分内容,需要将选中的内容替换为粘贴文本。 问题描述: 如果用光标选中一部分内容,然后再粘贴,会发现粘贴的内容被删除了光标选中文本长度的内容。 比如: 当前内容为:1234 光标选中文本:23 要粘贴的内容:index 得到的结果:1dex4 Vue.use(window.VueQuillEditor) var toolbarOptions = [ ['bold', 'underline'], [{ 'color': ['blue', 'red', 'black'] }], ['link'], ['clean'] ] var main = new Vue({ el: "#main", data: { QuillEditors: [], editorOption: { scrollingContainer: null, modules: { toolbar: toolbarOptions }, theme: 'snow' }, }, mounted () { var quill = this.$refs.myQuillEditor.quill quill.root.addEventListener('paste', function (e) { e.preventDefault() const clipboardData = e.clipboardData || window.clipboardData const pastedText = clipboardData.getData('text/plain') requestAnimationFrame(() => { const pasteLength = pastedText.length const index = quill.selection.savedRange.index const length = quill.selection.savedRange.length // retain delete的index不能等于0 if (index === 0) { if (length !== 0) { quill.updateContents([ { insert: pastedText, }, { delete: length } ]) } else { quill.updateContents([ { insert: pastedText, }, ]) } } else { if (length !== 0) { quill.updateContents([ { retain: index, }, { insert: pastedText, }, { delete: length } ]) } else { quill.updateContents([ { retain: index, }, { insert: pastedText, }, ]) } } // 挪动光标到复制文本后 setTimeout(() => { quill.setSelection(index + pasteLength, 0) }, 0) }) }) } })

阅读量:142

点赞量:0

问AI
先说下解决方法吧,之前的思路太过复杂,"Quill"提供了"clipboard.addMatcher"方法,可以自定义粘贴的内容,通过"clipboard.addMatcher"方法,我们可以将粘贴的富文本转换为纯文本。 initQuill() { const NODE_TYPE = { ELEMENT_NODE: 1 } const quill = this.$refs.myQuillEditor.quill; quill.clipboard.addMatcher(NODE_TYPE.ELEMENT_NODE, function (node, delta) { // 获取粘贴的纯文本 var plaintext = node.innerText; var Delta = Quill.import("delta"); return new Delta().insert(plaintext); }); }, "https://quilljs.com/docs/modules/clipboard" (https://link.segmentfault.com/?enc=fjza43vQgxyBdB2SgS0jag%3D%3D.xtBHfDVxslueM3BDBDF7ua%2Bh8ufLMuEuEQqi5YWUOEQCB16Ugnc81xo25X%2FwZ7DE) "https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType" (https://link.segmentfault.com/?enc=dVCI%2Bj29WkXswz5Cakn3aQ%3D%3D.ReMKfwqWekywnt3QVWRUqUD05DLumBnh3uX%2BVOmAw%2Bb%2FzALm6%2Fz3ybQbINupTUlU6vIdmhucQGin3PYQRpCwGw%3D%3D) 然后你说的那个问题确实了触发了Quill的onPaste事件,它的回调函数中有一个异步事件,导致delta的更新发生了冲突。而且自定义paste事件会让它原本的一些功能失效。 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/e87c0edcb1d2d0e7f2155ae22b7d7ed1.png) ----------update---------------------- 不确定使用insertText会不会受到外部样式的影响,但是QuillJs提供了使用"Delta"来编辑内容的api,你可以使用"updateContents"来更新当前富文本编辑器的内容。"Delta"本身是不包含当前操作 Index 的,所有操作都是从头开始,可以用"retain"保留光标"index"之前的内容。 "https://quilljs.com/docs/api#updatecontents" (https://link.segmentfault.com/?enc=2OK7hjNO5KDI%2BNwWVfmNrQ%3D%3D.yYaTPBhalkQhYfEUa1t2jeABQdzyAvni8fvv%2BR2BoN1Ym%2BHavCCtnj4cyp0XdxLZ) "https://quilljs.com/docs/delta#playground" (https://link.segmentfault.com/?enc=njus7oLFADTWf7McmNZteQ%3D%3D.1gFs8WS3%2Bji8%2BzjVjD39qvvBmmkw4bqryGOLC6NTsLYHVnmTlqB6VpOC7ykXlJu8) 但是我在测试过程中,当"index === 0"的时候会报错,感觉是QuillJS的问题,你可以对"delta"的细节处理一下。 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/42160c40bd7a2958fe037ef838cd2b34.png) pasteListenerCb(event) { event.preventDefault(); let paste = (event.clipboardData || window.clipboardData).getData("text"); this.clipboardData = paste; const pasteLength = paste.length; const quill = this.$refs.myQuillEditor.quill; const index = quill.selection.savedRange.index; quill.updateContents([ { retain: index, }, { insert: paste, }, ]); },