高校生物550830 views
教育149270 views
中学社会667895 views
小学算数1198604 views
中学理科1629033 views
ヒストリア287936 views
りんご203078 views
高校国語787186 views
LaTeX960097 views
高校物理159249 views

insertBefore で特定の位置に挿入する

insertBefore は、指定した要素の直前に新しい要素を挿入するメソッドです。appendChild が末尾に追加するのに対し、任意の位置に挿入できます。

基本的な使い方

parent.insertBefore(newNode, referenceNode) で、referenceNode の直前に newNode を挿入します。

<ul id="list">
  <li id="item1">項目1</li>
  <li id="item2">項目2</li>
  <li id="item3">項目3</li>
</ul>
const list = document.getElementById('list');
const item2 = document.getElementById('item2');

const newItem = document.createElement('li');
newItem.textContent = '新しい項目';

list.insertBefore(newItem, item2);
// 結果: 項目1 → 新しい項目 → 項目2 → 項目3

referenceNode が null の場合

参照ノードが null だと、末尾に追加されます。appendChild と同じ動作になります。

list.insertBefore(newItem, null); // 末尾に追加

先頭に追加する

最初の子要素を参照ノードにすれば、先頭に追加できます。

const list = document.getElementById('list');
const newItem = document.createElement('li');
newItem.textContent = '先頭に追加';

list.insertBefore(newItem, list.firstChild);

実際に動かしてみよう

HTML
CSS
JavaScript
<ul id="list">
  <li>項目1</li>
  <li id="target">項目2(この前に挿入)</li>
  <li>項目3</li>
</ul>
<button id="btn">項目を挿入</button>
#list li {
  padding: 4px;
}
.new {
  background: #ffeb3b;
}
let count = 0;
document.getElementById('btn').addEventListener('click', function() {
  count++;
  const newItem = document.createElement('li');
  newItem.textContent = '挿入された項目 ' + count;
  newItem.className = 'new';
  
  const list = document.getElementById('list');
  const target = document.getElementById('target');
  list.insertBefore(newItem, target);
});

insertBefore の注意点

親要素で呼ぶ

insertBefore は親要素のメソッドです。挿入したい要素自身ではなく、その親要素で呼び出します。

参照ノードは子要素

参照ノードは、その親要素の直接の子要素である必要があります。孫要素を指定するとエラーになります。

より新しい API:before と after

現代の JavaScript では、beforeafter メソッドも使えます。

const target = document.getElementById('target');

const newItem = document.createElement('li');
newItem.textContent = '新しい項目';

target.before(newItem);  // target の前に挿入
target.after(newItem);   // target の後ろに挿入

こちらのほうが直感的ですが、IE には対応していません。