こんにちは。zuka(@beginaid)です。
この記事では自分がJavaScriptを復習した際につまずいたポイントをまとめていきます。今回は,JavaScriptにおけるinnerHTML・textContent・valueの違いに関してです。
なお,本記事では分かりやすさを優先するため,用語を正確に使わない部分や理解が曖昧な部分を残すことがあります。予めご了承ください。間違いがございましたら,お問い合わせフォームまたは最下部コメント欄よりご指摘いただけますと助かります。
結論
三者のザックリした違いは以下の通りです。
- innerHTML
-
Element
オブジェクトのプロパティ。getElementById
などでElement
オブジェクトを取得した後に,生のHTMLを操作したい場合に使う。 - textContent
-
Node
オブジェクトのプロパティ。したがって,Node
を継承したElement
にも適用できる。innerHTML
とは異なりtext
のみを操作するためパフォーマンスが高く,innerHTML
と比べてクロスサイトスクリプティングにも耐性がある。 - value
-
文脈によって指し示す概念が変わる。多くの場合は,
input
要素やtextarea
要素の属性として使われる。例えば全てのinput
要素が紐づいているHTMLInputElement
オブジェクトでも利用できる。
ElementとNode
Element
オブジェクトはNode
オブジェクトを継承しています。MDNによると,主な継承関係は以下のようになっています。
Element
オブジェクトは,WebページをDOMツリー(木構造と思ってもらえればOKです)における要素の基底クラスとされています。感覚的には,HTMLの要素をクラス化したものというようなイメージです。様々な種類があるElement
を同一視して操作を行うことができるクラスがNode
になります。なお,HTMLInputElement
オブジェクトはHTMLElement
を継承しています。
value
便宜上まずはvalue
から説明します。value
は文脈によって指し示す内容が変わってくる厄介者ですが,javascriptではinput
要素に入力された値という意味で使われる場合が多いです。具体的には,input
要素をgetElementById
でElement
オブジェクト化した(恐らくHTMLInputElement
になっている)ものに対して.value
で取り出すことができます。
例えば,HTMLのbody
に以下が記述されているとします。
<p>
<input id="input" type="text"/>
<input id="button" type="button" value="表示する" onclick="extract()"/>
</p>
<div id="output">
</div>
すると,ブラウザには以下のように表示されます。
入力欄に打ち込まれた文字列を取得したい場合に,value
を使います。以下のjavascriptを利用することで入力された文字列を変数input
に代入することができます。
<script>
function extract(){
// 入力要素をオブジェクトにして,そのオブジェクトのvalueを抽出する
let inputText = document.getElementById("inputText").value;
}
</script>
innerHTML
innerHTML
はElement
オブジェクトのプロパティです。具体的には,HTMLをHTMLのまま操作したいといったような場合に利用されます。簡単な例をみてみましょう。
例えば,javascriptを用いてHTMLを書き換えたいとします。具体的には,先ほどの例におけるinput
要素で入力された値をdivタグで表示させたいとします。このような操作は,innerHTML
を用いて以下のように記述することができます。まずは,input
要素でクリックが起こったときに呼び出す関数を指定しましょう。今回はprintText()
とします。
<p>
<input id="inputText" type="text"/>
<input id="button" type="button" value="表示する" onclick="printText()" />
</p>
<div id="output">
</div>
続いて,javascriptを用いてidが"output"
のタグを抽出して,その中身にHTMLを直接書き込んでしまいましょう。ただし,HTMLではidが一意であるためにidが"output"
のタグというのは一意に決まることに注意しましょう。
<script>
function printText(){
// 入力要素をオブジェクトにする
let inputText = document.getElementById("inputText").value;
// 出力要素をオブジェクトにする
let output = document.getElementById("output");
// オブジェクトになった出力要素の中身にinputTextの値であるvalueを設定する。pタグは適当につけている
output.innerHTML = `<p> ${inputText} </p>`;
}
</script>
上記scriptタグをbodyの最後に挿入すると,以下のようになります。
textContent
innerHTML
はHTMLを記述する必要がありましたが,テキストだけを操作するプロパティがtextContent
になります。具体的には,以下の部分を変更すればOKです。
// innerHTMLではHTMLを書き換える部分を以下のように記述していた
// output.innerHTML = `<p> ${inputText} </p>`;
// textContentを利用すれば以下のように記述できる
output.textContent = inputText;
output
はElement
オブジェクトでしたので,Element
を継承するNode
オブジェクトのプロパティであるtextContent
も利用できるということですね。
コメント