项目中新功能需要用到富文本编辑,查找了几个富文本编辑器,结合需求以及以后产品说的可能扩展,最终选择了ueditor
首先就是功能超多,一步到位,估计都不用二次开发就够用了:
使用的话,首先要装包:
( npm install ngx-ueditor --save )
然后就是引入到模块,然后配置前端配置项:
这是目录结构(没有在根目录引入,就为了写demo):
接着就是这个 ueditor 这个文件夹,需要去对应地址去下载: ?https://ueditor.baidu测试数据/website/download.html ???,引用配置就完成了。
这时候如果想看demo,可以直接打开demo.html,就能直接看见了效果了,没有demo.html 的话,就自己创建一个,放在如上图路径下:
<! DOCTYPE HTML >
< html lang ="en-US" >
< head >
< meta charset ="UTF-8" >
< title > ueditor demo </ title >
</ head >
< body >
<!-- 加载编辑器的容器 -->
< script id ="container" name ="content" type ="text/plain" > 这里写你的初始化内容 </ script >
<!-- 配置文件 -->
< script type ="text/javascript" src ="ueditor.config.js" ></ script >
<!-- 编辑器源码文件 -->
< script type ="text/javascript" src ="ueditor.all.js" ></ script >
<!-- 实例化编辑器 -->
< script type ="text/javascript" >
var ue = UE.getEditor( \' container \' );
</ script >
</ body >
</ html >
然后是使用配置(创建一个组件,在html界面中直接引用):
ts 文件中使用创建相应变量及设置配置,如果不传配置的话,会默认使用:ueditor.config.js 文件:
在模块中引入该组件,ng serve 启动项目,就能看到配置好的功能啦:
ueditor 有很多个api,可以直接获取到带html的编辑器中输入的全部内容,可以直接使用相应方法来解析带html 标签的字符串。我这里使用的是 [innerHtml] ,但innerHtml 不能解析元素的内联样式,于是乎,用管道:
页面解析时:
最终实践代码(服务是没用到的):
u-editor测试数据ponent.html:
< div class ="ueditor-box" >
< ueditor [(ngModel)] ="full_source" [config] ="ueditor_config" (onReady) ="onReady($event)" #full ></ ueditor >
< div class ="btn-group" >
< pre class ="show-message" > {{showMessage}} </ pre >
< div [innerHTML] ="showMessage | html" class ="final-display" ></ div >
< h2 > 语言转换 </ h2 >
< hr />
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="languageChange($event, \'zh-cn\')" >
< span > zh-cn </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="languageChange($event, \'en\')" >
< span > en </ span >
</ button >
< hr />
< h2 > 常用API </ h2 >
< hr />
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="setContent($event)" >
< span > 写入内容 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="setContent($event, true)" >
< span > 追加内容 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="insertContent($event)" >
< span > 光标处插入给定的内容 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="insertImage($event)" >
< span > 插入图片 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="hasContents($event)" >
< span > 判断是否有内容 </ span >
</ button >
< br >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="getAllHtml($event)" >
< span > 获得整个html的内容 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="getContent($event)" >
< span > 获得内容(带html标签) </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="getContentTxt($event)" >
< span > 获得纯文本 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="getPlainTxt($event)" >
< span > 获得带格式的纯文本(能获得但显示需处理) </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="getText($event)" >
< span > 获得当前选中的文本(暂时有问题) </ span >
</ button >
< br >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="onfocus($event)" >
< span > 使编辑器获得焦点 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="onblur($event)" >
< span > 使编辑器失去焦点 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="isOnFocus($event)" >
< span > 判断编辑器是否有焦点 </ span >
</ button >
< br >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="setEnabled($event)" >
< span > 编辑器可以编辑 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="setDisabled($event)" >
< span > 编辑器不可编辑 </ span >
</ button >
< br >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="setHide($event)" >
< span > 隐藏编辑器 </ span >
</ button >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="setShow($event)" >
< span > 显示编辑器 </ span >
</ button >
< br >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="setHeight($event)" >
< span > 设置编辑器的高度为300 </ span >
</ button >
< br >
< button class ="btn-search" nz-button [nzType] ="\'primary\'" [nzSize] ="\'normal\'"
(click) ="clearDoc($event)" >
< span > 清空文档 </ span >
</ button >
</ div >
</ div >
u-editor测试数据ponent.scss
.ueditor-box {
padding: 20px;
overflow: auto;
height: 100%;
.btn-group {
button {
margin-right: 10px;
margin-bottom: 10px;
}
.show-message {
margin: 10px 0;
border: 1px solid #ccc;
height: 80px;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
.final-display {
font-size: 16px;
color: #000;
font-family: initial;
}
}
}
u-editor测试数据ponent.ts
import { Component, ElementRef, OnInit, ViewChild } from \'@angular/core\' ;
import { AppService } from \'app.service\' ;
import { UEditorDemoService } from \'./u-editor.service\' ;
import { UEditorComponent } from \'ngx-ueditor\' ;
/**
* @description 富文本编辑测试组件
*/
@Component({
selector: \'app-u-editor\' ,
templateUrl: \'./u-editor测试数据ponent.html\' ,
styleUrls: [ \'./u-editor测试数据ponent.scss\' ]
})
export class UEditorDemoComponent implements OnInit {
@ViewChild( \'full\' ) full: UEditorComponent;
public sign = \'u_editor\' ;
// 展示api获取到的数据
public showMessage;
public full_source;
// 配置信息
public ueditor_config = {
toolbars: [
[
\'FullScreen\', // 全屏
\'bold\', // 加粗
\'italic\', // 斜体
\'underline\', // 下划线
\'|\' ,
\'forecolor\', // 字体颜色
\'backcolor\', // 背景色
\'fontfamily\', // 字体
\'fontsize\', // 字号
\'|\' ,
\'insertorderedlist\', // 有序列表
\'insertunorderedlist\', // 无序列表
\'|\' ,
\'justifyleft\', // 左对齐
\'justifycenter\', // 居中对齐
\'justifyright\', // 右对齐
\'justifyjustify\', // 两端对齐
\'|\' ,
\'link\', // 超链接
\'unlink\', // 取消链接
\'inserttable\', // 插入表格
\'|\' ,
\'simpleupload\', // 单图上传
]
],
autoClearinitialContent: true , // 自动清除初始内容
wordCount: true , // 文字计数
focus: false , // 初始化后获得焦点
initialFrameHeight: 200, // 设置高度
initialFrameWidth: \'100%\', // 设置宽度
enableDragUpload: true , // 启用拖放上传
enablePasteUpload: true , // 启用粘贴上传
imageScaleEnabled: true , // 启用图片拉伸缩放
autoHeightEnabled: true , // 自动高度
};
constructor ( private uEditorDemoService: UEditorDemoService,
private appService: AppService,
private elementRef: ElementRef) {
}
ngOnInit () {
}
// ueditor 加载完成
onReady ($event) {
// 字体大小及颜色,通过class设置默认:16px、#000
}
// 切换语言触发方法
languageChange ($event, language) {
this .full.setLanguage(language);
}
// 获取全部html内容
getAllHtml () {
this .showMessage = this .full.Instance.getAllHtml();
}
// 获得文本,带html标签
getContent () {
this .showMessage = this .full.Instance.getContent();
// 设置img标签的垂直对齐为底部对齐
setTimeout(() => {
const imgs = document.getElementsByTagName(\'img\' );
for (let i = 0; i < imgs.length; i++ ) {
imgs[ i ].style.verticalAlign = \'initial\' ;
}
});
}
// 获取纯文本
getContentTxt () {
this .showMessage = this .full.Instance.getContentTxt();
}
/**
* 写入/追加内容
* @param { Object } $event 事件对象
* @param { boolean } type 是否是追加,true:追加;false,直接更新内容
*/
setContent ($event, type) {
this .showMessage = type ? \'追加文本\' : \'添加文本\' ;
this .full.Instance.setContent(\'<h3>一段文本</h3>\' , type);
}
// 获取带格式的文本
getPlainTxt () {
this .showMessage = this .full.Instance.getPlainTxt();
console.log( this .showMessage);
}
// 判断编辑器是否有内容
hasContents () {
this .showMessage = this .full.Instance.hasContents() ? \'有内容\' : \'无内容\' ;
}
// 编辑器获得焦点
onfocus () {
this .full.Instance.focus();
this .showMessage = \'获得焦点\' ;
}
// 编辑器失去焦点
onblur () {
this .full.Instance.blur();
this .showMessage = \'失去焦点\' ;
}
// 编辑器是否有焦点
isOnFocus () {
this .showMessage = this .full.Instance.isFocus() ? \'有焦点\' : \'无焦点\' ;
}
// 设置当前区域不可编辑
setDisabled () {
this .full.Instance.setDisabled();
this .showMessage = \'当前区域不可编辑\' ;
}
// 设置当前区域可编辑
setEnabled () {
this .full.Instance.setEnabled();
this .showMessage = \'当前区域可编辑\' ;
}
// 隐藏编辑器
setHide () {
this .full.Instance.setHide();
this .showMessage = \'隐藏编辑器\' ;
}
// 显示编辑器
setShow () {
this .full.Instance.setShow();
this .showMessage = \'显示编辑器\' ;
}
// 获取当前选中文本
getText () {
this .showMessage = this .full.Instance.selection.getText();
console.log( this .full.Instance.selection);
console.log( this .full.Instance.selection.getText());
}
// 在光标出插入内容
insertContent () {
this .full.Instance.execCommand(\'inserthtml\', \'<span>插入一段文本</span>\' );
}
// 设置高度方法
setHeight ($event) {
this .full.Instance.setHeight(300 );
}
// 清空文档
clearDoc () {
this .full.Instance.execCommand(\'cleardoc\' );
}
// 插入图片
insertImage () {
this .full.Instance.execCommand(\'insertimage\' , {
src: \'assets/image/a.jpeg\' ,
width: \'100\' ,
height: \'100\' ,
});
// 第二个参数:{} / [{},{}]
}
}
html-pipe.ts
import { Pipe, PipeTransform } from \'@angular/core\' ;
import { DomSanitizer } from \'@angular/platform-browser\' ;
/**
* @description 解决 [innerHtml] 解析html标签字符串 不解析内联样式问题,用管道处理
*/
@Pipe({
name: \'html\'
})
export class HtmlPipe implements PipeTransform {
constructor ( private sanitizer: DomSanitizer) {
}
transform (style) {
return this .sanitizer.bypassSecurityTrustHtml(style);
}
}
好啦,就先这些,如果要用到各种上传什么的,则需要配置后端服务。。。
引一下git: https://github测试数据/cipchk/ngx-ueditor
官网: http://fex.baidu测试数据/ueditor/#start-config
还有一个?ngx-umeditor 的: https://github测试数据/cipchk/ngx-umeditor? ?也可以看看,感觉像是优化版?
查看更多关于angular5 使用 ueditor的详细内容...