- jQueryの`$.ajax()`は結局「XMLHttpRequestの操作代行」です
- そもそもXMLHttpRequestとは何か
- jQuery.ajaxがやっている本当の仕事
- 「ラップしている」とは具体的に何をしているのか
- なぜjQuery.ajaxが革命だったのか
- 注意点:jQuery.ajaxは万能ではない
- ではなぜ現在はfetchが使われるのか
- まとめ
jQueryの`$.ajax()`は結局「XMLHttpRequestの操作代行」です
jQueryの`$.ajax()`は魔法ではありません。
中身でやっていることは、ブラウザが持っている通信APIであるXMLHttpRequest(XHR)の生成・設定・送信・イベント管理を、人間が書きやすい形に整理して提供しているだけです。
つまり、
- jQuery.ajax → 新しい通信機能
ではなく
- jQuery.ajax → XMLHttpRequestの操作ラッパー
です。
これを理解すると、なぜ昔のJavaScriptが難しかったのか、そしてなぜjQueryが爆発的に普及したのかが一気に見えてきます。
そもそもXMLHttpRequestとは何か
XMLHttpRequest(XHR)は、ページを再読み込みせずにサーバと通信するためのブラウザ標準APIです。
いわゆる「Ajax通信」を実現している本体そのものです。
名前にXMLと入っていますが、XML専用ではありません。
JSONでもHTMLでもテキストでも取得できます。
典型的なXHRコードは次のようになります。
var xhr = new XMLHttpRequest(); xhr.open('GET', '/api/user', true); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send();
一見すると単純そうに見えますが、実際に使うと問題だらけでした。
当時の開発者が苦しんだポイント**
- readyStateを監視する必要がある
- status判定が必要
- エラー時の処理を自分で書く必要
- タイムアウト処理が手作業
- POST時のヘッダ設定が必要
- JSONパースを自分で行う必要
- ブラウザごとに挙動が違う
つまり「通信するだけ」で大量のボイラープレートコードが必要でした。
jQuery.ajaxがやっている本当の仕事
jQueryの`$.ajax()`は、この面倒な部分をすべて引き受けています。
実際の対応関係を見ると分かりやすいです。
| jQuery.ajaxのオプション | 内部で行われる処理 |
| url | xhr.openのURL設定 |
| type | GET/POSTのメソッド指定 |
| data | クエリ文字列の組み立て |
| headers | setRequestHeaderの設定 |
| timeout | タイマー管理 |
| success | onreadystatechange成功分岐 |
| error | 失敗時ハンドリング |
| dataType: 'json' | JSON.parse自動実行 |
つまり`$.ajax()`は単なる便利関数ではなく、通信処理フレームワークです。
実際のコード比較を見てみます。
XMLHttpRequest**
var xhr = new XMLHttpRequest(); xhr.open("POST", "/api/login", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { var data = JSON.parse(xhr.responseText); console.log(data); } else { console.error("error"); } } }; xhr.send(JSON.stringify({id:"user", pass:"1234"}));
jQuery.ajax**
$.ajax({ url: "/api/login", type: "POST", contentType: "application/json", data: JSON.stringify({id:"user", pass:"1234"}), dataType: "json", success: function(data){ console.log(data); }, error: function(){ console.error("error"); } });
機能は同じです。
書く量と理解コストがまったく違います。
これがjQueryの価値でした。
「ラップしている」とは具体的に何をしているのか
jQueryは内部で以下を自動化しています。
1. XMLHttpRequest生成**
ブラウザ差異(IEのActiveX)を吸収
2. 状態管理**
readyStateの監視を抽象化
3. レスポンス変換**
text → JSON → script → html を自動変換
4. エラーハンドリング**
通信失敗・タイムアウト・HTTPエラーを分類
5. コールバック管理**
success / error / complete を整理
特に重要なのが「ブラウザ差異の吸収」です。
当時は同じコードでも
- IE6では動かない
- Safariでは例外
- Firefoxではヘッダエラー
という状況が普通に起きていました。
jQueryはこの差異を内部で分岐していました。
開発者は「通信したい」とだけ書けばよかったのです。
なぜjQuery.ajaxが革命だったのか
現在の`fetch`と違い、当時はPromiseもありませんでした。
非同期処理はイベント駆動で、しかもブラウザごとに挙動が違いました。
つまり
- 非同期が難しい
- 通信が難しい
- 互換性が難しい
この3つを同時に解決したのが`$.ajax()`です。
単なる記述量削減ではありません。
「Webアプリケーションが現実的に作れるようになった」レベルの変化でした。
Gmail、Google Maps、Twitterなどの「ページ遷移しないUI」が普及した背景には、Ajax通信の実用化があります。
そして現場の実装を支えたのがjQuery.ajaxでした。
注意点:jQuery.ajaxは万能ではない
便利ですが、誤解されがちな点があります。
jQuery.ajaxは通信を簡単にするだけで、セキュリティを保証するものではありません。
例えば次は危険です。
$.ajax({ url: "/api/user?id=" + userInput });
これはサーバ側の脆弱性をそのまま突きます。
また、CSRF対策も自動では行いません。
つまり
- 通信は簡単になる
- 安全になるわけではない
ここは重要です。
ではなぜ現在はfetchが使われるのか
理由は単純で、ブラウザ自体が進化したからです。
- Promise標準化
- CORS標準化
- JSONが前提になった
- ブラウザ差異がほぼ消えた
これにより「ラッパーの必要性」が減りました。
現在のfetchは、jQuery.ajaxが担っていた役割をブラウザが持つようになった姿です。
まとめ
jQueryの`$.ajax()`は新しい通信技術ではありません。
XMLHttpRequestという難解な低レベルAPIを、人間が使える形に翻訳したインターフェースです。
Web開発の歴史を少し誇張して言えば、
Ajaxを発明したのはブラウザですが、
Ajaxを普及させたのはjQueryです。
そして現在の`fetch`は、その思想がブラウザに取り込まれた結果と言えます。
jQueryが古く見えるのは、役目を終えたからです。
役に立たなかったからではありません。