読み込み中...

JavaScriptでのappendとappendToの適切な使い分け例12選

JavaScriptでappendとappendToを使い分ける12種類の例 JS
この記事は約21分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●appendとappendToの基本的な違い

JavaScriptでDOM要素を追加する際、appendとappendToという2つのメソッドがよく使われます。

初心者のうちは、この2つの違いがわかりにくいかもしれません。

でも大丈夫、これからその違いを一緒に見ていきましょう。

○appendの使い方

appendは、指定した要素の子要素として新しい要素を追加するメソッドです。

つまり、追加される要素は、常に指定した要素の中に入ることになります。

使い方はとてもシンプルで、追加したい要素を引数に指定するだけです。

○サンプルコード1:appendで要素を追加

// HTMLに次の要素があるとします
<div id="parent"></div>

// JavaScriptでappendを使って子要素を追加
const parent = document.getElementById('parent');
const child = document.createElement('p');
child.textContent = 'これは子要素です';

parent.append(child);

実行結果

<div id="parent">
  <p>これは子要素です</p>
</div>

このように、appendを使うと指定した要素の子要素として新しい要素が追加されます。

シンプルですが、とても便利なメソッドですね。

○appendToの使い方

一方、appendToは追加する要素自体のメソッドで、指定した要素の子要素になるように自分自身を追加します。

つまり、appendが親要素から子要素を追加するのに対し、appendToは子要素から親要素を指定して追加するイメージです。

○サンプルコード2:appendToで要素を追加

// HTMLに次の要素があるとします
<div id="parent"></div>

// JavaScriptでappendToを使って子要素を追加
const parent = document.getElementById('parent');
const child = document.createElement('p');
child.textContent = 'これは子要素です';

child.appendTo(parent);

実行結果

<div id="parent">
  <p>これは子要素です</p>
</div>

appendToを使った場合も、結果はappendを使ったときと同じになります。

でも、要素を追加する際の発想が逆になっているのがポイントです。

●パフォーマンスを考慮した使い分け

先ほどは、appendとappendToの基本的な違いについて見てきました。

でも、実際のWebアプリケーション開発では、パフォーマンスも重要な要素になってきます。

特に、大量の要素を追加する場合や、動的に要素を生成する場合は、使用するメソッドによって処理速度に差が出ることがあるんです。

○サンプルコード3:複数の要素を追加する場合

例えば、リストに複数のアイテムを追加するとしましょう。

appendを使う場合は、次のようなコードになります。

const list = document.getElementById('myList');

for (let i = 0; i < 5; i++) {
  const item = document.createElement('li');
  item.textContent = `アイテム ${i + 1}`;
  list.append(item);
}

実行結果

<ul id="myList">
  <li>アイテム 1</li>
  <li>アイテム 2</li>
  <li>アイテム 3</li>
  <li>アイテム 4</li>
  <li>アイテム 5</li>
</ul>

この場合、appendを使って要素を追加しています。

でも、appendはDOM操作のたびに要素をレンダリングするため、大量の要素を追加する場合は非効率になってしまうんです。

○サンプルコード4:大量の要素を追加する場合

そこで、パフォーマンスを改善するために、一時的なフラグメントを使ってまとめて追加する方法があります。

const list = document.getElementById('myList');
const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {
  const item = document.createElement('li');
  item.textContent = `アイテム ${i + 1}`;
  fragment.append(item);
}

list.append(fragment);

実行結果

<ul id="myList">
  <li>アイテム 1</li>
  <li>アイテム 2</li>
  ...
  <li>アイテム 999</li>
  <li>アイテム 1000</li>
</ul>

この方法だと、一時的なフラグメントにまとめて要素を追加し、最後にそのフラグメントをリストに追加するので、DOM操作の回数が減り、パフォーマンスが向上するんです。

appendToを使う場合も同様で、要素をまとめて追加することでパフォーマンスを改善できます。

大量の要素を扱う場合は、こうした工夫が必要になってくるでしょう。

●要素の位置を考慮した使い分け

これまでは、要素を追加する際のパフォーマンスについて考えてきました。

でも、実際のWebアプリケーション開発では、要素を追加する位置も重要になってきます。

特定の位置に要素を挿入したい場合や、動的に生成した要素を追加する場合など、状況に応じて適切なメソッドを選ぶ必要があるんです。

○サンプルコード5:特定の位置に要素を追加

例えば、リストの特定の位置に新しい要素を追加したいとしましょう。

appendやappendToでは、常に最後尾に追加されてしまいます。

そこで、insertBeforeメソッドを使って、指定した要素の前に新しい要素を挿入することができます。

const list = document.getElementById('myList');
const newItem = document.createElement('li');
newItem.textContent = '新しいアイテム';

// 2番目のアイテムの前に挿入
const secondItem = list.children[1];
list.insertBefore(newItem, secondItem);

実行結果

<ul id="myList">
  <li>アイテム 1</li>
  <li>新しいアイテム</li>
  <li>アイテム 2</li>
  <li>アイテム 3</li>
</ul>

insertBeforeを使うことで、リストの任意の位置に要素を追加できるようになります。

これは、appendやappendToでは実現できない柔軟な操作ですね。

○サンプルコード6:動的に生成した要素を追加

もう1つ、動的に生成した要素を追加する場合についても考えてみましょう。

JavaScriptを使ってDOM要素を動的に生成し、それを既存の要素に追加することがよくあります。

const list = document.getElementById('myList');

// 新しいアイテムを動的に生成
const newItem = document.createElement('li');
newItem.textContent = '動的に生成したアイテム';

// 動的に生成した要素をリストに追加
list.append(newItem);

実行結果

<ul id="myList">
  <li>アイテム 1</li>
  <li>アイテム 2</li>
  <li>アイテム 3</li>
  <li>動的に生成したアイテム</li>
</ul>

この場合、appendを使って動的に生成した要素をリストに追加しています。

もちろん、appendToを使っても同じ結果が得られます。

●チェーンメソッドを活用した使い分け

jQueryを使ったことがある人なら、メソッドチェーンという言葉を聞いたことがあるかもしれません。

これは、複数のメソッドを連続して呼び出すことで、コードの可読性を高める手法です。

実は、appendとappendToを使う際にも、このメソッドチェーンを活用することができるんです。

○サンプルコード7:appendとappendToを組み合わせる

例えば、リストに新しい要素を追加した後、そのリストを別の要素に追加するとしましょう。

appendとappendToを組み合わせることで、シンプルに記述できます。

const list = document.getElementById('myList');
const container = document.getElementById('container');

const newItem = document.createElement('li');
newItem.textContent = '新しいアイテム';

list.append(newItem).appendTo(container);

実行結果

<div id="container">
  <ul id="myList">
    <li>アイテム 1</li>
    <li>アイテム 2</li>
    <li>アイテム 3</li>
    <li>新しいアイテム</li>
  </ul>
</div>

このように、appendで新しい要素をリストに追加した後、そのリストをappendToでコンテナ要素に追加しています。

メソッドチェーンを使うことで、一連の処理を1行で表現できるようになります。

○サンプルコード8:複数のメソッドをチェーンで繋げる

もう1つ、メソッドチェーンを使った例を見てみましょう。

要素を追加した後、その要素にクラスを付与し、さらにスタイルを変更するとします。

const list = document.getElementById('myList');

const newItem = document.createElement('li');
newItem.textContent = '新しいアイテム';

list.append(newItem)
    .children[list.children.length - 1]
    .classList.add('new-item')
    .style.color = 'red';

実行結果

<ul id="myList">
  <li>アイテム 1</li>
  <li>アイテム 2</li>
  <li>アイテム 3</li>
  <li class="new-item" style="color: red;">新しいアイテム</li>
</ul>

ここでは、appendで新しい要素を追加した後、childrenプロパティで追加した要素を取得し、classListでクラスを付与し、styleでスタイルを変更しています。

この一連の処理をメソッドチェーンで繋げることで、コードの流れが一目瞭然になります。

●よくあるエラーと対処法

JavaScriptでappendやappendToを使っていると、時々思わぬエラーに遭遇することがあります。

特に初心者のうちは、エラーメッセージを見ても原因がわからず、頭を抱えてしまうこともあるでしょう。

でも大丈夫、ここではそんなエラーの原因と対処法を一緒に見ていきます。

○要素が追加されない場合の原因と解決策

まず、要素が追加されないというエラーについて考えてみましょう。

appendやappendToを使っているのに、期待通りに要素が追加されないという状況です。

考えられる原因の1つは、セレクターが間違っていることです。

JavaScript側で指定したセレクターが、HTML内の要素と一致していないと、要素を取得できません。

// HTML
<ul id="my-list"></ul>

// JavaScript
const list = document.getElementById('myList');
list.append(newItem); // エラー: listがnullになる

この例では、HTMLではmy-listというidを使っているのに、JavaScript側ではmyListというidを指定しています。

この場合、getElementByIdはnullを返すため、appendを呼び出すとエラーになります。

解決策は、セレクターを正しく指定することです。

HTML側とJavaScript側で、id名やクラス名が一致しているか確認しましょう。

○パフォーマンス低下を引き起こすコードの改善方法

次に、パフォーマンス低下を引き起こすコードについて見ていきます。

appendやappendToを使う際に、意図せずパフォーマンスを悪化させてしまうことがあります。

例えば、大量の要素を1つずつ追加する場合などです。

const list = document.getElementById('my-list');

for (let i = 0; i < 1000; i++) {
  const item = document.createElement('li');
  item.textContent = `アイテム ${i}`;
  list.append(item);
}

この例では、1000個の要素を1つずつ追加しています。

でも、appendを呼び出すたびにレンダリングが発生するため、パフォーマンスが低下してしまいます。

改善方法は、documentFragmentを使うことです。

documentFragmentは、メモリ上に存在する仮想的なDOM要素で、レンダリングを伴いません。

const list = document.getElementById('my-list');
const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {
  const item = document.createElement('li');
  item.textContent = `アイテム ${i}`;
  fragment.append(item);
}

list.append(fragment);

この例では、documentFragmentに要素を追加し、最後にそのフラグメントをリストに追加しています。

こうすることで、レンダリングの回数を減らし、パフォーマンスを改善できます。

○appendとappendToを混同したときの修正方法

最後に、appendとappendToを混同したときの修正方法を見てみましょう。

両者の使い方は似ているため、うっかり間違えてしまうことがあります。

const list = document.getElementById('my-list');
const newItem = document.createElement('li');

list.appendTo(newItem); // エラー: appendToはlistに存在しない

この例では、list.appendToとしていますが、appendTonewItemに対して使うべきメソッドです。

このようなエラーは、メソッドの呼び出し方を見直すことで修正できます。

newItem.appendTo(list); // これが正しい

appendとappendToの違いを理解し、状況に応じて適切に使い分けることが大切ですね。

●appendとappendToの応用例

これまで、appendとappendToの基本的な使い方やパフォーマンス、エラー対処法などについて解説してきました。

でも、実際のWebアプリケーション開発では、もっと複雑で実用的な場面で使うことが多いですよね。

ここからは、そんな応用的な使用例をいくつか見ていきましょう。

○サンプルコード9:リストの動的な更新

まず、リストを動的に更新する例から見ていきます。

ユーザーの操作に応じてリストを更新するようなケースです。

<ul id="fruit-list"></ul>
<input type="text" id="fruit-input">
<button id="add-button">追加</button>
const fruitList = document.getElementById('fruit-list');
const fruitInput = document.getElementById('fruit-input');
const addButton = document.getElementById('add-button');

addButton.addEventListener('click', () => {
  const fruit = fruitInput.value;
  if (fruit !== '') {
    const li = document.createElement('li');
    li.textContent = fruit;
    fruitList.append(li);
    fruitInput.value = '';
  }
});

この例では、入力欄に果物の名前を入力し、追加ボタンを押すとリストに追加されます。

appendを使って、動的に生成した要素をリストに追加しています。

○サンプルコード10:タブ切り替えの実装

次に、タブ切り替えの実装を見てみましょう。

クリックしたタブに応じてコンテンツを切り替える際に、appendとappendToが活躍します。

<div id="tab-container">
  <button class="tab-button" data-tab="tab1">タブ1</button>
  <button class="tab-button" data-tab="tab2">タブ2</button>
  <button class="tab-button" data-tab="tab3">タブ3</button>
  <div id="tab-content"></div>
</div>
const tabContainer = document.getElementById('tab-container');
const tabButtons = tabContainer.querySelectorAll('.tab-button');
const tabContent = document.getElementById('tab-content');

tabButtons.forEach(button => {
  button.addEventListener('click', () => {
    const tabId = button.dataset.tab;
    const content = document.createElement('div');
    content.textContent = `これは${tabId}のコンテンツです`;
    tabContent.innerHTML = '';
    content.appendTo(tabContent);
  });
});

この例では、タブボタンをクリックすると、そのタブに対応するコンテンツを動的に生成し、tabContentに追加しています。

innerHTML を使ってコンテンツをクリアした後、appendToでコンテンツを追加しています。

○サンプルコード11:アコーディオンメニューの作成

アコーディオンメニューの作成にも、appendとappendToが使えます。

クリックした項目の内容を展開したり、折りたたんだりする際に便利です。

<div id="accordion">
  <div class="accordion-item">
    <h3 class="accordion-header">項目1</h3>
    <div class="accordion-content"></div>
  </div>
  <div class="accordion-item">
    <h3 class="accordion-header">項目2</h3>
    <div class="accordion-content"></div>
  </div>
  <div class="accordion-item">
    <h3 class="accordion-header">項目3</h3>
    <div class="accordion-content"></div>
  </div>
</div>
const accordionItems = document.querySelectorAll('.accordion-item');

accordionItems.forEach(item => {
  const header = item.querySelector('.accordion-header');
  const content = item.querySelector('.accordion-content');

  header.addEventListener('click', () => {
    const isOpen = content.style.display === 'block';

    if (isOpen) {
      content.style.display = 'none';
    } else {
      const contentText = document.createElement('p');
      contentText.textContent = `これは${header.textContent}の内容です`;
      content.innerHTML = '';
      contentText.appendTo(content);
      content.style.display = 'block';
    }
  });
});

この例では、アコーディオンの項目をクリックすると、その項目の内容が展開されます。

展開時には、動的にコンテンツを生成し、appendToで追加しています。

再度クリックすると、コンテンツが折りたたまれます。

○サンプルコード12:無限スクロールの実装

最後に、無限スクロールの実装例を見てみましょう。

スクロールに応じて、次のコンテンツを動的に読み込む際に、appendが活躍します。

<div id="infinite-scroll">
  <!-- コンテンツがここに追加されていく -->
</div>
const infiniteScroll = document.getElementById('infinite-scroll');
let page = 1;

window.addEventListener('scroll', () => {
  const { scrollTop, clientHeight, scrollHeight } = document.documentElement;

  if (scrollTop + clientHeight >= scrollHeight - 10) {
    page++;
    fetchContent(page);
  }
});

function fetchContent(page) {
  // APIから次のコンテンツを取得する処理(ここでは省略)
  const content = document.createElement('div');
  content.textContent = `これはページ${page}のコンテンツです`;
  content.appendTo(infiniteScroll);
}

この例では、スクロールが下部に達すると、次のページのコンテンツを取得し、appendToで追加しています。

これにより、ユーザーはスクロールするだけで次々とコンテンツを読み込むことができます。

まとめ

JavaScriptのappendとappendToは、要素を追加するメソッドですが、使い方や特性に違いがあります。

appendは親要素から子要素を追加し、appendToは子要素から親要素を指定して追加します。

パフォーマンスや要素の位置なども考慮して使い分ける必要があります。

チェーンメソッドを活用することでシンプルで readable なコードを書くことができますが、セレクターの間違いやパフォーマンス低下などのエラーにも注意が必要です。

実際のWebアプリケーション開発では、動的なリストの更新やタブ切り替え、アコーディオンメニューなど、さまざまな場面でappendとappendToが活躍します。

本記事で解説した応用例を参考に、実践的なコーディングスキルを磨いていきましょう。

状況に応じて適切に使い分けることが、JavaScriptの実力アップにつながります。