ノードの挿入について
前回の投稿ではノードを作成しましたが、今回は、作成したノードを
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>
</div>
<script type="text/javascript">
// ID「test1」のノードを作成
let tn1 = document.createTextNode(" _TextNode1_ ");
console.log("tn1 -> " + tn1);
// Elementノードを取得
let p1 = document.getElementById("p1");
// 取得したノード「p1」に「tn1」を挿入
p1.appendChild(tn1);
</script>
</body>
</html>
出力結果は次のようになります。
※…HTMLソースを抜粋
<div id="test1"> <div id="p1" name="p1name">p1text _TextNode1_ </div> </div>
また、appendChild()メソッドの他、insertBefore()メソッドもあります。
insertBeforeメソッドは、appendChildとは違い、挿入する位置が「前」になります。
具体的に次のようなサンプルを書いて、試してみます。
<!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>
<div id="p2" name="p2name">p2text</div>
<div id="p3" name="p3name">p3text</div>
<div id="p4" name="p3name">p4text</div>
</div>
<script type="text/javascript">
// ID「test1」のノードを作成
let tn1 = document.createTextNode(" _TextNode1_ ");
console.log("tn1 -> " + tn1);
// Elementノードを取得
let p1 = document.getElementById("p1");
let p2 = document.getElementById("p2");
let p3 = document.getElementById("p3");
let p4 = document.getElementById("p4");
// 取得したノード「p2」の前に「tn1」を挿入
p1.insertBefore(tn1, p2);
</script>
</body>
</html>
上記を実行し結果、「_TextNode1_」は画面上にどう出力されるか試してみました。
結果、予想とは違い、
console出力上では、以下のエラーメッセージが出ました。
tn1 -> [object Text]
test2.html:26 Uncaught DOMException: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.
at https://propansystem.net/blogsample/js/037/test2.html:26:4
出力されたエラーメッセージを読むと、
「新しいノードが挿入される前のノードは、このノードの子ではありません。」
という意味になり、insertBeforeはノードの子要素に対しての命令であることがわかります。
エラー内容を踏まえて、上記のサンプルを書き変えて、次のようにしてみました。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
</head>
<body>
<div id="test1">
<div id="p1" name="p1name">
<div id="p2" name="p2name">p2text</div>
<div id="p3" name="p3name">p3text</div>
<div id="p4" name="p3name">p4text</div>
</div>
</div>
<script type="text/javascript">
// ID「test1」のノードを作成
let tn1 = document.createTextNode(" _TextNode1_ ");
console.log("tn1 -> " + tn1);
// Elementノードを取得
let p1 = document.getElementById("p1");
let p2 = document.getElementById("p2");
let p3 = document.getElementById("p3");
let p4 = document.getElementById("p4");
// 取得したノード「p2」の前に「tn1」を挿入
p1.insertBefore(tn1, p2);
</script>
</body>
</html>
htmlにアクセスすると、画面には
_TextNode1_ p2text p3text p4text
という結果が出力されます。
「id=”p2″」のノードの前に、新規作成した「_TextNode1_」のノードが挿入されていることがわかります。
さらに、「ノード「p3」の前に「tn1」を挿入」したパターンも試してみます。
htmlは以下のようにしました。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
</head>
<body>
<div id="test1">
<div id="p1" name="p1name">
<div id="p2" name="p2name">p2text</div>
<div id="p3" name="p3name">p3text</div>
<div id="p4" name="p3name">p4text</div>
</div>
</div>
<script type="text/javascript">
// ID「test1」のノードを作成
let tn1 = document.createTextNode(" _TextNode1_ ");
console.log("tn1 -> " + tn1);
// Elementノードを取得
let p1 = document.getElementById("p1");
let p2 = document.getElementById("p2");
let p3 = document.getElementById("p3");
let p4 = document.getElementById("p4");
// 取得したノード「p3」の前に「tn1」を挿入
p1.insertBefore(tn1, p3);
</script>
</body>
</html>
出力結果は、以下のようになります。
p2text _TextNode1_ p3text p4text
insertBeforeメソッドの第2引数を「id=”p3″」にしたため、
新規作成した「_TextNode1_」のノードが
<div id="p3" name="p3name">p3text</div>
の前に挿入されていることがわかります。