• vue-quill-editor富文本编辑器使用方法,最全,含部分源码解读,含图片上传,如果页面有多个富文本,图片上传解决方案


    vue-quill-editor富文本编辑器使用方法,最全,含部分源码解读,含图片上传,如果页面有多个富文本,图片上传解决方案

     

    官方文档:https://www.npmjs.com/package/vue-quill-editor
    gitHub地址:https://github.com/surmon-china/vue-quill-editor

    本文参考:

    vue-quill-editor富文本编辑器使用步骤_小菜鸟的前端日记的博客-CSDN博客_vue-quillvue-quill-editor的安装和配置,实现工具栏自定义数据格式,以及鼠标经过提示中文释义https://blog.csdn.net/qq_44782585/article/details/123571236

    一、效果

    二、安装

    2.1脚手架安装

    命令

    npm install vue-quill-editor -S

    引入到项目----方法一

    1. import { quillEditor } from 'vue-quill-editor'
    2. import 'quill/dist/quill.core.css'
    3. import 'quill/dist/quill.snow.css'
    4. import 'quill/dist/quill.bubble.css'
    5. export default {
    6. components: {
    7. quillEditor
    8. }
    9. }

    引入到项目----方法二

    1. import VueQuillEditor from 'vue-quill-editor'
    2. import 'quill/dist/quill.core.css'
    3. import 'quill/dist/quill.snow.css'
    4. import 'quill/dist/quill.bubble.css'
    5. Vue.use(VueQuillEditor);

     2.2引入安装

    资源下载

    vue富文本编辑器vue-quill-editor.jsquill版本1.3.6-Javascript文档类资源-CSDN下载vue富文本编辑器使用教程https://blog.csdn.net/cplvfx/articl更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/cplvfx/85847785

    引入文件

    1. <script src="/js/common/vue.min2.6.14.js"></script>
    2. <script src="/js/common/element-ui2.15.7.js"></script>
    3. <link rel="stylesheet" href="/js/common/vue-quill-editor/quilljs1.3.6/quill.core.css"/>
    4. <link rel="stylesheet" href="/js/common/vue-quill-editor/quilljs1.3.6/quill.snow.css"/>
    5. <link rel="stylesheet" href="/js/common/vue-quill-editor/quilljs1.3.6/quill.bubble.css"/>
    6. <script src="/js/common/vue-quill-editor/quilljs1.3.6/quill.js"></script>
    7. <script src="/js/common/vue-quill-editor/vue-quill-editor.js"></script>
    8. <script src="/js/common/vue-quill-editor/vue-quill-editor-Config.js"></script>
    9. <style>
    10. .ql-container.ql-snow{
    11. min-height: 120px; //初始化富文本高度
    12. }
    13. </style>

     引入到项目,初始化

    Vue.use(window.VueQuillEditor);

     vue-quill-editor-Config.js代码

    这里的vue-quill-editor-Config.js数据个性化顶部菜单栏没配置

    1. var _EditorOption_={
    2. modules: {
    3. toolbar: [
    4. ['bold', 'italic', 'underline'], // 加粗 斜体 下划线 删除线
    5. [{ size: [12, 14,16] }], // 字体大小
    6. [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
    7. [{ align: [] }], // 对齐方式
    8. ['clean'], // 清除文本格式
    9. // ['link','image'] // 链接、图片、视频
    10. ['link'] // 链接、图片、视频
    11. ]
    12. },
    13. placeholder: '请输入正文'
    14. };
    15. // toolbar标题
    16. const titleConfig = [
    17. { Choice: '.ql-insertMetric', title: '跳转配置' },
    18. { Choice: '.ql-bold', title: '加粗' },
    19. { Choice: '.ql-italic', title: '斜体' },
    20. { Choice: '.ql-underline', title: '下划线' },
    21. { Choice: '.ql-header', title: '段落格式' },
    22. { Choice: '.ql-strike', title: '删除线' },
    23. { Choice: '.ql-blockquote', title: '块引用' },
    24. { Choice: '.ql-code', title: '插入代码' },
    25. { Choice: '.ql-code-block', title: '插入代码段' },
    26. { Choice: '.ql-font', title: '字体' },
    27. { Choice: '.ql-size', title: '字体大小' },
    28. { Choice: '.ql-list[value="ordered"]', title: '编号列表' },
    29. { Choice: '.ql-list[value="bullet"]', title: '项目列表' },
    30. { Choice: '.ql-direction', title: '文本方向' },
    31. { Choice: '.ql-header[value="1"]', title: 'h1' },
    32. { Choice: '.ql-header[value="2"]', title: 'h2' },
    33. { Choice: '.ql-align', title: '对齐方式' },
    34. { Choice: '.ql-color', title: '字体颜色' },
    35. { Choice: '.ql-background', title: '背景颜色' },
    36. { Choice: '.ql-image', title: '图像' },
    37. { Choice: '.ql-video', title: '视频' },
    38. { Choice: '.ql-link', title: '添加链接' },
    39. { Choice: '.ql-formula', title: '插入公式' },
    40. { Choice: '.ql-clean', title: '清除字体格式' },
    41. { Choice: '.ql-script[value="sub"]', title: '下标' },
    42. { Choice: '.ql-script[value="super"]', title: '上标' },
    43. { Choice: '.ql-indent[value="-1"]', title: '向左缩进' },
    44. { Choice: '.ql-indent[value="+1"]', title: '向右缩进' },
    45. { Choice: '.ql-header .ql-picker-label', title: '标题大小' },
    46. { Choice: '.ql-header .ql-picker-item[data-value="1"]', title: '标题一' },
    47. { Choice: '.ql-header .ql-picker-item[data-value="2"]', title: '标题二' },
    48. { Choice: '.ql-header .ql-picker-item[data-value="3"]', title: '标题三' },
    49. { Choice: '.ql-header .ql-picker-item[data-value="4"]', title: '标题四' },
    50. { Choice: '.ql-header .ql-picker-item[data-value="5"]', title: '标题五' },
    51. { Choice: '.ql-header .ql-picker-item[data-value="6"]', title: '标题六' },
    52. { Choice: '.ql-header .ql-picker-item:last-child', title: '标准' },
    53. { Choice: '.ql-size .ql-picker-item[data-value="small"]', title: '小号' },
    54. { Choice: '.ql-size .ql-picker-item[data-value="large"]', title: '大号' },
    55. { Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: '超大号' },
    56. { Choice: '.ql-size .ql-picker-item:nth-child(2)', title: '标准' },
    57. { Choice: '.ql-align .ql-picker-item:first-child', title: '居左对齐' },
    58. { Choice: '.ql-align .ql-picker-item[data-value="center"]', title: '居中对齐' },
    59. { Choice: '.ql-align .ql-picker-item[data-value="right"]', title: '居右对齐' },
    60. { Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: '两端对齐' }
    61. ];

    2.3 使用

    html代码

    1. <quill-editor
    2. v-model="content"
    3. ref="myQuillEditor"
    4. :options="editorOption"
    5. @blur="onEditorBlur($event)"
    6. @focus="onEditorFocus($event)"
    7. @change="onEditorChange($event)"
    8. @ready="onEditorReady($event)">
    9. </quill-editor>

    js事件代码

    1. data(){
    2. return{
    3. editorOption:_EditorOption_,
    4. content:'我是富文本内容',
    5. }
    6. },
    7. methods:{
    8. // 失去焦点事件
    9. onEditorBlur(quill) {
    10. console.log('editor blur!', quill)
    11. },
    12. // 获得焦点事件
    13. onEditorFocus(quill) {
    14. console.log('editor focus!', quill)
    15. },
    16. // 准备富文本编辑器
    17. onEditorReady(quill) {
    18. console.log('editor ready!', quill)
    19. },
    20. // 内容改变事件
    21. onEditorChange({ quill, html, text }) {
    22. console.log('editor change!', quill, html, text)
    23. this.content = html
    24. },
    25. }

    到这里,你的富文本编辑器就可以正常显示了


    三、配置option

    3.1 编辑器头部功能菜单配置

    1. // 富文本编辑器配置
    2. editorOption: {
    3. modules: {
    4. toolbar: [
    5. ['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线
    6. ['blockquote', 'code-block'], // 引用 代码块
    7. [{ header: 1 }, { header: 2 }], // 1、2 级标题
    8. [{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表
    9. [{ script: 'sub' }, { script: 'super' }], // 上标/下标
    10. [{ indent: '-1' }, { indent: '+1' }], // 缩进
    11. [{ direction: 'rtl' }], // 文本方向
    12. [{ size: ['12', '14', '16', '18', '20', '22', '24', '28', '32', '36'] }], // 字体大小
    13. [{ header: [1, 2, 3, 4, 5, 6] }], // 标题
    14. [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
    15. // [{ font: ['songti'] }], // 字体种类
    16. [{ align: [] }], // 对齐方式
    17. ['clean'], // 清除文本格式
    18. ['image', 'video'] // 链接、图片、视频
    19. ]
    20. },
    21. placeholder: '请输入正文'
    22. },

     这里的size和header经过了处理,如图:换成了自定义内容,例如,修改字号,方法如下:

     3.2 修改quill.js

    1.找到node_modules里的quill/dist/quill.js

    2.在文件中搜索small,快速找到,然后修改成你想要的数据,这里简单,直接贴图

    3.3修改quill.snow.css

    修改完js之后,需要修改一下css文件 ,这样你设置的才生效,在同级目录下找到quill.snow.css文件,同样搜索small所在的位置,仿照着改就行,主要是这两处

     

     可以把原先的注释掉,也可以保留,影响不大,相当于你设置另一套css

    1. // 这个是字号数字对应的显示的内容,vertical-align根据个人需要加不加,因为我页面那个字与其他对不齐
    2. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12"]::before,
    3. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12"]::before {
    4. content: '12px';
    5. vertical-align: top;
    6. }
    7. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14"]::before,
    8. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14"]::before {
    9. content: '14px';
    10. vertical-align: top;
    11. }
    12. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16"]::before,
    13. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16"]::before {
    14. content: '16px';
    15. vertical-align: top;
    16. }
    17. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18"]::before,
    18. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18"]::before {
    19. content: '18px';
    20. vertical-align: top;
    21. }
    22. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20"]::before,
    23. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20"]::before {
    24. content: '20px';
    25. vertical-align: top;
    26. }
    27. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22"]::before,
    28. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22"]::before {
    29. content: '22px';
    30. vertical-align: top;
    31. }
    32. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="24"]::before,
    33. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24"]::before {
    34. content: '24px';
    35. vertical-align: top;
    36. }
    37. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28"]::before,
    38. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28"]::before {
    39. content: '28px';
    40. vertical-align: top;
    41. }
    42. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32"]::before,
    43. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32"]::before {
    44. content: '32px';
    45. vertical-align: top;
    46. }
    47. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="36"]::before,
    48. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36"]::before {
    49. content: '36px';
    50. vertical-align: top;
    51. }
    52. // 这个是字号数字对应的px值
    53. .ql-editor .ql-size-12 {
    54. font-size: 12px;
    55. }
    56. .ql-editor .ql-size-14 {
    57. font-size: 14px;
    58. }
    59. .ql-editor .ql-size-16 {
    60. font-size: 16px;
    61. }
    62. .ql-editor .ql-size-18 {
    63. font-size: 18px;
    64. }
    65. .ql-editor .ql-size-20 {
    66. font-size: 20px;
    67. }
    68. .ql-editor .ql-size-22 {
    69. font-size: 22px;
    70. }
    71. .ql-editor .ql-size-24 {
    72. font-size: 24px;
    73. }
    74. .ql-editor .ql-size-28 {
    75. font-size: 28px;
    76. }
    77. .ql-editor .ql-size-32 {
    78. font-size: 32px;
    79. }
    80. .ql-editor .ql-size-36 {
    81. font-size: 36px;
    82. }
    83. // 选择字号富文本字的大小
    84. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12"]::before {
    85. font-size: 12px;
    86. }
    87. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14"]::before {
    88. font-size: 14px;
    89. }
    90. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16"]::before {
    91. font-size: 16px;
    92. }
    93. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18"]::before {
    94. font-size: 18px;
    95. }
    96. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20"]::before {
    97. font-size: 20px;
    98. }
    99. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22"]::before {
    100. font-size: 22px;
    101. }
    102. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24"]::before {
    103. font-size: 24px;
    104. }
    105. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28"]::before {
    106. font-size: 28px;
    107. }
    108. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32"]::before {
    109. font-size: 32px;
    110. }
    111. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36"]::before {
    112. font-size: 36px;
    113. }

     富文本里面的下拉框默认是不滚动的,想要滚动效果,加上下面的css

    1. /*加上height和滚动属性就可以,滚动条样式是系统默认样式,可能不同*/
    2. .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
    3. border-color: #ccc;
    4. height: 125px;
    5. overflow: auto;
    6. }

    四、给工具栏鼠标悬停加上中文释义

      找到元素可以看到,每一个tool都有一个class, 这个的原理就是先把所有的class列出来,然后根据class获取元素,给它加上title属性就可以了

     

     先定义一个数组,把所有的工具放在里面

    1. // toolbar标题
    2. const titleConfig = [
    3. { Choice: '.ql-insertMetric', title: '跳转配置' },
    4. { Choice: '.ql-bold', title: '加粗' },
    5. { Choice: '.ql-italic', title: '斜体' },
    6. { Choice: '.ql-underline', title: '下划线' },
    7. { Choice: '.ql-header', title: '段落格式' },
    8. { Choice: '.ql-strike', title: '删除线' },
    9. { Choice: '.ql-blockquote', title: '块引用' },
    10. { Choice: '.ql-code', title: '插入代码' },
    11. { Choice: '.ql-code-block', title: '插入代码段' },
    12. { Choice: '.ql-font', title: '字体' },
    13. { Choice: '.ql-size', title: '字体大小' },
    14. { Choice: '.ql-list[value="ordered"]', title: '编号列表' },
    15. { Choice: '.ql-list[value="bullet"]', title: '项目列表' },
    16. { Choice: '.ql-direction', title: '文本方向' },
    17. { Choice: '.ql-header[value="1"]', title: 'h1' },
    18. { Choice: '.ql-header[value="2"]', title: 'h2' },
    19. { Choice: '.ql-align', title: '对齐方式' },
    20. { Choice: '.ql-color', title: '字体颜色' },
    21. { Choice: '.ql-background', title: '背景颜色' },
    22. { Choice: '.ql-image', title: '图像' },
    23. { Choice: '.ql-video', title: '视频' },
    24. { Choice: '.ql-link', title: '添加链接' },
    25. { Choice: '.ql-formula', title: '插入公式' },
    26. { Choice: '.ql-clean', title: '清除字体格式' },
    27. { Choice: '.ql-script[value="sub"]', title: '下标' },
    28. { Choice: '.ql-script[value="super"]', title: '上标' },
    29. { Choice: '.ql-indent[value="-1"]', title: '向左缩进' },
    30. { Choice: '.ql-indent[value="+1"]', title: '向右缩进' },
    31. { Choice: '.ql-header .ql-picker-label', title: '标题大小' },
    32. { Choice: '.ql-header .ql-picker-item[data-value="1"]', title: '标题一' },
    33. { Choice: '.ql-header .ql-picker-item[data-value="2"]', title: '标题二' },
    34. { Choice: '.ql-header .ql-picker-item[data-value="3"]', title: '标题三' },
    35. { Choice: '.ql-header .ql-picker-item[data-value="4"]', title: '标题四' },
    36. { Choice: '.ql-header .ql-picker-item[data-value="5"]', title: '标题五' },
    37. { Choice: '.ql-header .ql-picker-item[data-value="6"]', title: '标题六' },
    38. { Choice: '.ql-header .ql-picker-item:last-child', title: '标准' },
    39. { Choice: '.ql-size .ql-picker-item[data-value="small"]', title: '小号' },
    40. { Choice: '.ql-size .ql-picker-item[data-value="large"]', title: '大号' },
    41. { Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: '超大号' },
    42. { Choice: '.ql-size .ql-picker-item:nth-child(2)', title: '标准' },
    43. { Choice: '.ql-align .ql-picker-item:first-child', title: '居左对齐' },
    44. { Choice: '.ql-align .ql-picker-item[data-value="center"]', title: '居中对齐' },
    45. { Choice: '.ql-align .ql-picker-item[data-value="right"]', title: '居右对齐' },
    46. { Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: '两端对齐' }
    47. ]

     然后在function中循环,找到元素,添加title,至于放在那个function根据具体情况看,反正得是在页面上已经渲染好元素之后,不然会获取不到元素,可以直接放在@ready的函数里面

    1. for (let item of titleConfig) {
    2. let tip = document.querySelector('.quill-editor ' + item.Choice)
    3. if (!tip) continue
    4. tip.setAttribute('title', item.title)
    5. }

    至此,一个富文本编辑器,基本可以使用,并且还把英文转成了中文


    五,图片上传

    vue-quill-editor富文本编辑器上传图片默认为base64,存入数据库过于过于庞大,使用quill-image-extend-module+vue-quill-editor实现图片地址上传。

    这里列举的例子思路很简单就是:劫持原来的图片上传事件,然后上传到服务器,服务器返回一个图片链接,我再给插进去。

    5.1图片上传方案一(适合页面只有一个富文本编辑器)

    html

    1. <input
    2. type="file"
    3. ref="uploadInput"
    4. @change="EditorUpload"
    5. class="uploadImgEditor"
    6. name=""
    7. hidden
    8. id=""
    9. />
    10. <quill-editor
    11. class="editor"
    12. v-model="content"
    13. :options="editorOption"
    14. ref="myTextEditor"
    15. @blur="onEditorBlur($event)"
    16. @focus="onEditorFocus($event)"
    17. @ready="onEditorReady($event)"
    18. @change="onEditorChange($event)"
    19. >
    20. </quill-editor>

    js

    这里的“editorOption”配置和上面的配置是有差别的

    注意“toolbar”里面的“container”和“handlers”

    1. data(){
    2. return{
    3. editorOption:_EditorOption_,
    4. content:'我是富文本内容',
    5. }
    6. },
    7. computed: {
    8. editor() {
    9. return this.$refs.myTextEditor.quillEditor;
    10. },
    11. },
    12. created() {
    13. this.editorOption = {
    14. modules: {
    15. toolbar: {
    16. container: [
    17. ["bold", "italic", "underline", "strike"], // toggled buttons
    18. ["blockquote", "code-block"],
    19. [{ header: 1 }, { header: 2 }], // custom button values
    20. [{ list: "ordered" }, { list: "bullet" }],
    21. [{ script: "sub" }, { script: "super" }], // superscript/subscript
    22. [{ indent: "-1" }, { indent: "+1" }], // outdent/indent
    23. [{ direction: "rtl" }], // text direction
    24. [{ size: ["small", false, "large", "huge"] }], // custom dropdown
    25. [{ header: [1, 2, 3, 4, 5, 6, false] }],
    26. [{ color: [] }, { background: [] }], // dropdown with defaults from theme
    27. [{ font: [] }],
    28. [{ align: [] }],
    29. // ['link', 'image', 'video'],
    30. ["image"],
    31. ["clean"], // remove formatting button
    32. ], // 工具栏
    33. handlers: {
    34. image: function (value) {
    35. if (value) {
    36. document.querySelector(".uploadImgEditor").click();
    37. } else {
    38. this.quill.format("image", false);
    39. }
    40. },
    41. },
    42. },
    43. },
    44. placeholder: "请输入文章内容(必填项)", //提示
    45. readyOnly: false, //是否只读
    46. theme: "snow", //主题 snow/bubble
    47. syntax: true, //语法检测
    48. };
    49. },
    50. methods:{
    51. //富文本-点击图片上传事件
    52. EditorUpload() {
    53. var file = this.$refs.uploadInput.files[0];
    54. var fd = new FormData();
    55. fd.append("file", file);
    56. this.uploadLogo(fd, file);
    57. },
    58. //富文本-图片上传请求
    59. uploadLogo(dt, file) {
    60. var that = this;
    61. let param = new FormData(); //创建form对象
    62. param.append("file", file); //通过append向form对象添加数据
    63. let config = {
    64. headers: { "Content-Type": "multipart/form-data" },
    65. }; //添加请求头
    66. that.$axios
    67. .post(
    68. "http://www.xxx.xxx/ImgUpload",
    69. param,
    70. config
    71. )
    72. .then((res) => {
    73. //上传成功后的业务处理
    74. let quill = this.$refs.myTextEditor.quill;//获取富文本编辑器dom对象
    75. let length = quill.getSelection().index;//光标位置
    76. let imgUrl='http://www.xxx.xxx' + res.imgUrl;// 拼接图片地址
    77. quill.insertEmbed(length, "image", imgUrl); // 插入图片 图片地址
    78. quill.setSelection(length + 1);// 调整光标到最后
    79. //上传成功后的业务处理 end
    80. });
    81. },
    82. //富文本-失去焦点事件
    83. onEditorBlur(quill) {
    84. console.log('editor blur!', quill)
    85. },
    86. //富文本-获得焦点事件
    87. onEditorFocus(quill) {
    88. console.log('editor focus!', quill)
    89. },
    90. //富文本-准备富文本编辑器
    91. onEditorReady(quill) {
    92. console.log('editor ready!', quill)
    93. },
    94. //富文本-内容改变事件
    95. onEditorChange({ quill, html, text }) {
    96. console.log('editor change!', quill, html, text)
    97. this.content = html
    98. },
    99. }

    5.2图片上传方案二(适合页面有多个富文本编辑器)

    页面有多个富文本编辑器时 图片上传的方法

    效果

    html代码

    1. <!-- 活动介绍: -->
    2. <p><span class="red">*</span>活动介绍:</p>
    3. <br/>
    4. <p>
    5. <quill-editor
    6. class="editor"
    7. id="QuillEditor_Intro"
    8. ref="QuillEditor_Intro"
    9. v-model="form.Intro"
    10. :options="editorOption"
    11. @blur="onEditorBlur($event)"
    12. @focus="onEditorFocus($event)"
    13. @ready="onEditorReady($event)"
    14. @change="onEditorChange($event)"
    15. >
    16. </quill-editor>
    17. </p>
    18. <br/><br/>
    19. <!-- 场馆介绍: -->
    20. <p><span class="red">*</span>场馆介绍:</p>
    21. <br/>
    22. <p>
    23. <quill-editor
    24. class="editor"
    25. id="QuillEditor_SceneIntro"
    26. ref="QuillEditor_SceneIntro"
    27. v-model="form.SceneIntro"
    28. :options="editorOption"
    29. @blur="onEditorBlur($event)"
    30. @focus="onEditorFocus($event)"
    31. @ready="onEditorReady($event)"
    32. @change="onEditorChange($event)"
    33. >
    34. </quill-editor>
    35. </p>
    36. <br/><br/>
    37. <!-- 用户须知: -->
    38. <p><span class="red">*</span>用户须知:</p>
    39. <br/>
    40. <p>
    41. <quill-editor
    42. class="editor"
    43. id="QuillEditor_UserNotice"
    44. ref="QuillEditor_UserNotice"
    45. v-model="form.UserNotice"
    46. :options="editorOption"
    47. @blur="onEditorBlur($event)"
    48. @focus="onEditorFocus($event)"
    49. @ready="onEditorReady($event)"
    50. @change="onEditorChange($event)"
    51. >
    52. </quill-editor>
    53. </p>
    54. <br/><br/>
    55. <!-- 活动流程\日程: -->
    56. <p><span class="red">*</span>活动流程\日程:</p>
    57. <br/>
    58. <p>
    59. <quill-editor
    60. class="editor"
    61. id="QuillEditor_Process"
    62. ref="QuillEditor_Process"
    63. v-model="form.Process"
    64. :options="editorOption"
    65. @blur="onEditorBlur($event)"
    66. @focus="onEditorFocus($event)"
    67. @ready="onEditorReady($event)"
    68. @change="onEditorChange($event)"
    69. >
    70. </quill-editor>
    71. </p>

    vue-quill-editor图片上传源码解读

    quill.js文件路径:\node_modules\quill\dist

    代码在quill.js的“6844”--“6882”行

    源码截图

    源码

    1. BaseTheme.DEFAULTS = (0, _extend2.default)(true, {}, _theme2.default.DEFAULTS, {
    2. modules: {
    3. toolbar: {
    4. handlers: {
    5. formula: function formula() {
    6. this.quill.theme.tooltip.edit('formula');
    7. },
    8. image: function image() {
    9. var _this3 = this;
    10. var fileInput = this.container.querySelector('input.ql-image[type=file]');
    11. if (fileInput == null) {
    12. fileInput = document.createElement('input');
    13. fileInput.setAttribute('type', 'file');
    14. fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');
    15. fileInput.classList.add('ql-image');
    16. fileInput.addEventListener('change', function () {
    17. if (fileInput.files != null && fileInput.files[0] != null) {
    18. var reader = new FileReader();
    19. reader.onload = function (e) {
    20. var range = _this3.quill.getSelection(true);
    21. _this3.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert({ image: e.target.result }), _emitter2.default.sources.USER);
    22. _this3.quill.setSelection(range.index + 1, _emitter2.default.sources.SILENT);
    23. fileInput.value = "";
    24. };
    25. reader.readAsDataURL(fileInput.files[0]);
    26. }
    27. });
    28. this.container.appendChild(fileInput);
    29. }
    30. fileInput.click();
    31. },
    32. video: function video() {
    33. this.quill.theme.tooltip.edit('video');
    34. }
    35. }
    36. }
    37. }
    38. });

    这段代码的意思是,当你点击了顶部工具栏的图片按钮,

    判断页面是否存在一个叫【input.ql-image[type=file]】的文件上传控件

    如果不存在则创建一个,如果存在则触发点击事件

    生成代码大致如下:

     <input type="file"  @change="function(){}" class="ql-image"/>

    通过源码我们可以修改我们的代码如下

    js代码

    1. <script>
    2. // 工具栏配置
    3. var _EditorOption_=function(page_this){return {
    4. modules: {
    5. toolbar: {
    6. container:[
    7. ['bold', 'italic', 'underline'], // 加粗 斜体 下划线 删除线
    8. [{ size: [12,14,16] }], // 字体大小
    9. [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
    10. [{ align: [] }], // 对齐方式
    11. ['clean'], // 清除文本格式
    12. // ['link','image'] // 链接、图片、视频
    13. ['link','image'] // 链接、图片、视频
    14. ],
    15. handlers:{
    16. image:function(value){
    17. console.log(value);
    18. if(value)
    19. {
    20. console.log(this);//此时this是头部工具栏当前对象
    21. var parentIdStr=this.container.parentElement.id;//获取容器quill-editor标签的id
    22. var fileInput = this.container.querySelector('input.ql-image[type=file]');
    23. if (fileInput == null) {
    24. fileInput = document.createElement('input');
    25. fileInput.setAttribute('type', 'file');
    26. fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');
    27. fileInput.classList.add('ql-image');
    28. fileInput.addEventListener('change', function(){
    29. var files=fileInput.files;//获取文件
    30. page_this.QuillEditorImgUpload(parentIdStr,files);//调取当前页面富文本图片上传的方法
    31. });
    32. this.container.appendChild(fileInput);
    33. }
    34. fileInput.click();
    35. }
    36. else
    37. {
    38. this.quill.format('image', false)
    39. }
    40. }
    41. }
    42. }
    43. },
    44. placeholder: '请输入正文'
    45. }; };
    46. export default {
    47. data(){
    48. return {
    49. editorOption:_EditorOption_(this),//富文本配置
    50. form:{
    51. Intro:'',//活动介绍
    52. SceneIntro:'',//场馆介绍
    53. UserNotice:'',//用户须知
    54. Process:'',//活动流程\日程
    55. }
    56. }},
    57. created(){},
    58. methods:{
    59. // 富文本-失去焦点事件
    60. onEditorBlur(quill) {
    61. // //console.log("失去焦点事件");
    62. // //console.log('editor blur!', quill)
    63. // //console.log(this.form);
    64. },
    65. // 富文本-获得焦点事件
    66. onEditorFocus(quill) {
    67. // //console.log("获得焦点事件");
    68. // //console.log('editor focus!', quill)
    69. },
    70. // 富文本-准备富文本编辑器
    71. onEditorReady(quill) {
    72. // //console.log("准备富文本编辑器");
    73. // //console.log('editor ready!', quill)
    74. },
    75. //富文本- 内容改变事件
    76. onEditorChange({ quill, html, text }) {
    77. // console.log("内容改变事件");
    78. // // console.log('editor change!', quill, html, text)
    79. // console.log(quill)
    80. // console.log("内容改变事件22222222");
    81. // console.log(html)
    82. // console.log("内容改变事件3333333333");
    83. // console.log(text)
    84. },
    85. //富文本- 图片上传
    86. QuillEditorImgUpload(domId,files) {
    87. var that=this;
    88. console.log('富文本文件上传')
    89. console.log(domId);
    90. console.log(files);
    91. var formData = new FormData();
    92. formData.append("file",files[0]);
    93. formData.append("filename", files[0].name);
    94. // 此时可以自行将文件上传至服务器
    95. that.$axios.post("/api/ImgUpload",formData).then((res) => {
    96. console.log(res);
    97. if(res.code==10000 )
    98. {
    99. let imageUrl='http://www.xxx.xxx' + res.imgUrl;//拼接图片地址
    100. let quill = '';//获取富文本编辑器dom对象
    101. switch (domId) {
    102. case 'QuillEditor_Intro'://活动介绍
    103. quill=this.$refs.QuillEditor_Intro.quill;
    104. break;
    105. case 'QuillEditor_SceneIntro'://场馆介绍
    106. quill=this.$refs.QuillEditor_SceneIntro.quill;
    107. break;
    108. case 'QuillEditor_UserNotice'://用户须知
    109. quill=this.$refs.QuillEditor_UserNotice.quill;
    110. break;
    111. case 'QuillEditor_Process'://活动流程\日程
    112. quill=this.$refs.QuillEditor_Process.quill;
    113. break;
    114. default:
    115. break;
    116. }
    117. let length = quill.getSelection().index;// 获取光标所在位置
    118. quill.insertEmbed(length, 'image', imageUrl)// 插入图片
    119. quill.setSelection(length + 1);// 调整光标到最后
    120. }
    121. else{
    122. that.alertFun(res.msg);
    123. }
    124. });
    125. },
    126. },
    127. }
    128. </script>

  • 相关阅读:
    MySQL之主从复制及读写分离
    vue项目优化
    C认证笔记 - 计算机通识 - IP基础
    TypeScript核心篇——类(class)-可选参数-存取器-构造函数-静态属性方法-抽象类
    python去除pdf中水印
    vue核心面试题汇总【查缺补漏】
    Blender色彩管理的关键概念和使用方法
    day32-线程基础02
    Java课程设计——图书管理系统
    DIXml v5.21.0 for Delphi 11
  • 原文地址:https://blog.csdn.net/cplvfx/article/details/125557966