JavaScriptでHTMLのエスケープ処理を行う方法を現役エンジニアが解説【初心者向け】
初心者向けにJavaScriptでHTMLのエスケープ処理を行う方法について現役エンジニアが解説しています。エスケープ処理とは改行や、タブなどを文字列中で表現するための方法です。HTMLでは特別な記号を使ってエスケープ処理を実現しています。エスケープシーケンスの一覧を確認しましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
JavaScriptでHTMLのエスケープ処理を行う方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使って初心者向けに解説します。
JavaScriptについてそもそもよく分からないという方は、JavaScriptとは何なのか解説した記事をまずご覧ください。
なお本記事は、TechAcademyのオンラインブートキャンプ、JavaScript/jQuery講座の内容をもとにしています。
目次
エスケープ処理とは
エスケープ処理とは、そのままでは意図した文字列を表現できない場合に使用する、代替文字列処理のことです。
通常、JavaScriptからHTML画面に文字列を表示させる場合、「こんにちは」という文字はそのまま画面に「こんにちは」と表示されます。ところが、ある特殊な状況で「<p>こんにちは</p>」と表示させようとした場合、画面にそのまま文字列を表示させることができないケースがあります。
このような場合、<p>の代わりに次のような文字列を入力すると、HTMLデコードにより<p>に変換されます。
HTMLタグ文字列のエスケープ処理例 ( JavaScript )
<p> // HTMLデコード時に、<p>に変換される
エスケープ処理が必要になる状況
JavaScirptからのHTML要素の追加処理
JavaScriptで生成したHTMLコードを動的に画面表示する場合に、HTMLコードのエスケープが必要になる場合があります。
例えば、以下のようにjQueryのappendメソッドを使うことで、画面に<p>タグのDOMを動的に追加し、文字列を表示させることができます。
JavaScript ( jQueryを利用 )
$("#divArea").append('<p id="pdom">こんにちは</p>');
HTML
<p class="title">Hello TechAcademy !</p> <div id="divArea"></div>
画面表示1

この時、appendの引数で指定した<p id=”pdom”>は画面上でpタグとして扱われ、「こんにちは」の文字列はp要素として画面表示されます。
ところが、次のようなコードでHTMLにDOMを追加すると、意図しない画面表示となります。
JavaScript ( jQueryを利用 )
$("#divArea").append('<p id="pdom">こんにちは、<p>タグの解説をします。</p>');
画面表示2

同じ方式で画面に<p>という文字列を表示させようとしても、<p>はHTMLタグとしてDOMに変換されてしまうため、画面表示させることができません。
このような時に、HTMLエスケープ処理が必要となります。
JavaScriptとHTMLは別々のファイルでコーディングするのが通常ですが、SPAのようにAjaxを多用するアプリケーションの場合は、APIから動的に取得したデータをJavaScript側で生成したDOMにセットした後、HTMLに追加して動的に画面表示させるため、JavaScript側でのHTMLエスケープが必要になるんですね。
エスケープ処理が必要にならない状況
JavaScript側から単に画面に文字列を表示させたい場合、エスケープ処理は必要ありません。
例えば、このような場合です。
JavaScript ( jQueryを利用 )
$("#area2").text("<p>タグの解説をします");
HTML
<div id="area2"></div>
画面表示3

このようにDOM操作時においても、多くの場合エスケープ処理を必要としませんのでご安心ください。
本記事では、JavaScript側からHTMLのDOM要素を生成して追加レンダリングするという特殊な状況を前提としています。

JavaScriptなのに、HTMLエスケープが必要な理由がわかりました。

エスケープ処理を使うケースは少ないけど、覚えておくと便利だよ。
HTMLのエスケープ処理を行う方法
HTMLの仕様で定められた特殊な文字列で<p>などの文字列を置き換えることにより、エスケープ処理を行うことができます。この特殊な文字列は「エスケープシーケンス」と呼ばれています。
代表的なHTMLエスケープシーケンス
この3つを使うだけで、DOM追加時のエスケープ処理としては十分でしょう。
| エスケープ対象コード | エスケープシーケンス | 説明 |
| < | < | タグ構成記号の左側部分 |
| > | > | タグ構成記号の右側部分 |
| “ | " | ダブルクォーテーション |
HTMLエスケープシーケンス利用例
JavaScriptから追加したDOM要素で「こんにちは、<p>タグの解説をします」と表示できるようなコードを見てみましょう。
JavaScript ( jQueryを利用 )
$("#divArea").append('<p id="pdom">こんにちは、<p>タグの解説をします</p>');
HTML
<p class="title">Hello TechAcademy !</p> <div id="divArea"></div>
画面表示4

<p>タグのDOMを動的追加しながら、同時にDOM内にセットした<p>の文字列表示に成功しています。
実際に書いてみよう
今回の解説で登場した、画面を表示・操作可能なサンプルプログラムをご紹介します。実際に動かして、エスケープ処理を成功させてみましょう。
画面にはボタンが2つ用意してあり、「DOMを追加」ボタンを押下するとHTMLエスケープが必要なDOM追加処理が実行できるようになっています。
また、「既存DOMを操作」のボタンを押下すると、HTMLエスケープが不要な場合の操作を検証することができます。
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="sample.css">
<title>HelloTechAcademy</title>
</head>
<body>
<p class="title">Hello TechAcademy !</p>
<div id="divArea"></div>
<div id="area2"></div>
<br>
<button type="button" id="btn1">DOMを追加</button>
<button type="button" id="btn2">既存DOMを操作</button>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="techAcademy.js"></script>
</body>
</html>
JavaScript ( techAcademy.js )
// 「DOMを追加」ボタンを押下すると処理を開始する
$("#btn1").on("click", function() {
// $("#divArea").append('<p id="pdom">こんにちは</p>');
// $("#divArea").append('<p id="pdom">こんにちは、<p>タグの解説をします</p>');
$("#divArea").append('<p id="pdom">こんにちは、<p>タグの解説をします</p>');
});
// 「既存DOMを操作」ボタンを押下すると処理を開始する
$("#btn2").on("click", function() {
$("#area2").text("<p>タグの解説をします");
});
CSS ( sample.css )
.title {
font-size: 18px;
margin-bottom: 10px;
}
#divArea, #area2 {
width: 300px;
padding: 14px;
font-size:14px;
background-color: #74e5d2;
}
p { margin: 4px; }
#pdom { font-weight: bold;}
まとめ
今回は、JavaScriptでHTMLエスケープが必要な状況の解説と、エスケープ処理例をご紹介しました。
一度理解しておくと、いざというときにすぐに問題が解決できますので、ぜひ習得しておきましょう。
また、HTMLファイルにおけるエスケープ処理を解説する記事もありますので、こちらもご覧ください。
執筆してくれたメンター
| 寺谷文宏 ( Teratani Fumihiro )
Webアプリケーションエンジニアとして数多くのプロジェクトを経験し、フロントエンドからサーバーサイドまで総合的な開発を得意としています。 TechAcademyではフロントエンド、Javaコースを担当。 |

DOMの追加って難しいんですね。

これができると、エンジニアとしてさらにレベルアップできるよ。

サンプルを試しながら理解していきます。ありがとうございました。
TechAcademyでは、初心者でも、JavaScript・jQueryを使ったWebサービス公開を習得できる、オンラインブートキャンプを開催しています。
また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。