お役立ちコラム
JavaScript

jQueryでAJAXを使う方法!非同期通信で画面の一部だけを更新する方法を解説

※本記事には広告が含まれます

今回は、jQueryでAJAX(非同期通信)を使い、サーバー上のリソースを取得して画面の一部だけを更新する方法を解説します。

近年では、ブラウザ標準のfetch APIやAxiosといったライブラリが非同期通信の主流となっていますが、WordPress のように初めからjQueryが読み込まれている環境では、jQueryのAJAX機能(メソッド)を利用することで手軽に実装できるという利点があります。

また、jQueryを学習中の初学者にとっては覚えておいて損はないので、ぜひ本記事を参考にjQueryでのAJAXの使い方を確認してみて下さい。

【前提知識】同期通信・非同期通信、AJAXとは?

同期通信・非同期通信とは?

非同期通信の特徴を表した図

同期通信とは、リクエストを送信した後、サーバーからレスポンスが返ってくるまで処理が先へ進まない通信方式のことを指します。

この方式では、サーバーの応答を待つ間、ページ全体が切り替わったりリロードされたりするため、ユーザーの操作が一時的に中断されるという特徴があります。

一方、非同期通信とは、リクエストを送信した後もレスポンスを待つことなく処理を続行でき、ページ全体を再読み込みすることなく必要な部分だけを更新できる通信方式のことを指します。

サーバーとのデータ送受信中もユーザーは画面を操作できるため、スムーズな操作体験を実現できます。

AJAXとは?

AJAXとは、JavaScriptを使って非同期通信を実現する技術(手法)のことを指します。

AJAXは、元々Asynchronous JavaScript + XMLの略語からできた造語ですが、これは、かつてはサーバーから返されるデータ形式としてXMLが主流だったためです。

現在ではXMLではなくJSONを用いるのが一般的になっていますが、名称はそのまま残っています。

jQueryでAJAXを使う方法(サーバー上のJSONファイルからデータを取得するデモ)

jQueryには、GETリクエスト用の.get()、POSTリクエスト用の.post()といった簡易メソッドが用意されています。

しかし今回は、あえてそれらの簡易メソッドは使用せず、すべてのリクエスト方式に対応したAJAX通信の基盤となる .ajax()メソッドを使って処理を書いていきます。

.ajax()の基本的な使い方は以下の通りです。

$.ajax({
  url: "・・・", // リクエスト先のURLを指定
  type: "GET", // リクエスト方法を指定(GET / POST)
  dataType: "json", // サーバーから返ってくるデータの型を指定
  data: { // サーバーに送るデータを指定(必要な場合)
    // key: value
  },
  success: function (data) { // 通信成功時の処理を指定
    // data → サーバーから返ってきたデータ(dataTypeに応じた形式で渡される)
  },
  error: function (xhr, status, error) { // 通信失敗時の処理を指定
    // xhr → jqXHRオブジェクト(statusでHTTPステータス等の確認ができる)
    // status → エラーの種類
    // error → 詳細なエラー内容(「Not Found」など)
  },
});

今回は、上の.ajax()メソッドを使って、非同期通信でサーバー上にあるJSONファイル(news-list.json)からデータを受け取り、ページの一部を更新するデモを作成してみます。

JSONデータの取得には.getJSON()という簡易メソッドもありますが、今回の例ではそれも使用せず、.ajax()メソッドを用いて処理を書いていきます。

デモ作成開始地点のコードは以下の通りです。

<div class="container">
  <div id="news-wrap"></div>

  <button id="load-more">もっと見る</button>
</div>
.container {
  width: 1100px;
  margin: 0 auto;
}

#news-wrap {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 30px;
}

.news-item {
  width: calc(100% / 3 - 20px);
}

.news-excerpt {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
{
  "news": [
    {
      "title": "ニュース 01",
      "date": "2025.12.04",
      "excerpt": "最新のお知らせ01の簡単な概要が入ります。"
    },
    {
      "title": "ニュース 02",
      "date": "2025.12.01",
      "excerpt": "最新のお知らせ02の内容を短くまとめた説明文です。"
    },
    {
      "title": "ニュース 03",
      "date": "2025.11.28",
      "excerpt": "ニュース03の概要テキストがここに入ります。"
    },
    {
      "title": "ニュース 04",
      "date": "2025.11.07",
      "excerpt": "ニュース04の短い説明文です。"
    },
    {
      "title": "ニュース 05",
      "date": "2025.09.06",
      "excerpt": "ニュース05の内容をまとめた抜粋です。"
    },
    {
      "title": "ニュース 06",
      "date": "2025.08.15",
      "excerpt": "ニュース06に関する簡単な説明文が入ります。"
    },
    {
      "title": "ニュース 07",
      "date": "2025.07.24",
      "excerpt": "ニュース07の概要を示す抜粋です。"
    },
    {
      "title": "ニュース 08",
      "date": "2025.05.03",
      "excerpt": "ニュース08の内容を要約したテキストです。"
    },
    {
      "title": "ニュース 09",
      "date": "2025.04.02",
      "excerpt": "ニュース09の短い紹介文です。"
    },
    {
      "title": "ニュース 10",
      "date": "2025.02.01",
      "excerpt": "ニュース10の概要をまとめた抜粋です。"
    }
  ]
}

STEP. 1:JSONファイルからデータを取得する

まずは、.ajax()を使ってJSONファイルからデータを取得しましょう。

取得されたデータはnewsDataという変数に格納します。

この変数は、後ほど別の関数から参照・操作できるようにしたいので、スコープの外側で定義しておきます。

$(function () {
  let newsData = []; // 全ニュースデータ

  $.ajax({
    url: "news-list.json",
    type: "GET",
    dataType: "json",
    success: function (data) {
      newsData = data.news;
    },
    error: function (xhr, status, error) {
      console.error("JSONの読み込みに失敗しました:", error);
    },
  });
});

これで、newsDataにnews-list.jsonのデータが格納されました。

STEP. 2:ニュースを3件づつ追加表示する関数を定義する

続いて、JSONファイルから取得したニュースを3件づつ追加表示する関数(名前をshowMoreNewsとします。)を定義します。

showMoreNewsでは、スコープ外で定義されているcurrentIndex(現在の表示位置)を参照し、その値に基づいて次に表示するニュースの範囲を決定します。

さらに、ニュースを表示した後はcurrentIndexを更新(perPage分進める)し、次回の読み込みが正しい位置から行われるように管理しています。

加えて、全件表示されたらボタンが隠れるようにします。

$(function () {
  let newsData = []; // 全ニュースデータ
  let currentIndex = 0; // 表示位置
  const perPage = 3; // 1回の表示件数

  $.ajax({
    url: "news-list.json",
    type: "GET",
    dataType: "json",
    success: function (data) {
      newsData = data.news;
    },
    error: function (xhr, status, error) {
      console.error("JSON の読み込みに失敗しました:", error);
    },
  });

  // ニュースを追加表示する関数
  function showMoreNews() {
    const nextItems = newsData.slice(currentIndex, currentIndex + perPage); // newsData(配列)から、currentIndexを開始位置として perPage(例:3件)を切り出して取得

    // 切り出したニュースデータを1件ずつ#news-wrap内に追加して表示
    nextItems.forEach((item) => {
      $("#news-wrap").append(`
        <div class="news-item">
          <p class="news-date">${item.date}</p>
          <p class="news-title">${item.title}</p>
          <p class="news-excerpt">${item.excerpt}</p>
        </div>
      `);
    });

    // 次回のcurrentIndex(表示開始位置)を更新(perPage分進める)
    currentIndex += perPage;

    // 全件表示したらボタンを隠す
    if (currentIndex >= newsData.length) {
      $("#load-more").hide();
    }
  }
});

STEP. 3:非同期通信の成功時とボタンクリック時にshowMoreNewsを呼び出す

最後に、AJAX通信成功時とボタンクリック時にshowMoreNewsを呼び出すようにします。

$(function () {
  let newsData = []; // 全ニュースデータ
  let currentIndex = 0; // 表示位置
  const perPage = 3; // 1回の表示件数

  $.ajax({
    url: "news-list.json",
    type: "GET",
    dataType: "json",
    success: function (data) {
      newsData = data.news;

      showMoreNews();
    },
    error: function (xhr, status, error) {
      console.error("JSON の読み込みに失敗しました:", error);
    },
  });

  $("#load-more").on("click", function () {
    showMoreNews();
  });

  // ニュースを追加表示する関数
  function showMoreNews() {
    const nextItems = newsData.slice(currentIndex, currentIndex + perPage); // newsData(配列)から、currentIndexを開始位置として perPage(例:3件)を切り出して取得

    // 切り出したニュースデータを1件ずつ#news-wrap内に追加して表示
    nextItems.forEach((item) => {
      $("#news-wrap").append(`
        <div class="news-item">
          <p class="news-date">${item.date}</p>
          <p class="news-title">${item.title}</p>
          <p class="news-excerpt">${item.excerpt}</p>
        </div>
      `);
    });

    // 次回のcurrentIndex(表示開始位置)を更新(perPage分進める)
    currentIndex += perPage;

    // 全件表示したらボタンを隠す
    if (currentIndex >= newsData.length) {
      $("#load-more").hide();
    }
  }
});

これで、サーバー上の JSON ファイルからデータを取得し、ボタンをクリックするたびにニュースを追加表示できるデモが作成できました。

異なるオリジンへのAJAX通信には制限があるため注意が必要

一点、異なるオリジンへのAJAX通信には制限があるため、注意が必要です。

オリジン(Origin)とは、「プロトコル(http / https)」「ドメイン」「ポート番号」の組み合わせのことを指します。

これは、ブラウザがセキュリティ上の理由から同一オリジンポリシーを適用しており、外部ドメインへのリクエストは基本的にブロックされるためです。

ただし、適切な設定を行えば、異なるオリジンへのAJAX通信を実現することも可能です。

自分が管理しているサーバーの場合(CORS設定が必要)

自分が管理しているサーバーであれば、CORSという仕組みを使って外部からのアクセスを許可できます。

CORSはCross-Origin Resource Sharingの略で、異なるオリジンからのアクセスをサーバー側で「許可する/しない」を制御するための仕組みです。

たとえば、ローカル環境や別ドメインからJSONファイルをAJAXで読み込みたい場合は、.htaccessファイルに以下の設定を追加することで、対象のディレクトリ内のリソースを外部から取得できるようになります。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "http://localhost"
  Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
  Header set Access-Control-Allow-Headers "Content-Type"
</IfModule>

自分が管理していないサーバーの場合(自前サーバー経由によるデータの取得が必要)

自分が管理していないサーバーで CORS が許可されていない場合、ブラウザから外部APIへ直接アクセスすると、同一オリジンポリシーによってリクエストがブロックされます。

そのため、「ブラウザ → 自分のサーバー(PHP など) → 外部API → 自分のサーバー → ブラウザ」という流れで、自前サーバーをプロキシとして経由しながらデータを取得する必要があります。

プロキシとして動作させるPHPは次のように記述します。

<?php
header("Content-Type: application/json; charset=utf-8");

$url = "https://example.com/news-list.json"; // 外部JSONファイルのURL

$response = file_get_contents($url);

echo $response;

あとは上記のPHPに対してブラウザからAJAXを送ると、ブラウザは外部APIに直接触れず、自前サーバーにだけアクセスするため、CORS の制限を受けずにデータを取得できます。

$.ajax({
  url: "proxy.php",
  type: "GET",
  dataType: "json",
  success: function (data) {
    // 通信成功時の処理を指定
  },
  error: function () {
    // 通信失敗時の処理を指定
  },
});

まとめ

今回はjQueryでAJAX通信(非同期通信)を行う方法を解説しました。

近年では、ブラウザ標準のfetch APIやAxios などを利用して非同期通信を行うのが主流になっていますが、jQuery が導入されている環境では.ajax()を使うことで、より手軽に非同期通信を実装できます。

ちょっとしたデータ取得や部分的な更新であれば、jQueryのAJAXは学習コストも低く、十分に活用できるので、本記事を参考に使い方を覚えてみて下さい。

今回は以上になります。最後までご覧頂き、ありがとうございました。

HOMEお役立ちコラムJavaScriptjQueryでAJAXを使う方法!非同期通信で画面の一部だけを更新する方法を解説