innerHTMLプロパティについて

javascript

innerHTMLプロパティについて

innerHTMLプロパティについて調べてみます。

innerHTMLプロパティはHTML5から標準化されたプロパティで、Elementノード、Documentノードで定義されています。
innerHTMLプロパティを使うと、マークアップを含んだ文字列形式で要素のコンテンツが返ります。
また、outerHTMLプロパティも同様に標準化されています。
こちらはHTMLドキュメント内のタグ情報(コンテンツの開始タグ、終了タグ)も含んだ形でマークアップ文字列が返ります。
outerHTMLはElementノードのみ定義されています。

また、HTML5で標準化されたメソッドとしてinsertAdjacentHTML()があります。
こちらはinnerHTMLプロパティと使用する場面で切り分けて使用します。

先ほどinnerHMTLプロパティは値を取得(マークアップを含んだ文字列形式で要素のコンテンツが返る)と書きましたが
innerHTMLプロパティは値を代入することもできます。

ただ、innerHTMLプロパティで値を代入すると、HTMLドキュメントのイベントが破壊されます。
javascriptのイベントが破壊されては困る場面でinsertAdjacentHTML()メソッドを使って、
HTMLドキュメント内の要素にDOMを追加することが可能になります。

以下、実際にHTMLドキュメントを使って試してみます。

HTMLドキュメントの要素を、innerHTMLを使ってプレーンテキストで取得する

HTMLドキュメントの要素を、プレーンテキストで取得する方法を、
実際に試してみました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
</head>
<body>

<div id="test1">
	<div id="p1" name="p1name">p1text</div>
	<input class="form1" id="fp1" type="text" name="test1">
	<div id="p2">p2text
		<div id="c1">c1text</div>
		<div id="c2">c2text</div>
		<div id="c3">c3text</div>
	</div>
	<div id="p3" name=3>p3text
		<div id="d1">d1text</div>
		<div id="d2">d2text</div>
		<div id="d3">d3text</div>
		<div id="d4">d4text</div>
	</div>
</div>

<script type="text/javascript">
// ID「p1」のオブジェクトを取得
let p1 = document.getElementById("p1");

// 取得したオブジェクトのattributesを確認
console.log("p1 -> " + p1.textContent);
</script>

</body>
</html>

サーバ上のHTMLはこちら(test1.html)

出力結果は次のようになります。

p1 -> p1text

HTMLドキュメントの要素を、innerHTMLを使って内容を書き変える

では次に、innerHTMLを使って、

<div id="p1" name="p1name">p1text</div>

の内容を更新してみます。

先ほどのHTMLを以下のように変更しました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
</head>
<body>

<div id="test1">
	<div id="p1" name="p1name">p1text</div>
	<input class="form1" id="fp1" type="text" name="test1">
	<div id="p2">p2text
		<div id="c1">c1text</div>
		<div id="c2">c2text</div>
		<div id="c3">c3text</div>
	</div>
	<div id="p3" name=3>p3text
		<div id="d1">d1text</div>
		<div id="d2">d2text</div>
		<div id="d3">d3text</div>
		<div id="d4">d4text</div>
	</div>
</div>

<script type="text/javascript">
// ID「p1」のオブジェクトを取得
let p1 = document.getElementById("p1");

// innerHTMLを使って内容を書き換える
p1.innerHTML = 'p1 text update !';

// 取得したオブジェクトのattributesを確認
console.log("p1 -> " + p1.textContent);
</script>

</body>
</html>

サーバ上のHTMLはこちら(test2.html)

出力結果は次のようになります。

p1 -> p1 text update !

HTMLドキュメントの内容が書き変わったので(厳密に言うと、代入したタイミングでイベントも破棄されています)、
ログ出力には最初の例(test1.html)とは異なった値が出力されました。

HTMLドキュメントの要素を、textContentを使って内容を書き変える

では、textContentを使って、HTMLドキュメントの内容を変更してみます。

先ほどのHTMLを以下のようにさらに変更しました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
</head>
<body>

<div id="test1">
	<div id="p1" name="p1name">p1text</div>
	<input class="form1" id="fp1" type="text" name="test1">
	<div id="p2">p2text
		<div id="c1">c1text</div>
		<div id="c2">c2text</div>
		<div id="c3">c3text</div>
	</div>
	<div id="p3" name=3>p3text
		<div id="d1">d1text</div>
		<div id="d2">d2text</div>
		<div id="d3">d3text</div>
		<div id="d4">d4text</div>
	</div>
</div>

<script type="text/javascript">
// ID「p1」のオブジェクトを取得
let p1 = document.getElementById("p1");

// textContentを使って内容を書き換える
p1.textContent = 'p1 text update (textContent) !';

// 取得したオブジェクトのattributesを確認
console.log("p1 -> " + p1.textContent);
</script>

</body>
</html>

サーバ上のHTMLはこちら(test3.html)

出力結果は次のようになります。

p1 -> p1 text update (textContent) !

今回確かめたように、innerHTMLとtextContentを使って、HTMLドキュメントを書き変えましたが、
どちらもコンテンツの更新はできることがわかりました。

textContentとinnerHTMLの違いについて

上記のサンプルから、textContentとinnerHTMLはどちらもHTMLドキュメントを書き変える(代入する)ことができます。
動きだけを見ると両社には違いはありませんが、
textContentプロパティは指定した要素のTextノードを全て連携した値です。
innerTextプロパティはscript要素のコンテンツを返さず、空白は取り除かれ、table (テーブル要素)は読み出し専用プロパティになる。という点が異なります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です