質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

2463閲覧

createTextNodeとtextContentの違い

salah0615

総合スコア49

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/04/24 15:25

入力値をもとにHTML文字列を組み立てる場合には、createElement/createTextNodeメソッドを使用すべきであり、textContentプロパティは使えません。

このような記述が教科書にあったのですが、よく分かりません。というのも、

html

1<form> 2 <div> 3 <label for="name">サイト名: </label><br> 4 <input id="name" name="name" type="text" size="30"> 5 </div> 6 <div> 7 <label for="url">URL: </label><br> 8 <input id="url" name="url" type="url" size="50"> 9 </div> 10 <div> 11 <input id="btn" type="button" value="追加"> 12 </div> 13 </form> 14 <div id="list"></div>

javascript

1document.addEventListener("DOMContentLoaded", function() { 2 document.getElementById("btn").addEventListener("click", function() { 3 let name = document.getElementById("name"); 4 let url = document.getElementById("url"); 5 6 let anchor = document.createElement("a"); 7 anchor.href = url.value; 8 let text = document.createTextNode(name.value); 9 anchor.appendChild(text); 10 let list = document.getElementById("list"); 11 list.appendChild(anchor); 12 }, false); 13 }, false);

このようなコードを実行させ、例えば、サイト名に<h1>test</h1>と入力すると、追加ボタンの下に<h1>text</h1>という文字列がそのまま出力されます。

しかし、このjavascriptのコードは、

javascript

1document.addEventListener("DOMContentLoaded", function() { 2 document.getElementById("btn").addEventListener("click", function() { 3 let name = document.getElementById("name"); 4 let url = document.getElementById("url"); 5 6 let anchor = document.createElement("a"); 7 anchor.href = url.value; 8 //以下、変更箇 9 anchor.textContent = name.value; 10 list.appendChild(anchor); 11 }, false); 12 }, false);

のようにもかけると思うのですが、どうでしょうか。
このような記述だと何か問題はありますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/04/24 18:18

では <h1>hoge<span>fuga</span>hoge</h1> これを dom を使ってどうやって生成する?
guest

回答3

0

ベストアンサー

nodeを意識した構造の場合createTextNodeとtextContentでは明らかに挙動が違います

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 var hoge=document.querySelector('#hoge'); 4 hoge.textContent+="xxx"; 5 hoge.appendChild(document.createTextNode("yyy")); 6 var n=hoge.firstChild; 7 while(n){ 8 console.log(n.nodeName+":"+(n.nodeValue||"").replace(/\n/g,"\n")); 9 n=n.nextSibling; 10 } 11}); 12</script> 13<pre id="hoge">aaa 14bbb 15ccc</pre>
  • textContentでは文字列を連結したデータが戻るだけ
  • createTextNodeをアペンドした場合別Nodeが挿入されていることがわかります

投稿2019/04/25 00:28

yambejp

総合スコア114757

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/04/25 00:31 編集

だからといってtextContentが問題あるわけではありません (あくまでもやっていることや結果が違うというだけ) なんならinnerHTMLやinsertAdjacentHTMLでもよいでしょう
salah0615

2019/05/03 04:31

なるほど、ありがとうございます。
guest

0

Node#textContent

対象が要素ノードであるなら、要素の子ノード全てを削除してから、テキストノードを挿入します。

HTML

1<p id="sample">foo<span>bar</span>piyo</p> 2<script> 3'use strict'; 4const element = document.getElementById('sample'); 5element.textContent = 'replaced!'; 6console.log(element.outerHTML); // <p id="sample">replaced!</p> 7</script>

Document#createTextNode

「テキストノード」を生成します。
要素ノードの子ノードがテキストノード単体ではなかった場合の挙動が textContent とは違いますが、それは表面的なもので、ノード単位で扱えるのがメリットです。

HTML

1<p id="sample"></p> 2<script> 3'use strict'; 4const element = document.getElementById('sample'); 5element.appendChild(document.createTextNode('foo')); 6element.appendChild(document.createTextNode('bar')); 7element.appendChild(document.createTextNode('piyo')); 8 9console.log(element.outerHTML); // "<p id="sample">foobarpiyo</p>" 10console.log(element.textContent); // "foobarpiyo" 11console.log(element.childNodes[0].data); // "foo" 12console.log(element.childNodes[1].data); // "bar" 13console.log(element.childNodes[2].data); // "piyo" 14</script>

Re: salah0615 さん

投稿2019/04/27 07:30

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salah0615

2019/05/03 04:33

はっきりとした違いがわかりました。ありがとうございます。
guest

0

https://developer.mozilla.org/ja/docs/Web/API/Node/textContent

Node.textContent プロパティは、ノードおよびその子孫のテキスト内容を表します。

Nodeを追加したり操作したりする機能ではなく、あるノードの子孫要素まで含めて読み書きする機能です。textContent自体が比較的あとに作られた機能であり、単純なNodeの操作を行うための機能ではなかったはずです。(innerHTMLの親戚)

たとえば<a href="">abc<b>def</b></a> であるとき、a要素のtextContentはabcdefになりますが、textContentを上書きすると内部のb要素が消えるなどの作用が働きます。

とはいえ、TextNodeを作ってそれをappendChildして...というのも面倒なので、textContentは便利に使えばいいと思います。(ちなみにcreateTextNodeなどのほうが若干動作が高速である可能性はあります)

余談:
VueやReactなどが使われることが増えて、そもそもDOMのテキストを直接操作する機会自体が減ってきている印象があります。

投稿2019/04/27 06:34

otolab

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salah0615

2019/05/03 04:32

textContentができた経緯まで教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問