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

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

时间:2022-12-12 21:36:53浏览次数:58  
标签:picker 文本编辑 title value Choice 上传 ql quill 图片


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

 


一、效果

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

二、安装

2.1脚手架安装

命令

npm install vue-quill-editor -S

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

import { quillEditor } from 'vue-quill-editor'

import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'

export default {
components: {
quillEditor
}
}

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

import VueQuillEditor from 'vue-quill-editor'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'



Vue.use(VueQuillEditor);

 2.2引入安装


引入文件

<script src="/js/common/vue.min2.6.14.js"></script>
<script src="/js/common/element-ui2.15.7.js"></script>


<link rel="stylesheet" href="/js/common/vue-quill-editor/quilljs1.3.6/quill.core.css"/>
<link rel="stylesheet" href="/js/common/vue-quill-editor/quilljs1.3.6/quill.snow.css"/>
<link rel="stylesheet" href="/js/common/vue-quill-editor/quilljs1.3.6/quill.bubble.css"/>
<script src="/js/common/vue-quill-editor/quilljs1.3.6/quill.js"></script>
<script src="/js/common/vue-quill-editor/vue-quill-editor.js"></script>
<script src="/js/common/vue-quill-editor/vue-quill-editor-Config.js"></script>
<style>
.ql-container.ql-snow{
min-height: 120px; //初始化富文本高度
}
</style>

 引入到项目,初始化

Vue.use(window.VueQuillEditor);

 vue-quill-editor-Config.js代码

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

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

var _EditorOption_={
modules: {
toolbar: [
['bold', 'italic', 'underline'], // 加粗 斜体 下划线 删除线
[{ size: [12, 14,16] }], // 字体大小
[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
[{ align: [] }], // 对齐方式
['clean'], // 清除文本格式
// ['link','image'] // 链接、图片、视频
['link'] // 链接、图片、视频
]
},
placeholder: '请输入正文'
};
// toolbar标题
const titleConfig = [
{ Choice: '.ql-insertMetric', title: '跳转配置' },
{ Choice: '.ql-bold', title: '加粗' },
{ Choice: '.ql-italic', title: '斜体' },
{ Choice: '.ql-underline', title: '下划线' },
{ Choice: '.ql-header', title: '段落格式' },
{ Choice: '.ql-strike', title: '删除线' },
{ Choice: '.ql-blockquote', title: '块引用' },
{ Choice: '.ql-code', title: '插入代码' },
{ Choice: '.ql-code-block', title: '插入代码段' },
{ Choice: '.ql-font', title: '字体' },
{ Choice: '.ql-size', title: '字体大小' },
{ Choice: '.ql-list[value="ordered"]', title: '编号列表' },
{ Choice: '.ql-list[value="bullet"]', title: '项目列表' },
{ Choice: '.ql-direction', title: '文本方向' },
{ Choice: '.ql-header[value="1"]', title: 'h1' },
{ Choice: '.ql-header[value="2"]', title: 'h2' },
{ Choice: '.ql-align', title: '对齐方式' },
{ Choice: '.ql-color', title: '字体颜色' },
{ Choice: '.ql-background', title: '背景颜色' },
{ Choice: '.ql-image', title: '图像' },
{ Choice: '.ql-video', title: '视频' },
{ Choice: '.ql-link', title: '添加链接' },
{ Choice: '.ql-formula', title: '插入公式' },
{ Choice: '.ql-clean', title: '清除字体格式' },
{ Choice: '.ql-script[value="sub"]', title: '下标' },
{ Choice: '.ql-script[value="super"]', title: '上标' },
{ Choice: '.ql-indent[value="-1"]', title: '向左缩进' },
{ Choice: '.ql-indent[value="+1"]', title: '向右缩进' },
{ Choice: '.ql-header .ql-picker-label', title: '标题大小' },
{ Choice: '.ql-header .ql-picker-item[data-value="1"]', title: '标题一' },
{ Choice: '.ql-header .ql-picker-item[data-value="2"]', title: '标题二' },
{ Choice: '.ql-header .ql-picker-item[data-value="3"]', title: '标题三' },
{ Choice: '.ql-header .ql-picker-item[data-value="4"]', title: '标题四' },
{ Choice: '.ql-header .ql-picker-item[data-value="5"]', title: '标题五' },
{ Choice: '.ql-header .ql-picker-item[data-value="6"]', title: '标题六' },
{ Choice: '.ql-header .ql-picker-item:last-child', title: '标准' },
{ Choice: '.ql-size .ql-picker-item[data-value="small"]', title: '小号' },
{ Choice: '.ql-size .ql-picker-item[data-value="large"]', title: '大号' },
{ Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: '超大号' },
{ Choice: '.ql-size .ql-picker-item:nth-child(2)', title: '标准' },
{ Choice: '.ql-align .ql-picker-item:first-child', title: '居左对齐' },
{ Choice: '.ql-align .ql-picker-item[data-value="center"]', title: '居中对齐' },
{ Choice: '.ql-align .ql-picker-item[data-value="right"]', title: '居右对齐' },
{ Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: '两端对齐' }
];

2.3 使用

html代码

<quill-editor
v-model="content"
ref="myQuillEditor"
:options="editorOption"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@change="onEditorChange($event)"
@ready="onEditorReady($event)">
</quill-editor>

js事件代码

data(){
return{
editorOption:_EditorOption_,
content:'我是富文本内容',

}
},
methods:{
// 失去焦点事件
onEditorBlur(quill) {
console.log('editor blur!', quill)
},
// 获得焦点事件
onEditorFocus(quill) {
console.log('editor focus!', quill)
},
// 准备富文本编辑器
onEditorReady(quill) {
console.log('editor ready!', quill)
},
// 内容改变事件
onEditorChange({ quill, html, text }) {
console.log('editor change!', quill, html, text)
this.content = html
},
}

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


三、配置option

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

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

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

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

 3.2 修改quill.js

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

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

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

3.3修改quill.snow.css

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

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

 

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

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

// 这个是字号数字对应的显示的内容,vertical-align根据个人需要加不加,因为我页面那个字与其他对不齐
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12"]::before {
content: '12px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14"]::before {
content: '14px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16"]::before {
content: '16px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18"]::before {
content: '18px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20"]::before {
content: '20px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22"]::before {
content: '22px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="24"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24"]::before {
content: '24px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28"]::before {
content: '28px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32"]::before {
content: '32px';
vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="36"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36"]::before {
content: '36px';
vertical-align: top;
}



// 这个是字号数字对应的px值
.ql-editor .ql-size-12 {
font-size: 12px;
}
.ql-editor .ql-size-14 {
font-size: 14px;
}
.ql-editor .ql-size-16 {
font-size: 16px;
}
.ql-editor .ql-size-18 {
font-size: 18px;
}
.ql-editor .ql-size-20 {
font-size: 20px;
}
.ql-editor .ql-size-22 {
font-size: 22px;
}
.ql-editor .ql-size-24 {
font-size: 24px;
}
.ql-editor .ql-size-28 {
font-size: 28px;
}
.ql-editor .ql-size-32 {
font-size: 32px;
}
.ql-editor .ql-size-36 {
font-size: 36px;
}

// 选择字号富文本字的大小
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12"]::before {
font-size: 12px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14"]::before {
font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16"]::before {
font-size: 16px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18"]::before {
font-size: 18px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20"]::before {
font-size: 20px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22"]::before {
font-size: 22px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24"]::before {
font-size: 24px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28"]::before {
font-size: 28px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32"]::before {
font-size: 32px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36"]::before {
font-size: 36px;
}

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

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

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

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

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

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

 

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

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

// toolbar标题
const titleConfig = [
{ Choice: '.ql-insertMetric', title: '跳转配置' },
{ Choice: '.ql-bold', title: '加粗' },
{ Choice: '.ql-italic', title: '斜体' },
{ Choice: '.ql-underline', title: '下划线' },
{ Choice: '.ql-header', title: '段落格式' },
{ Choice: '.ql-strike', title: '删除线' },
{ Choice: '.ql-blockquote', title: '块引用' },
{ Choice: '.ql-code', title: '插入代码' },
{ Choice: '.ql-code-block', title: '插入代码段' },
{ Choice: '.ql-font', title: '字体' },
{ Choice: '.ql-size', title: '字体大小' },
{ Choice: '.ql-list[value="ordered"]', title: '编号列表' },
{ Choice: '.ql-list[value="bullet"]', title: '项目列表' },
{ Choice: '.ql-direction', title: '文本方向' },
{ Choice: '.ql-header[value="1"]', title: 'h1' },
{ Choice: '.ql-header[value="2"]', title: 'h2' },
{ Choice: '.ql-align', title: '对齐方式' },
{ Choice: '.ql-color', title: '字体颜色' },
{ Choice: '.ql-background', title: '背景颜色' },
{ Choice: '.ql-image', title: '图像' },
{ Choice: '.ql-video', title: '视频' },
{ Choice: '.ql-link', title: '添加链接' },
{ Choice: '.ql-formula', title: '插入公式' },
{ Choice: '.ql-clean', title: '清除字体格式' },
{ Choice: '.ql-script[value="sub"]', title: '下标' },
{ Choice: '.ql-script[value="super"]', title: '上标' },
{ Choice: '.ql-indent[value="-1"]', title: '向左缩进' },
{ Choice: '.ql-indent[value="+1"]', title: '向右缩进' },
{ Choice: '.ql-header .ql-picker-label', title: '标题大小' },
{ Choice: '.ql-header .ql-picker-item[data-value="1"]', title: '标题一' },
{ Choice: '.ql-header .ql-picker-item[data-value="2"]', title: '标题二' },
{ Choice: '.ql-header .ql-picker-item[data-value="3"]', title: '标题三' },
{ Choice: '.ql-header .ql-picker-item[data-value="4"]', title: '标题四' },
{ Choice: '.ql-header .ql-picker-item[data-value="5"]', title: '标题五' },
{ Choice: '.ql-header .ql-picker-item[data-value="6"]', title: '标题六' },
{ Choice: '.ql-header .ql-picker-item:last-child', title: '标准' },
{ Choice: '.ql-size .ql-picker-item[data-value="small"]', title: '小号' },
{ Choice: '.ql-size .ql-picker-item[data-value="large"]', title: '大号' },
{ Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: '超大号' },
{ Choice: '.ql-size .ql-picker-item:nth-child(2)', title: '标准' },
{ Choice: '.ql-align .ql-picker-item:first-child', title: '居左对齐' },
{ Choice: '.ql-align .ql-picker-item[data-value="center"]', title: '居中对齐' },
{ Choice: '.ql-align .ql-picker-item[data-value="right"]', title: '居右对齐' },
{ Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: '两端对齐' }
]

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

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

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


五,图片上传

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

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

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

html

<input
type="file"
ref="uploadInput"
@change="EditorUpload"
class="uploadImgEditor"
name=""
hidden
id=""
/>
<quill-editor
class="editor"
v-model="content"
:options="editorOption"
ref="myTextEditor"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@ready="onEditorReady($event)"
@change="onEditorChange($event)"
>
</quill-editor>

js

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

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

data(){
return{
editorOption:_EditorOption_,
content:'我是富文本内容',

}
},
computed: {
editor() {
return this.$refs.myTextEditor.quillEditor;
},
},
created() {
this.editorOption = {
modules: {
toolbar: {
container: [
["bold", "italic", "underline", "strike"], // toggled buttons
["blockquote", "code-block"],
[{ header: 1 }, { header: 2 }], // custom button values
[{ list: "ordered" }, { list: "bullet" }],
[{ script: "sub" }, { script: "super" }], // superscript/subscript
[{ indent: "-1" }, { indent: "+1" }], // outdent/indent
[{ direction: "rtl" }], // text direction
[{ size: ["small", false, "large", "huge"] }], // custom dropdown
[{ header: [1, 2, 3, 4, 5, 6, false] }],
[{ color: [] }, { background: [] }], // dropdown with defaults from theme
[{ font: [] }],
[{ align: [] }],
// ['link', 'image', 'video'],
["image"],
["clean"], // remove formatting button
], // 工具栏
handlers: {
image: function (value) {
if (value) {
document.querySelector(".uploadImgEditor").click();
} else {
this.quill.format("image", false);
}
},
},
},
},
placeholder: "请输入文章内容(必填项)", //提示
readyOnly: false, //是否只读
theme: "snow", //主题 snow/bubble
syntax: true, //语法检测
};
},
methods:{
//富文本-点击图片上传事件
EditorUpload() {
var file = this.$refs.uploadInput.files[0];
var fd = new FormData();
fd.append("file", file);
this.uploadLogo(fd, file);
},
//富文本-图片上传请求
uploadLogo(dt, file) {
var that = this;
let param = new FormData(); //创建form对象
param.append("file", file); //通过append向form对象添加数据
let config = {
headers: { "Content-Type": "multipart/form-data" },
}; //添加请求头
that.$axios
.post(
"http://www.xxx.xxx/ImgUpload",
param,
config
)
.then((res) => {
//上传成功后的业务处理
let quill = this.$refs.myTextEditor.quill;//获取富文本编辑器dom对象
let length = quill.getSelection().index;//光标位置
let imgUrl='http://www.xxx.xxx' + res.imgUrl;// 拼接图片地址
quill.insertEmbed(length, "image", imgUrl); // 插入图片 图片地址
quill.setSelection(length + 1);// 调整光标到最后
//上传成功后的业务处理 end
});
},
//富文本-失去焦点事件
onEditorBlur(quill) {
console.log('editor blur!', quill)
},
//富文本-获得焦点事件
onEditorFocus(quill) {
console.log('editor focus!', quill)
},
//富文本-准备富文本编辑器
onEditorReady(quill) {
console.log('editor ready!', quill)
},
//富文本-内容改变事件
onEditorChange({ quill, html, text }) {
console.log('editor change!', quill, html, text)
this.content = html
},
}

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

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

效果

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

html代码

<!-- 活动介绍: -->
<p><span class="red">*</span>活动介绍:</p>
<br/>
<p>
<quill-editor
class="editor"
id="QuillEditor_Intro"
ref="QuillEditor_Intro"
v-model="form.Intro"
:options="editorOption"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@ready="onEditorReady($event)"
@change="onEditorChange($event)"
>
</quill-editor>
</p>
<br/><br/>

<!-- 场馆介绍: -->
<p><span class="red">*</span>场馆介绍:</p>
<br/>
<p>
<quill-editor
class="editor"
id="QuillEditor_SceneIntro"
ref="QuillEditor_SceneIntro"
v-model="form.SceneIntro"
:options="editorOption"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@ready="onEditorReady($event)"
@change="onEditorChange($event)"
>
</quill-editor>
</p>
<br/><br/>

<!-- 用户须知: -->
<p><span class="red">*</span>用户须知:</p>
<br/>
<p>
<quill-editor
class="editor"
id="QuillEditor_UserNotice"
ref="QuillEditor_UserNotice"
v-model="form.UserNotice"
:options="editorOption"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@ready="onEditorReady($event)"
@change="onEditorChange($event)"
>
</quill-editor>
</p>
<br/><br/>


<!-- 活动流程\日程: -->
<p><span class="red">*</span>活动流程\日程:</p>
<br/>
<p>
<quill-editor
class="editor"
id="QuillEditor_Process"
ref="QuillEditor_Process"
v-model="form.Process"
:options="editorOption"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@ready="onEditorReady($event)"
@change="onEditorChange($event)"
>
</quill-editor>
</p>

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

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

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

源码截图

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

源码

BaseTheme.DEFAULTS = (0, _extend2.default)(true, {}, _theme2.default.DEFAULTS, {
modules: {
toolbar: {
handlers: {
formula: function formula() {
this.quill.theme.tooltip.edit('formula');
},
image: function image() {
var _this3 = this;

var fileInput = this.container.querySelector('input.ql-image[type=file]');
if (fileInput == null) {
fileInput = document.createElement('input');
fileInput.setAttribute('type', 'file');
fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');
fileInput.classList.add('ql-image');
fileInput.addEventListener('change', function () {
if (fileInput.files != null && fileInput.files[0] != null) {
var reader = new FileReader();
reader.onload = function (e) {
var range = _this3.quill.getSelection(true);
_this3.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert({ image: e.target.result }), _emitter2.default.sources.USER);
_this3.quill.setSelection(range.index + 1, _emitter2.default.sources.SILENT);
fileInput.value = "";
};
reader.readAsDataURL(fileInput.files[0]);
}
});
this.container.appendChild(fileInput);
}
fileInput.click();
},
video: function video() {
this.quill.theme.tooltip.edit('video');
}
}
}
}
});

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

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

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


生成代码大致如下:

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

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

js代码

<script>
// 工具栏配置
var _EditorOption_=function(page_this){return {
modules: {
toolbar: {
container:[
['bold', 'italic', 'underline'], // 加粗 斜体 下划线 删除线
[{ size: [12,14,16] }], // 字体大小
[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
[{ align: [] }], // 对齐方式
['clean'], // 清除文本格式
// ['link','image'] // 链接、图片、视频
['link','image'] // 链接、图片、视频
],
handlers:{
image:function(value){
console.log(value);
if(value)
{
console.log(this);//此时this是头部工具栏当前对象
var parentIdStr=this.container.parentElement.id;//获取容器quill-editor标签的id
var fileInput = this.container.querySelector('input.ql-image[type=file]');
if (fileInput == null) {
fileInput = document.createElement('input');
fileInput.setAttribute('type', 'file');
fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');
fileInput.classList.add('ql-image');
fileInput.addEventListener('change', function(){
var files=fileInput.files;//获取文件
page_this.QuillEditorImgUpload(parentIdStr,files);//调取当前页面富文本图片上传的方法
});
this.container.appendChild(fileInput);
}
fileInput.click();
}
else
{
this.quill.format('image', false)
}

}
}
}
},
placeholder: '请输入正文'
}; };


export default {
data(){
return {
editorOption:_EditorOption_(this),//富文本配置
form:{
Intro:'',//活动介绍
SceneIntro:'',//场馆介绍
UserNotice:'',//用户须知
Process:'',//活动流程\日程
}
}},
created(){},
methods:{
// 富文本-失去焦点事件
onEditorBlur(quill) {
// //console.log("失去焦点事件");
// //console.log('editor blur!', quill)
// //console.log(this.form);
},
// 富文本-获得焦点事件
onEditorFocus(quill) {
// //console.log("获得焦点事件");
// //console.log('editor focus!', quill)
},
// 富文本-准备富文本编辑器
onEditorReady(quill) {
// //console.log("准备富文本编辑器");
// //console.log('editor ready!', quill)
},
//富文本- 内容改变事件
onEditorChange({ quill, html, text }) {
// console.log("内容改变事件");
// // console.log('editor change!', quill, html, text)
// console.log(quill)
// console.log("内容改变事件22222222");
// console.log(html)
// console.log("内容改变事件3333333333");
// console.log(text)
},
//富文本- 图片上传
QuillEditorImgUpload(domId,files) {
var that=this;
console.log('富文本文件上传')
console.log(domId);
console.log(files);

var formData = new FormData();
formData.append("file",files[0]);
formData.append("filename", files[0].name);

// 此时可以自行将文件上传至服务器
that.$axios.post("/api/ImgUpload",formData).then((res) => {
console.log(res);
if(res.code==10000 )
{
let imageUrl='http://www.xxx.xxx' + res.imgUrl;//拼接图片地址

let quill = '';//获取富文本编辑器dom对象
switch (domId) {
case 'QuillEditor_Intro'://活动介绍
quill=this.$refs.QuillEditor_Intro.quill;
break;
case 'QuillEditor_SceneIntro'://场馆介绍
quill=this.$refs.QuillEditor_SceneIntro.quill;
break;
case 'QuillEditor_UserNotice'://用户须知
quill=this.$refs.QuillEditor_UserNotice.quill;
break;
case 'QuillEditor_Process'://活动流程\日程
quill=this.$refs.QuillEditor_Process.quill;
break;

default:
break;
}

let length = quill.getSelection().index;// 获取光标所在位置
quill.insertEmbed(length, 'image', imageUrl)// 插入图片
quill.setSelection(length + 1);// 调整光标到最后
}
else{
that.alertFun(res.msg);
}
});
},
},
}
</script>

标签:picker,文本编辑,title,value,Choice,上传,ql,quill,图片
From: https://blog.51cto.com/cplvfx/5931866

相关文章

  • 基于MongoDB GridFS的图片存储
    它是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取).GridFS是mongodb中用户存储大对象的工具,......
  • quillEditor富文本编辑器
    quillEditor是我21年就使用过的一款富文本编辑器个人感觉还可以程序跑的通一切顺利哈想要有预览效果的可以查看我写的vue+mavon-editor编辑器的文章一、npm下载依......
  • 通过命令上传到GitHub
    从零开始命令行上传代码到GitHub前情概要:​ 要提交代码到GitHub上,本来想要通过idea上传代码,然后去网上搜索了相关的文章,按照步骤一步一步的操作,结果还是没有弄好,也会出现......
  • 【HMS Core】运动健康服务上传平台的健康数据,能否获取到上传设备的SN码或者唯一设备码
    ​ 问题描述上传平台的健康数据,能否获取到上传设备的SN码或者唯一设备码信息 解决方案DeviceInfo中包含华为设备唯一标识,您可以通过DeviceInfo进行查看。DeviceInfo......
  • postman+springboot一次上传多个文件
     开发中到前端一次上传多个文件的需求如何实现,下面使用postman模拟前端的请求,后端使用srpingboot来实现1、postman设置   2、Java代码@RestController@Reque......
  • Springboot上传文件到本地服务器
    引入配置UploadFileConfig类@ConfigurationpublicclassUploadFileConfig{@Value("${file.uploadFolder}")privateStringuploadFolder;......
  • 直播平台搭建,实现图片缩略图功能
    直播平台搭建,实现图片缩略图功能 publicpartialclassForm1:Form{  publicForm1()  {    InitializeComponent();  }  publicImageReso......
  • 视频直播系统源码,C语言实现图片合成功能
    视频直播系统源码,C语言实现图片合成功能 publicpartialclassForm1:Form{  publicForm1()  {    InitializeComponent();  }  privatevo......
  • 本地的代码上传到码云
    本地的代码上传到码云方法1:在码云创建仓库,并且初始化然后本地创建新的文件夹,打开gitbashhere,输入gitclone(新创建仓库的地址),将本地代码放到此文......
  • 用Python将图片转为字符画
    今天打算玩个好玩的,也是基于一个优秀的图像处理库——PIL,使用ascii字符把图片转为黑白字符画。首先有个问题,就是模拟灰度,这里有个公式:Gray=0.2126×R+0.7152×G+0......