在 Vue 项目中引入 tinymce 富文本编辑器的完整代码


Posted in Javascript onMay 04, 2018

项目中原本使用的富文本编辑器是 wangEditor,这是一个很轻量、简洁编辑器

但是公司的业务升级,想要一个功能更全面的编辑器,我找了好久,目前常见的编辑器有这些:

UEditor:百度前端的开源项目,功能强大,基于 jQuery,但已经没有再维护,而且限定了后端代码,修改起来比较费劲

bootstrap-wysiwyg:微型,易用,小而美,只是 Bootstrap + jQuery...

kindEditor:功能强大,代码简洁,需要配置后台,而且好久没见更新了

wangEditor:轻量、简洁、易用,但是升级到 3.x 之后,不便于定制化开发。不过作者很勤奋,广义上和我是一家人,打个call

quill:本身功能不多,不过可以自行扩展,api 也很好懂,如果能看懂英文的话...

summernote:没深入研究,UI挺漂亮,也是一款小而美的编辑器,可是我需要大的

在有这么参考的情况下,我最终还是选择了 tinymce 这个不搭梯子连官网都打不开的编辑器(简直是自讨苦吃),主要因为两点:

1. GitHub 上星星很多,功能也齐全;

2. 唯一一个从 word 粘贴过来还能保持绝大部分格式的编辑器;

3. 不需要找后端人员扫码改接口,前后端分离;

4. 说好的两点呢!

一、资源下载

tinymce 官方为 vue 项目提供了一个组件 tinymce-vue

npm install @tinymce/tinymce-vue -S

在 vscode、webstorm 的终端运行这段代码可能会报错,最好使用操作系统自带的命令行工具

如果有购买 tinymce 的服务,可以参考 tinymce-vue 的说明,通过 api-key 直接使用 tinymce

像我这样没购买的,还是要老老实实下载 tinymce

npm install tinymce -S

安装之后,在 node_modules 中找到 tinymce/skins 目录,然后将 skins 目录拷贝到 static 目录下

// 如果是使用 vue-cli 3.x 构建的 typescript 项目,就放到 public 目录下,文中所有 static 目录相关都这样处理

tinymce 默认是英文界面,所以还需要下载一个中文语言包(记得搭梯子!搭梯子!搭梯子!)

然后将这个语言包放到 static 目录下,为了结构清晰,我包了一层 tinymce 目录

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

二、初始化

在页面中引入以下文件

import tinymce from 'tinymce/tinymce'
import 'tinymce/themes/modern/theme'
import Editor from '@tinymce/tinymce-vue'

tinymce-vue 是一个组件,需要在 components 中注册,然后直接使用

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

这里的 init 是 tinymce 初始化配置项,后面会讲到一些关键的 api,完整 api 可以参考官方文档

编辑器需要一个 skin 才能正常工作,所以要设置一个 skin_url 指向之前复制出来的 skin 文件

init: {
 language_url: '/static/tinymce/zh_CN.js',
 language: 'zh_CN',
 skin_url: '/static/tinymce/skins/lightgray',
 height: 300
}

// vue-cli 3.x 创建的 typescript 项目,将 url 中的 static 去掉,即 skin_url: '/tinymce/skins/lightgray'

同时在 mounted 中也需要初始化一次:

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

如果在这里传入上面的 init 对象,并不能生效,但什么参数都不传也会报错,所以这里传入一个空对象

三、扩展插件

完成了上面的初始化之后,就已经能正常运行编辑器了,但只有一些基本功能

tinymce 通过添加插件 plugins 的方式来添加功能

比如要添加一个上传图片的功能,就需要用到 image 插件,添加超链接需要用到 link 插件

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

同时还需要在页面引入这些插件:

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

添加了插件之后,默认会在工具栏 toolbar 上添加对应的功能按钮,toolbar 也可以自定义

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

贴一下完整的组件代码:

<template>
 <div class='tinymce'>
  <h1>tinymce</h1>
  <editor id='tinymce' v-model='tinymceHtml' :init='init'></editor>
  <div v-html='tinymceHtml'></div>
 </div>
</template>

<script>
import tinymce from 'tinymce/tinymce'
import 'tinymce/themes/modern/theme'
import Editor from '@tinymce/tinymce-vue'
import 'tinymce/plugins/image'
import 'tinymce/plugins/link'
import 'tinymce/plugins/code'
import 'tinymce/plugins/table'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/contextmenu'
import 'tinymce/plugins/wordcount'
import 'tinymce/plugins/colorpicker'
import 'tinymce/plugins/textcolor'
export default {
 name: 'tinymce',
 data () {
  return {
   tinymceHtml: '请输入内容',
   init: {
    language_url: '/static/tinymce/zh_CN.js',
    language: 'zh_CN',
    skin_url: '/static/tinymce/skins/lightgray',
    height: 300,
    plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu',
    toolbar:
     'bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | undo redo | link unlink image code | removeformat',
    branding: false
   }
  }
 },
 mounted () {
  tinymce.init({})
 },
 components: {Editor}
}
</script>

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

四、上传图片

tinymce 提供了 images_upload_url 等 api 让用户配置上传图片的相关参数

但为了在不麻烦后端的前提下适配自家的项目,还是得用 images_upload_handler 来自定义一个上传方法

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

这个方法会提供三个参数:blobInfo, success, failure

其中 blobinfo 是一个对象,包含上传文件的信息:

在 Vue 项目中引入 tinymce 富文本编辑器的完整代码

success 和 failure 是函数,上传成功的时候向 success 传入一个图片地址,失败的时候向 failure 传入报错信息

总结

以上所述是小编给大家介绍的在 Vue 项目中引入 tinymce 富文本编辑器的完整代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
Aug 28 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
Jan 17 Javascript
判断复选框是否被选中的两种方法
Jun 04 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
Jun 09 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
jQuery oLoader实现的加载图片和页面效果
Mar 14 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
学习使用bootstrap基本控件(table、form、button)
Apr 12 Javascript
JavaScript  cookie 跨域访问之广告推广
Apr 20 Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
Mar 26 Javascript
简单了解node npm cnpm的具体使用方法
Feb 27 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 #jQuery
Vue.js 踩坑记之双向绑定
May 03 #Javascript
Vue利用canvas实现移动端手写板的方法
May 03 #Javascript
Node.Js中实现端口重用原理详解
May 03 #Javascript
原生JS实现的雪花飘落动画效果
May 03 #Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 #Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 #Javascript
You might like
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
Vue侦测相关api的实现方法
2019/05/22 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
python opencv3实现人脸识别(windows)
2018/05/25 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
《假如》教学反思
2014/04/17 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
技术负责人岗位职责
2015/02/10 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
签约仪式致辞
2015/07/30 职场文书
公司周年庆典致辞
2015/07/30 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript