前言

本文将介绍笔者在React的项目中使用百度的富文本编辑器Ueditor的过程。注意本文不提供一条龙式的使用方法,只是将使用过程中的一些实现思路进行总结,供以参考。react项目中导入ueditor,会存在各种不正交的问题,需要注意。

引入

首先在ueditor官网下载最新安装包,然后在项目入口的html中导入(导入方式不一,可以采用import的方式,需要自行度娘。但是无论哪种引入方式,只要想自定义功能,不正交问题就难以避免QAQ)。不管三七二十一先跑起来再说。。

ueditor demo

······

在React项目中使用ueditor要注意

导入的路径,笔者使用的是项目经webpack打包之后的相对路径。

导入顺序,配置文件要先于源码。

笔者这种引入方式存在缓存问题,所以修改ueditor.all.js后需要及时清理缓存,测试新的代码。

封装

/**

* 封装UEditor

*/

import React from 'react';

import './index.less';

class UEditor extends React.Component {

constructor(props) {

super(props);

this.editor = {};

this.id = '';

}

······

componentDidMount() {

let UE = window.UE;

let id = this.id;

if (id) {

try {

/* 加载之前先执行删除操作,否则如果存在页面切换,

再切回带编辑器页面重新加载时不刷新无法渲染出编辑器 */

UE.delEditor(id);

} catch (e) {}

let ueditor = UE.getEditor(id, {

toolbars: [

['bold', 'italic', 'underline', 'kityformula', 'diyimg']

],

initialContent: '',

autoHeightEnabled: false,

autoFloatEnabled: false,

elementPathEnabled: false,

wordCount: false,

enableAutoSave: false,

initialFrameWidth: this.props.width,

initialFrameHeight: this.props.height

});

}

}

render() {

this.id = this.props.id;

return

}

}

export default UEditor;

笔者在项目中使用了加粗,斜体,下划线,插入图片,公式等功能,想要自定义配置均可参照ueditor.config.js修改。具体的将一一介绍,最后实现效果如下:

问题总结:

1. 禁止自动增高,改用滚动条

autoHeightEnabled: false

initialFrameWidth:this.props.width

initialFrameHeight:this.props.height

autoHeightEnabled可以阻止自动增高,然后再自定义容器宽度和高度。

2. 自定义全局样式,如容器的padding,p标签的line-height等

解决方法:ueditor.all.js的第6800多行的render方法,在其中可以自定义全局样式。

3. 导航条切换后,无法再次渲染

解决方法:在每次ueditor实例化之前,先删除对应的id

UE.delEditor(id);

原因分析:

从实例化和卸载实例的源码来看:

getEditor:

UE.getEditor = function (id, opt) {

var editor = instances[id];

if (!editor) {

editor = instances[id] = new UE.ui.Editor(opt);

editor.render(id);//渲染编辑器

}

return editor;

};

delEditor:

UE.delEditor = function (id) {

var editor;

if (editor = instances[id]) {

editor.key && editor.destroy();

delete instances[id]

}

};

UE在全局管理了一个实例池,每次实例化都会根据id检索,然后生成实例。从getEditor的源码中可以看出,ueditor的一个实例在第一次初始化时存在一个editor.render(),这是将此id的实例渲染到对应的id容器上。然而,当用户tab切换编辑器再切回来时,此时由于该实例已在实例池中存在,于是直接执行return editor,所以少了editor.render()这一步,于是不能重新渲染。所以,在Ueditor组件每次实例化之前,先进行delEditor卸载。这里需要注意,从delEditor中可以看出ueditor卸载实例时调用了实例的destroy方法。从destroy的注释来看:销毁编辑器实例,使用textarea代替 ,这解释了为什么在切换编辑器或者卸载编辑器时,会出现编辑器变为textarea的情况,如图所示:

4. 模拟placeholder实现预置文案

解决方法:在UE的实例中自定义方法,实现填充文字模拟placeholder的效果,代码如下:

//模拟placeholder和控制toolbar显示隐藏

UE.Editor.prototype.initDiy = function (placeholder) {

var _editor = this;

//获取焦点

_editor.addListener("focus", function () {

UE.isEditored = true;

var Text = `

${placeholder}

`

var localHtml = _editor.getContent();

if (localHtml === Text) {

_editor.setContent("");//点击时清空

_editor.focus(true);

}

//使得其他工具条display置为none

var list = document.querySelectorAll('.edui-editor-toolbarbox');

list.forEach((ele) => {

ele.style.display = 'none';

});

var toolbar = findKey(_editor.key);

toolbar.style.display = 'block';

});

// 插入图片时存在问题

// _editor.addListener("blur", function () {

// var localHtml = _editor.getContent();

// if (localHtml === '') {

// _editor.setContent(`

${placeholder}

`);

// }

// // window.activeEditor = _editor.key;

// });

_editor.ready(function () {

// _editor.fireEvent("blur");

_editor.setContent(`

${placeholder}

`);//填充预置文案

});

}

//寻找工具条

function findKey(key) {

let ele = document.querySelector(`#${key}`);

let toolbar = ele.querySelector('.edui-editor-toolbarbox');

return toolbar;

}

原来,笔者实现的效果是点击时清空,失焦时还原。但是,在做自定义工具条时产生了bug(在5中我会细说),因此我采用了另一种方案:初始时设置预设文案,当用户聚焦时清空预设,用户失焦后不再恢复该预设文案。也就是将blur事件注释了。。。

5. 工具条显示在编辑器头部,显示为悬浮效果,默认隐藏,聚焦时出现

实现思路:将themes/default/css/ueditor.css中加入:

.edui-default .edui-editor-toolbarbox {

position: absolute;

······

top: -36px;

}

首先实现头部偏移,然后通过控制toolbar对应dom元素的display来隐藏工具条。实现效果如下:

下面解释一下为什么编辑器失焦的时候不恢复预置文案:

从4中的代码可以看出,我们是通过触发focus和blur事件分别清空和填充编辑器的内容。但是当我们点击工具条时,编辑器就会触发blur事件!!于是就会出现各种bug。以百度官网的ueditor为例,控制台输入:

为该编辑器注册点击事件,当点击加粗按钮时,控制台输出:

为了避免点击工具条时触发blur事件,笔者将自定义的blur事件全部注释了。

6. 自定义按钮和七牛云图片上传

首先,在ueditor.config.js中找到toolbars数组,增加一个diyimg字符串,然后在zh-cn.js找到labelMap数组,在末尾加上'diyimg': '插入图片' 。最后,在ueditor.all.js中找到btnCmds数组,加入diyimg字符串。初始化时使用这个字符串,工具条上就会显示一个按钮,但是我们发现他显示的是这样的:

这是因为ueditor默认使用加粗的icon作为自定义按钮的默认icon,所以为了使用默认的插入图片的图标,我们需要到themes/default/css/ueditor.css中,在最后一行加入:

/*自定义图片上传按钮 */

.edui-default .edui-toolbar .edui-for-diyimg .edui-icon {

background-position: -380px 0px;//这个位置是“插入图片”的icon,其他图标可自行调整

}

添加后,显示效果如下:

图标正常显示后,需要为该图标添加相应的点击事件,在ueditor.all.js中加入:

//图片上传

UE.commands['diyimg'] = {

execCommand : function(){

const upload = async(e) => {

······//完成图片上传的代码

}

const fileInput = document.getElementById('diyimg');//获取dom上隐藏的一个input标签

fileInput.onchange = upload;

fileInput.click();//触发input标签实现文件上传

return true;

},

queryCommandState:function(){

}

};

笔者这里不赘述图片上传的代码,度娘上很多,我简单说说实现的思路:

先实现一个插入图片的按钮,然后为该按钮注册相应的事件diyimg,然后在页面中添加一个input file标签并隐藏,diyimg事件会触发该标签的点击事件,弹出文件上传弹窗,此时选择文件点击后会触发onchange事件,执行相应的图片上传代码。上传成功到服务器后,服务器会返回图片对应的url,此时拿到该url填入对应编辑器实例,执行编辑器的插入图片的代码:

this.execCommand('insertimage', {

src: res.data.downloadUrl,//回调传来的url

width:'60'

// height:'45'

});

7. 给在编辑器内部的img等标签添加内联样式

ueditor默认存在xss过滤!!!这里以给img标签添加style=“vertical-top”为例。

首先要找到ueditor.config.js,在其中搜索xss,在第403行左右有代码:

img: [src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class', 'data-latex'],

往数组里加入style字符串,然后在ueditor.all.js中搜索UE.commands['insertimage'] ,在第约11172行找到str,往里面加入内联样式即可。

一些吐槽:

1. 在react项目里使用script形式引入,感觉格格不入

2. 为了实现placeholder,各个事件之间存在不正交的现象。诸如点击按钮,却触发了编辑器的失焦事件

3. 在使用自定义的字数限制功能时,笔者使用ueditor的contentChange去检测内容字数,但是contentChange事件是定时的,所以计算字数会有问题。

实现中的问题及解决方法

1.上传图片时的跨域问题

在源码里 有 header['X_Requested_With'] = 'XMLHttpRequest';

后端需要配置 header('Access-Control-Allow-Headers', 'AccessToken, Content-Type, WebOrigin,X-Requested-With,X_Requested_With');

2. 进入文本编辑界面编辑器没有加载出来

可能原因: 放置编辑器的容器id, 容器下的编辑器已经存在

解决方法如代码所示

this.editor.ready(function (ueditor) {

if (!ueditor) {

// 如果初始化后ueditor不存在删除后重新调用

UE.delEditor(self.props.id);

self.initEditor();

}

})

3.注意这两个参数配置

'UEDITOR_HOME_URL': '/react/dist/ueditor/', // 编辑器实例路径,即ueditor文件包所放置的位置

serverUrl: window.api_host + '/innerMessage/uploadImage', // 后端提供加载图片接口,这是个共同接口接口包括了后端配置的config.json文件 通过url中action

值不同来区分(config|uploaimage 等)

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

edui 富文本编辑_React中使用UEditor百度富文本的方法相关推荐

  1. 百度富文本编辑jsp上传_百度富文本编辑器教程,从入门到放弃

    原标题:百度富文本编辑器教程,从入门到放弃 百度UEditor 资源与项目分离-完全教程 夏老师人真好 又求到一篇技术贴 来来来 继续掏出小本本 什么是百度UEditor? 百度UEditor是一款富 ...

  2. UEditor 百度富文本编辑器 .Net实例

    转自 http://download.csdn.net/download/hdsslxl/6740605 1.UEditor 百度富文本编辑器完整版 .Net实例 已解决上传图片问题. 2.内附完整d ...

  3. java 替换 word_Java 在 Word 文档中使用新文本替换指定文本的方法

    创作一份文案,经常会高频率地使用某些词汇,如地名.人名.人物职位等,若表述有误,就需要整体撤换.文本将介绍如何使用Spire.Doc for Java,在Java程序中对Word文档中的指定文本进行替 ...

  4. 富文本编辑_博客的后台富文本编辑和阅读计数

    哈喽,大家好呀,我是滑稽君.本期我们为博客加上分类统计功能.后台富文本编辑功能.和阅读计数功能.那么我们先说说富文本编辑器是什么. 富文本编辑器,Rich Text Editor, 简称 RTE, 它 ...

  5. edui 富文本编辑_2020-03-03 快速部署UEditor富文本编辑器

    情景: 1.UEditor 依然是国内使用频率极高的所见即所得编辑器而 Vue 又有着广泛的使用,所以将两者结合使用,是很多 Vue 项目开发者的切实需求. 2.目前没有发现满足这种需求,而使用又很方 ...

  6. ueditor百度富文本编辑器隐藏一下不需要的工具按钮

    在ueditor.config.js中搜索"toolbars: " 以下为编辑器工具栏展示的按钮 将不需要的按钮删掉就好.也可以在创建富文本编辑器的时候实例出需要的按钮 不了解中文 ...

  7. UEditor 百度富文本编辑器源码 百度云下载

    官网下载地址:官网下载地址: 因为官网的速度时快时慢的,所以我把源码包放到了百度云,可以开通百度云进行下载. 下载地址: 链接:https://pan.baidu.com/s/1aXMA77uQolM ...

  8. ueditor百度富文本编辑器linux下报错: class path resource [config.json] cannot be resolved to absolute file path

    https://www.cnblogs.com/findtasy/p/10043273.html

  9. 191210P4 Java富文本编辑之图片链接本地化

    Java富文本编辑之图片链接本地化 作者:邵发 官网:http://afanihao.cn/java 本文介绍在图文混编项目中(博客.新闻等),如何将富文本中的图片外链转为本地链接的问题.本文是Jav ...

最新文章

  1. c语言程序设计第3周编程作业(数字特征)
  2. 成功解决ModuleNotFoundError: No module named 'urllib2'
  3. Topic交换器-编写消费者
  4. 构造类斐波那契数列矩阵
  5. 1.SpringMVC 概述
  6. python字符串join和+_Python字符串通过'+'和join函数拼接新字符串的性能测试比较
  7. 如何不让tomcat在启动时弹窗_Tomcat 在 Spring Boot 中是如何启动的
  8. top刷新间隔_还在用top监控CPU?我们都在用glances
  9. 【Prison Break】第四天(3.31)
  10. 机房服务器搬迁验收文档,idc机房服务器搬迁之后的准备工作和应对
  11. LPMS-IMU姿态解算
  12. App怎样提高推广转化率
  13. DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。
  14. 读写Excel工具类ExcelUtil
  15. 诗仙诗圣,你还知道诗什么
  16. java 工作流 jbpm,J2EE工作流管理系统jBPM详解(一)(4)
  17. 用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密...
  18. 软件工程直招士官生_2018年直招士官, 大学生注意这3点, 尤其第1点让好多人中枪...
  19. PBlaze5 920系列特性——可变Sector Size管理(上)
  20. Arnold材质节点篇-凹凸 法线贴图 圆角/置换曲面细分

热门文章

  1. Kafka安装及部署
  2. mysql中使用case when语句
  3. yui压缩JS和CSS文件
  4. 牛客网刷题知识汇总2
  5. python thread 多线程
  6. 让我们来谈谈合并排序算法
  7. 一个导出类的内部函数的dll
  8. AndroidStudio_android通过服务,检测本程序是否已经终止运行_终止运行后发送通知给Http服务器---Android原生开发工作笔记246
  9. 大数据之-Hadoop伪分布式_配置启动HDFS_并运行MR程序---大数据之hadoop工作笔记0023
  10. Netty工作笔记0071---Protobuf传输多种类型