| この記事の要点 |
|
基本: $.ajax()
もっとも汎用的な書き方。すべてのオプションを指定可能です。
$.ajax({
url: '/api/users',
type: 'GET', // メソッド (GET/POST/PUT/DELETE)
dataType: 'json', // レスポンス形式
data: { keyword: 'taro' }, // 送信データ
headers: {
'Authorization': 'Bearer ' + token,
},
timeout: 5000, // ms
cache: false,
})
.done(function (data, textStatus, jqXHR) {
console.log('成功:', data);
})
.fail(function (jqXHR, textStatus, errorThrown) {
console.error('失敗:', jqXHR.status, errorThrown);
})
.always(function () {
console.log('完了 (成功失敗問わず)');
});
ショートカット: $.get / $.post / $.getJSON
// GET
$.get('/api/users', { id: 1 }, function (data) {
console.log(data);
}, 'json');
// POST
$.post('/api/users', { name: 'taro', age: 25 }, function (data) {
console.log('作成:', data);
});
// JSON 専用 GET (dataType: 'json' 固定)
$.getJSON('/api/users.json', function (data) {
$.each(data, (i, u) => $('#list').append(`<li>${u.name}</li>`));
});
// HTML を取得して特定要素にロード
$('#main').load('/partials/sidebar.html');
// セレクタ指定で部分ロード
$('#main').load('/page.html #content');
Promise チェーン (.done / .fail / .always / .then)
jQuery 1.5 から Ajax は jqXHR (Promise) を返します。Promise チェーンで複数リクエストを連結できます:
// 連続 Ajax
$.getJSON('/api/user/1')
.then(function (user) {
return $.getJSON('/api/posts?userId=' + user.id);
})
.then(function (posts) {
console.log(posts.length + ' 件の投稿');
})
.fail(function (xhr) {
console.error('どこかで失敗:', xhr.status);
});
// 並列 Ajax ($.when)
$.when(
$.getJSON('/api/user/1'),
$.getJSON('/api/posts')
).done(function (userResult, postsResult) {
// userResult = [data, textStatus, jqXHR]
console.log(userResult[0], postsResult[0]);
});
CSRF トークンの送信
Laravel / Rails 等は POST / PUT / DELETE に CSRF トークンが必要です:
// Laravel: meta タグから取得
// <meta name="csrf-token" content="{{ csrf_token() }}">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
},
});
// Rails: meta タグの名前が違う
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content'),
},
});
// 以降の $.post / $.ajax すべてに自動付与される
$.post('/users', { name: 'taro' });
$.ajaxSetup でグローバルデフォルト
$.ajaxSetup({
cache: false,
timeout: 10000,
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + localStorage.getItem('token'));
},
statusCode: {
401: function () {
location.href = '/login'; // 共通の 401 ハンドリング
},
500: function () {
alert('サーバエラーが発生しました');
},
},
});
ファイルアップロード (FormData)
const formData = new FormData();
formData.append('file', $('#file-input')[0].files[0]);
formData.append('description', '画像説明');
$.ajax({
url: '/upload',
type: 'POST',
data: formData,
contentType: false, // ★ jQuery に Content-Type を生成させない
processData: false, // ★ FormData をクエリ化させない
xhr: function () {
const xhr = $.ajaxSettings.xhr();
xhr.upload.onprogress = function (e) {
if (e.lengthComputable) {
const pct = Math.round((e.loaded / e.total) * 100);
$('#progress').text(pct + '%');
}
};
return xhr;
},
}).done(function (data) {
console.log('アップロード完了:', data);
});
エラーハンドリング
$.ajax('/api/users')
.fail(function (jqXHR, textStatus, errorThrown) {
switch (jqXHR.status) {
case 0:
alert('ネットワーク接続を確認してください');
break;
case 401:
location.href = '/login';
break;
case 403:
alert('権限がありません');
break;
case 404:
alert('リソースが見つかりません');
break;
case 422:
// バリデーションエラー (Laravel)
const errors = jqXHR.responseJSON.errors;
Object.entries(errors).forEach(([field, msgs]) => {
$(`[name="${field}"]`).next('.error').text(msgs[0]);
});
break;
case 500:
alert('サーバエラー');
break;
default:
console.error(textStatus, errorThrown);
}
});
fetch API への移行
jQuery を使わない場合の同等コード:
// GET
fetch('/api/users?keyword=taro')
.then(res => {
if (!res.ok) throw new Error('HTTP ' + res.status);
return res.json();
})
.then(data => console.log(data))
.catch(err => console.error(err));
// POST (JSON)
fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': csrfToken,
},
body: JSON.stringify({ name: 'taro', age: 25 }),
})
.then(res => res.json())
.then(data => console.log(data));
// async / await
async function fetchUser(id) {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) throw new Error('HTTP ' + res.status);
return await res.json();
}
axios との比較
| 項目 | jQuery Ajax | fetch (標準) | axios |
|---|---|---|---|
| サイズ | 大 (jQuery 30KB+) | 0 (組込) | 13KB |
| JSON 自動変換 | ○ (dataType: json) | × (.json() 必要) | ○ |
| HTTP エラー | fail で捕捉 | × (4xx/5xx も resolve) | ○ catch で捕捉 |
| キャンセル | xhr.abort() | AbortController | CancelToken |
| インターセプタ | $.ajaxSetup | なし (要ラップ) | あり |
| 進捗 | xhr.upload.onprogress | 限定的 | onUploadProgress |
FAQ
Q: 新規プロジェクトで jQuery Ajax を使うべき?
A: 既存 jQuery 環境ならアリ。新規は fetch / axios を推奨。
Q: $.ajax の async: false は使える?
A: 同期 XHR はブラウザが非推奨化。UI フリーズを起こすので使わない。
Q: jqXHR と XHR の違い
A: jqXHR は jQuery が XHR を Promise でラップしたもの。.done() / .fail() 等のメソッドが使える。
子ページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15