angular5 使用 ueditor


  項目中新功能需要用到富文本編輯,查找了幾個富文本編輯器,結合需求以及以后產品說的可能擴展,最終選擇了ueditor

  首先就是功能超多,一步到位,估計都不用二次開發就夠用了:

  使用的話,首先要裝包:

npm install ngx-ueditor --save

  然后就是引入到模塊,然后配置前端配置項:

  這是目錄結構(沒有在根目錄引入,就為了寫demo):

  接着就是這個 ueditor 這個文件夾,需要去對應地址去下載: https://ueditor.baidu.com/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.component.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.component.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.component.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.component.html',
  styleUrls: [ './u-editor.component.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.com/cipchk/ngx-ueditor

  官網:http://fex.baidu.com/ueditor/#start-config

  還有一個 ngx-umeditor 的: https://github.com/cipchk/ngx-umeditor  也可以看看,感覺像是優化版?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM