JavaScriptの学習 HTMLエディタの作成 その1

2022/12/14

JavaScript

目次
JavaScript HTML エディタ

HTMLコードをタイプするのが面倒

ブログで、箇条書き(番号あり/なし)が混在した記述を行う場合、手動でHTMLコードをタイプするのが面倒くさくなりました。

例えば、以下のような表示です。
  1. AAA
    • aaa
  2. BBB
    • bbb

こうしたOLタグとULタグが入れ子になった表示を実現するには、以下のHTMLコードを記述する必要があります。

<ol>
  <li>AAA</li>
  <ul>
    <li>aaa</li>
  </ul>    
  <li>BBB</li>
  <ul>
    <li>bbb</li>
  </ul>
</ol>

しかし、 Blogger, 等のブログツールは、OLタグとULタグの入れ子に対応していないため、毎度、手動でHTMLコードをタイプする必要があるのです。

HTMLエディタの作成を検討

OLタグとULタグの入れ子や、それらのインデント、等に対応した、シンプルなHTMLエディタが欲しいと思い、自分で作成することにしました。

シンプルHTMLエディタ

テキスト入力

HTMLコード出力

使い方

  • テキスト入力のエリアに文章を入力
  • ULタグ or OLタグを追加する場合は、追加したい文章をマウスで選択した後に、ULボタン or OLボタンをクリック
  • インデントを追加する場合は、対象の文章をマウスで選択した後に、> or < ボタンをクリック
  • HTMLコードを出力する場合は、HTMLボタンをクリック

ソースコード解説

HTMLソースコード

<div>
  テキスト入力
</div>
<div class="MyArea" id="MyContent" contenteditable></div>

<div>
  <button class="MyBtn" onclick='document.execCommand("insertUnorderedList");'>UL</button>
  <button class="MyBtn" onclick='document.execCommand("insertOrderedList");'>OL</button>
  <button class="MyBtn" onclick='document.execCommand("indent");'>></button>
  <button class="MyBtn" onclick='document.execCommand("outdent");'><</button>
<div>
<br>

<div>
  HTMLコード出力
</div>
<div class="MyArea" id="MyHTML"></div>

<div>
  <button class="MyBtn" onclick="ShowHTML();">HTML</button>
</div>

<style>
.MyBtn {
  width: 55px;
}

.MyArea {
  text-align: left;
  height: 150px;
  width: 80%;
  margin-bottom: 5px;
  border: 1px solid gray;
  overflow: auto;
}
</style>
HTMLソースコードのポイントを次に示します。

行番号4では、DIVタグにcontenteditable属性を付加し、DIVタグのエリアをテキストエディタとして使用できるように設定しています。
この機能は、HTML5から導入されたものです。

行番号7~10では、HTMLエディタのコアである、ULタグ、OLタグ、右にインデント、左にインデントの機能が記述されています。

これらの機能を実現するために使用されているのがexecCommand()です。 
  • insertUnorderedList
    • マウスで選択した行をULタグ & LIタグで囲みます
  • insertOrderedList
    • マウスで選択した行をOLタグ & LIタグで囲みます
  • indent
    • マウスで選択した行を右方向にインデントします
  • outdent
    • マウスで選択した行を左方向にインデントします
execCommand()は、上記以外にも様々なコマンドをサポートしており、大変有用な命令です。

しかし、非常に残念なことに、execCommand()は非推奨の命令となっており、今後、ブラウザのバージョンアップが進むことで、使用できなくなります。

JavaScriptソースコード

function ShowHTML() {
  const MyContent = document.querySelector('#MyContent');
  let MyHTML = document.querySelector('#MyHTML');
  MyHTML.textContent = MyContent.innerHTML;
}

上記のJavaScriptは、HTMLボタンに割り当てられており、HTMLボタンをクリックするたびに実行されます。

残念なところ

execCommand()を利用することで、残念な結果になる場合があります。
例えば、以下のケースです。

AAA
  1. BBB
CCC

CCCの行をクリックした後、OLボタンをクリックすると、以下の状態になることを期待するのですが…
 
AAA
  1. BBB
  2. CCC

実際は、次のようになってしまいます。
 
AAA
  1. BBB
  1. CCC

結果的には、execCommand()を利用しても期待する動作にならない場合があるため、何らかの対応が必要となります。

追記
使用するブラウザによって、挙動が異なるようです。
  • Firefox バージョン 108.0(64ビット)
    • 上記に記載した通りの動作になります
  • Microsoft Edge バージョン 108.0.1462.46(公式ビルド)(64ビット)
    • 上記の動作とは異なり、CCCの行の番号は「2」となり、期待した通りの動作となります
execCommand()はブラウザによって挙動が異なることが分かりましたので、いずれにしても、代替方法を検討していきたいと思います。

課題

とりあえず、今回はHTMLエディタの作成が初めてであったため、非推奨のexecCommand()を使用した実装を行いました。

今後は、execCommand()の代替について、検討していきたいと思います。

自己紹介

自分の写真
株式トレード歴は15年以上、専業株式トレーダーになって5年以上、今も現役で活動中

Blogger. | Designed by QooQ.