JS的 execCommand 方法實現一個簡單的富文本編輯器

一、document.execCommand()

從其名字上可以看出execCommand()是用來執行命令的,當一個HTML文檔切換到設計模式時,document暴露 execCommand方法,該方法允許運行命令來操縱可編輯內容區域的元素。如保存文件、打開新文件、撤消、重做、剪切、復制、刪除,字體大小、背景顏色等操作,有了這個方法就可以很容易的實現網頁中的文本編輯器

【1】語法

let bool = document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)

【2】參數

  • aCommandName:命令名稱
  • aShowDefaultUI:交互方式, Boolean值,true的話將顯示對話框,如果為false的話,則不顯示對話框,一般為 false
  • aValueArgument:動態參數,例如:插入圖片需要額外的參數(image 的 url),默認為null

【3】返回值

返回一個布爾值Boolen,如果是 false 則表示操作不被支持或未被啟用

二、命令

【1】backColor

修改文檔的背景顏色。在styleWithCss模式下,則只影響容器元素的背景顏色。這需要一個<color> 類型的字符串值作為參數傳入。注意,IE瀏覽器用這個設置文字的背景顏色。

document.execCommand('BackColor', 'false', sColor);

【2】bold

開啟或關閉選中文字或插入點的粗體字效果。IE瀏覽器使用 <strong>標簽,而不是<b>標簽。

document.execCommand('Bold', 'false', null);

【3】copy

拷貝當前選中內容到剪貼板。啟用這個功能的條件因瀏覽器不同而不同,而且不同時期,其啟用條件也不盡相同。使用之前請檢查瀏覽器兼容表,以確定是否可用。

document.execCommand('Copy', 'false', null );

【4】createLink

將選中內容創建為一個錨鏈接。這個命令需要一個hrefURI字符串作為參數值傳入。URI必須包含至少一個字符,例如一個空格。(瀏覽器會創建一個空鏈接)

document.execCommand('CreateLink', 'false', sLinkURL);

【5】cut

剪貼當前選中的文字并復制到剪貼板。啟用這個功能的條件因瀏覽器不同而不同,而且不同時期,其啟用條件也不盡相同。使用之前請檢查瀏覽器兼容表,以確定是否可用。

document.execCommand('Cut', 'false', null);

【6】ClearAuthenticationCache

清除緩存中的所有身份驗證憑據。

document.execCommand('ClearAuthenticationCache', 'false', null);

【7】contentReadOnly

通過傳入一個布爾類型的參數來使能文檔內容的可編輯性。(IE瀏覽器不支持)

document.execCommand('contentReadOnly', 'false', sBoolen);

【8】decreaseFontSize

給選中文字加上 <small> 標簽,或在選中點插入該標簽。(IE瀏覽器不支持)

document.execCommand('decreaseFontSize', 'false', null);

【9】delete

刪除選中部分.

document.execCommand('delete', 'false', null);

【10】defaultParagraphSeparator

更改在可編輯文本區域中創建新段落時使用的段落分隔符。

document.execCommand('defaultParagraphSeparator', 'false', 'br');

【11】enableAbsolutePositionEditor

啟用或禁用允許移動絕對定位元素的抓取器。Firefox 63 Beta/Dev Edition 默認禁用此功能(bug 1449564)。

document.execCommand('enableAbsolutePositionEditor', 'false', null);

【12】enableInlineTableEditing

啟用或禁用表格行和列插入和刪除控件。(IE瀏覽器不支持)

document.execCommand('enableInlineTableEditing', 'false', null);

【13】enableObjectResizing

啟用或禁用圖像和其他對象的大小可調整大小手柄。(IE瀏覽器不支持)

document.execCommand('enableObjectResizing', 'false', null);

【14】fontName

在插入點或者選中文字部分修改字體名稱. 需要提供一個字體名稱字符串 (例如:"Arial")作為參數。

document.execCommand('fontName', 'false', sFontName);

【15】fontSize

在插入點或者選中文字部分修改字體大小. 需要提供一個HTML字體尺寸 (1-7) 作為參數。

document.execCommand('fontSize', 'false', sFontSize);

【16】foreColor

在插入點或者選中文字部分修改字體顏色. 需要提供一個顏色值字符串作為參數。

document.execCommand('foreColor', 'false', sForeColor);

【17】formatBlock

添加一個HTML塊式標簽在包含當前選擇的行, 如果已經存在了,更換包含該行的塊元素 (在 Firefox中, BLOCKQUOTE 是一個例外 -它將包含任何包含塊元素). 需要提供一個標簽名稱字符串作為參數。幾乎所有的塊樣式標簽都可以使用(例如. "H1", "P", "DL", "BLOCKQUOTE"). (IE瀏覽器僅僅支持標題標簽 H1 - H6, ADDRESS, 和 PRE,使用時還必須包含標簽分隔符 < >, 例如 "<H1>".)

document.execCommand('formatBlock', 'false', sTagName);

【18】forwardDelete

刪除光標所在位置的字符。 和按下刪除鍵一樣。

document.execCommand('forwardDelete', 'false', null );

【19】heading

添加一個標題標簽在光標處或者所選文字上。 需要提供標簽名稱字符串作為參數 (例如. "H1", "H6"). (IE 和 Safari不支持)

document.execCommand('heading', 'false', sTagName);

【20】hiliteColor

更改選擇或插入點的背景顏色。需要一個顏色值字符串作為值參數傳遞。 UseCSS 必須開啟此功能。(IE瀏覽器不支持)

document.execCommand('hiliteColor', 'false', sHiliteColor);

【21】increaseFontSize

在選擇或插入點周圍添加一個BIG標簽。(IE瀏覽器不支持)

document.execCommand('increaseFontSize', 'false', null );

【23】indent

縮進選擇或插入點所在的行, 在 Firefox 中, 如果選擇多行,但是這些行存在不同級別的縮進, 只有縮進最少的行被縮進。

document.execCommand('indent', 'false', null );

【24】insertBrOnReturn

控制當按下Enter鍵時,是插入 br 標簽還是把當前塊元素變成兩個。(IE瀏覽器不支持)

document.execCommand('insertBrOnReturn', 'false', null );

【25】insertHorizontalRule

在插入點插入一個水平線(刪除選中的部分)

document.execCommand('insertHorizontalRule', 'false', null );

【26】insertHTML

在插入點插入一個HTML字符串(刪除選中的部分)。需要一個個HTML字符串作為參數。(IE瀏覽器不支持)

document.execCommand('insertHTML', 'false', sTagName);

【27】insertImage

在插入點插入一張圖片(刪除選中的部分)。需要一個 URL 字符串作為參數。這個 URL 圖片地址至少包含一個字符。空白字符也可以(IE會創建一個鏈接其值為null)

document.execCommand('insertImage', 'false', sURL);

【28】insertOrderedList

在插入點或者選中文字上創建一個有序列表

document.execCommand('insertOrderedList', 'false', null );

【29】insertUnorderedList

在插入點或者選中文字上創建一個無序列表。

document.execCommand('insertUnorderedList', 'false', null );

【30】insertParagraph

在選擇或當前行周圍插入一個段落。(IE會在插入點插入一個段落并刪除選中的部分.)

document.execCommand('insertParagraph', 'false', null );

【31】insertText

在光標插入位置插入文本內容或者覆蓋所選的文本內容。

document.execCommand('insertText', 'false', sText);

【32】italic

在光標插入點開啟或關閉斜體字。 (Internet Explorer 使用 EM 標簽,而不是 I )

document.execCommand('italic', 'false', null );

【33】justifyCenter

對光標插入位置或者所選內容進行文字居中。

document.execCommand('justifyCenter', 'false', null );

【34】justifyFull

對光標插入位置或者所選內容進行文本對齊。

document.execCommand('justifyFull', 'false', null );

【35】justifyLeft

對光標插入位置或者所選內容進行左對齊。

document.execCommand('justifyLeft', 'false', null );

【36】justifyRight

對光標插入位置或者所選內容進行右對齊。

document.execCommand('justifyRight', 'false', null );

【37】outdent

對光標插入行或者所選行內容減少縮進量。

document.execCommand('outdent', 'false', null );

【38】paste

在光標位置粘貼剪貼板的內容,如果有被選中的內容,會被替換

document.execCommand('paste', 'false', null );

【39】redo

重做被撤銷的操作。

document.execCommand('redo', 'false', null );

【40】removeFormat

對所選內容去除所有格式

document.execCommand('removeFormat', 'false', null );

【41】selectAll

選中編輯區里的全部內容。

document.execCommand('selectAll', 'false', null);

【42】strikeThrough

在光標插入點開啟或關閉刪除線。

document.execCommand('strikeThrough', 'false', null);

【43】subscript

在光標插入點開啟或關閉下角標。

document.execCommand('subscript', 'false', null);

【44】superscript

在光標插入點開啟或關閉上角標。

document.execCommand('superscript', 'false', null);

【45】underline

在光標插入點開啟或關閉下劃線。

document.execCommand('underline', 'false', null);

【46】undo

撤銷最近執行的命令。

document.execCommand('undo', 'false', null);

【47】unlink

去除所選的錨鏈接的<a>標簽

document.execCommand('unlink', 'false', null);

三、簡單的富文本編輯器

【1】效果

【2】代碼

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>

<body>
  <div class="wrap">
    <div id="butGroup">
      <button id="undo" :title="撤銷">撤銷</button>
      <button id="redo" :title="恢復">恢復</button>
      <button id="bold" :title="加粗">加粗</button>
      <button id="italic">傾斜</button>
      <button id="underline">下劃線</button>
      <button id="strikeThrough">刪除線</button>
      <button id="h1">H1</button>
      <button id="h2">H2</button>
      <button id="h3">H3</button>
      <button id="foreColor">字體顏色</button>
      <button id="hiliteColor">字體背景</button>
      <button id="insertOrderedList">有序</button>
      <button id="insertUnorderedList">無序</button>
      <button id="save">提交</button>
    </div>
    <iframe id='HtmlEdit' style="width:800px; height: 400px" marginWidth='10px' marginHeight='10px'></iframe>
  </div>

  <div id="box" style="height: 400px;width: 800px;border: 1px solid black">
  </div>

  <script language="javascript">
    window.onload = function () {
      let editor = document.getElementById("HtmlEdit").contentWindow;//獲取iframe Window 對象
      let doc = document.getElementById("HtmlEdit").contentDocument; //獲取iframe documen 對象
      let butGroup = document.getElementById('butGroup');
      let box = document.getElementById('box');
      //設置事件監聽
      butGroup.addEventListener('click', function (e) {
        //通過e 事件 獲取點擊的標簽 id
        switch (e.target.id) {
          case 'undo': undo(); break;
          case 'redo': redo(); break;
          case 'bold': bold(); break;
          case 'copy': copy(); break;
          case 'italic': italic(); break
          case 'underline': underline(); break;
          case 'strikeThrough': strikeThrough(); break;
          case 'h1': h1(); break;
          case 'h2': h2(); break;
          case 'h3': h3(); break;
          case 'foreColor': foreColor(); break;
          case 'hiliteColor': hiliteColor(); break;
          case 'insertOrderedList': insertOrderedList(); break;
          case 'insertUnorderedList': insertUnorderedList(); break;
          case 'save': save(); break
        }
      })

      //只需鍵入以下設定,iframe立刻變成編輯器。
      editor.document.designMode = 'On';  //打開設計模式
      editor.document.contentEditable = true;// 設置元素為可編輯

      // 撤銷
      let undo = () => { editor.document.execCommand('undo', false, null) }

      // 恢復
      let redo = () => { editor.document.execCommand('redo', false, null) }

      // 加粗
      let bold = () => { editor.document.execCommand('bold', false, null) }

      // 斜體
      let italic = () => { editor.document.execCommand('italic', false, null) }

      // 下劃線
      let underline = () => { editor.document.execCommand('underline', false, null) }

      // 刪除線
      let strikeThrough = () => { editor.document.execCommand('strikeThrough', false, null) }

      // H1
      let h1 = () => { editor.document.execCommand('fontSize', false, 7) }

      // H2
      let h2 = () => { editor.document.execCommand('fontSize', false, 6) }

      // H3
      let h3 = () => { editor.document.execCommand('fontSize', false, 5) }

      // 字體顏色
      let foreColor = () => { editor.document.execCommand('foreColor', false, 'red') }

      // 字體背景
      let hiliteColor = () => { editor.document.execCommand('hiliteColor', false, 'yellow') }

      // 有序列表
      let insertOrderedList = () => { editor.document.execCommand('insertOrderedList', false, null) }

      // 無序列表
      let insertUnorderedList = () => { editor.document.execCommand('insertUnorderedList', false, null) }

      // 提交
      let save = () => { box.innerHTML = doc.body.innerHTML }
    }
  </script>
</body>

</html>

文章每周持續更新,可以微信搜索「 前端大集錦 」第一時間閱讀,回復【視頻】【書籍】領取200G視頻資料和30本PDF書籍資料

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容