JS开发 富文本编辑器TinyMCE详解


Posted in Javascript onJuly 19, 2019

一、题外话

最近负责了一个cms网站的运维,里面存在很多和编辑器有关的问题,比如编辑一些新闻博客,论文模块。系统采用的是FCKEditor,自我感觉不是很好,如下图

特别是在用户想插入一个图片的话,就很麻烦,所有用户共享一个文件目录,这样就不好了,于是便想到了TinyMCE编辑器,博客园默认的也是这个编辑器,接下

来,我们开始吧

JS开发 富文本编辑器TinyMCE详解

二、TinyMCE编辑器集成步骤

2.1:下载相关文件

(1)下载TinyMCE插件包

下载地址,如下图所示,下载开发版

JS开发 富文本编辑器TinyMCE详解

(2)下载其他功能包

包括中文语言包zh_CN.js,图片上传操作需要的plugin.min.js和jquery.form.js

这一点很重要,很重要,很重要哦

下载完成后如下图所示

JS开发 富文本编辑器TinyMCE详解

2.2:操作步骤

(1):复制TinyMCE到项目中

解压下载到的tinymce_4.6.4_dev.zip,解压后会有一个tinymce文件夹,将整个文件夹放到WebContent目录下,目录结构如下图所示

JS开发 富文本编辑器TinyMCE详解

(2):页面集成TinyMCE

在页面的JS标签中初始化TinyMCE编辑器,代码如下所示

<script type="text/javascript">
tinymce.init({
  selector: "textarea",
  upload_image_url: './upload', //配置的上传图片的路由
  height: 400,
  language:'zh_CN',
  plugins: [
  'advlist autolink lists link charmap print preview hr anchor pagebreak',
  'searchreplace wordcount visualblocks visualchars code fullscreen',
  'insertdatetime media nonbreaking save table contextmenu directionality',
  'emoticons template paste textcolor colorpicker textpattern imagetools codesample toc help'
  ],
  toolbar1: 'undo redo | insert | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
  toolbar2: 'print preview media | forecolor backcolor emoticons | codesample help',
  image_advtab: true,
  templates: [
  { title: 'Test template 1', content: 'Test 1' },
  { title: 'Test template 2', content: 'Test 2' }
  ],
  menubar: false
 });
</script>

运行如下图所示,基本的集成已经完毕

JS开发 富文本编辑器TinyMCE详解

三、TinyMCE编辑器本地上传图片功能

注:默认的TinyMCE是没有上传本地图片到服务器的功能的,所以这里我们需要自己实现,下面我们就说一说具体的实现步骤

3.1:集成uploadimage插件

在./tinymce/js/tinymce/plugins目录下新建一个uploadimage目录,放入下载的plugin.min.js,目录结构如下图所示

JS开发 富文本编辑器TinyMCE详解

3.2:在TinyMCE初始化中添加上传图片按钮

代码如下图所示,需要注意的是在plugins中和toobar2中都需要加入uploadimage,toolbar1代表第一行菜单,toolbar2代表第二行菜单,次初始化代码是来自 https://www.tinymce.com/docs/demo/full-featured/ 官网一个完整的例子,功能按钮大家可以试着去除或者添加

tinymce.init({
  selector: "textarea",
  upload_image_url: './upload', //配置的上传图片的路由
  height: 400,
  language:'zh_CN',
  plugins: [
  'advlist autolink lists link charmap print preview hr anchor pagebreak',
  'searchreplace wordcount visualblocks visualchars code fullscreen',
  'insertdatetime media nonbreaking save table contextmenu directionality',
  'emoticons template paste textcolor colorpicker textpattern imagetools codesample toc help uploadimage'
  ],
  toolbar1: 'undo redo | insert | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
  toolbar2: 'print preview media | forecolor backcolor emoticons | codesample help uploadimage',
  image_advtab: true,
  templates: [
  { title: 'Test template 1', content: 'Test 1' },
  { title: 'Test template 2', content: 'Test 2' }
  ],
  menubar: false
 });

再次运行,发现在编辑器的菜单栏多了一个图片的按钮就是上传图片了(TinyMCE默认有一个image,可以去掉,因为那个image只可以给网络图片的URL),总这里plugins里面

已经把默认的image去掉了,如下图

JS开发 富文本编辑器TinyMCE详解

3.3:实现上传本地图片到服务器的功能

前提:需要先用java实现一个upload工具类,此工具类可以完成本地图片上传到服务器,并返回图片的URL给ajax,ajax在success的方法中接收URL并向TinyMCE中插入一个image标签

JS核心代码如下,已包含在plugin.min.js文件中,这里注意TinyMCE的版本不用命令可能会有差异

success: function (data) {
   //alert('2222');
   //alert(data);
   if (data!=null) {
   //alert('4444');
   editor.focus();
   //tinyMCE 4.X版本的插入对象
   tinyMCE.activeEditor.insertContent('<img src="'+data+'"></img>');
//   editor.selection.setContent(dom.createHTML('img', {src: src}));
//   data.file_path.forEach(function (src) {
//    editor.selection.setContent(dom.createHTML('img', {src: src}));
//   })
   }

ajax提交form表单的操作中还用到了form.ajaxSubmit,所以需要在编辑器的页面引入jquery.form.js 包,整体如下所示

<script type="text/javascript" src="./tinymce/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="./tinymce/js/tinymce/tinymce.min.js"></script>
<script type="text/javascript" src="./tinymce/js/tinymce/jquery.tinymce.min.js"></script>
<script type="text/javascript" src="./tinymce/js/jquery.form.js"></script>

实现效果,点击图片上传可以从本地选择图片文件,确定后ajax异步上传,并且返回图片的URL,让TinyMCE执行插入img标签的操作

JS开发 富文本编辑器TinyMCE详解

四:演示一个编辑器发布网页内容的例子

4.1:添加发布按钮

在编辑器页面下面添加一个发布文章的按钮,定义onclick事件为GetTinyMceContent()

function GetTinyMceContent()
{
// <!-- 
// http request方式b_content的参数不能太长,太长会截断,这里只是做演示编辑器,真实情况是获取到内容到数据库然后
// 展示的时候在页面遍历数据库字段content的内容
// --> 
//alert('11');
window.location.href="blog.jsp?b_content="+tinyMCE.activeEditor.getContent();
}

4.2:添加文章显示页面

如下图所示

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文章内容-HTML</title>
</head>
<body>
<h2 align="center">我的第一篇博文</h2>
<%= request.getParameter("b_content") %>
</body>
</html>

4.3:运行效果

在编辑器输入一些内容,并上传一个图片,如下图示

JS开发 富文本编辑器TinyMCE详解

点击发布文章的按钮,如下图所示,发布成功可以在网页查看文章的输出格式,大功已经告成!

JS开发 富文本编辑器TinyMCE详解

4.4:总结

在真实的环境中TinyMCE的内容不会通过在Request请求的后面以?参数名=参数值,然后在页面<%= request.getParameter("b_content") %>的形式处理,这里只是做一个流程的演示就没涉及数据库内容。

真实的场景是编辑完后,把带有HTML标签的TinyMCE的内容存到数据库的一个text大文本字段里面,然后前端取出字符串对象插入到HTML元素中

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
取得父标签
Nov 14 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
May 28 Javascript
JavaScript中的运算符种类及其规则介绍
Sep 26 Javascript
js由下向上不断上升冒气泡效果实例
May 07 Javascript
JavaScript中判断两个字符串是否相等的方法
Jul 07 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 Javascript
微信小程序 欢迎页面的制作(源码下载)
Jan 09 Javascript
js 倒计时(高效率服务器时间同步)
Sep 12 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
Dec 28 Javascript
Webpack 4.x搭建react开发环境的方法步骤
Aug 15 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
May 07 Javascript
更强大的vue ssr实现预取数据的方式
Jul 19 #Javascript
bootstrap table.js动态填充单元格数据的多种方法
Jul 18 #Javascript
bootstrap table实现横向合并与纵向合并
Jul 18 #Javascript
微信小程序判断用户是否需要再次授权获取个人信息
Jul 18 #Javascript
Vue动态生成表格的行和列
Jul 18 #Javascript
vue通过数据过滤实现表格合并
Nov 30 #Javascript
Vue实现数据表格合并列rowspan效果
Nov 30 #Javascript
You might like
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
python实现词法分析器
2019/01/31 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
基于Python fminunc 的替代方法
2020/02/29 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
实习教师自我鉴定
2013/09/27 职场文书
学习张林森心得体会
2014/09/10 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
Python使用openpyxl模块处理Excel文件
2022/06/05 Python