jQueryのAjax関数を使うと、JavaScriptのAjax処理が簡潔に記述できます。この記事では、jQueryのAjax関数を使ってJavaScriptで非同期通信を行う方法をサンプルを交えて紹介します。
jQuery関数には3通りの記述方法がある。それぞれ記述方法が異なるだけで、機能はどれも同じである。
window.jQuery.ajax(properties)
jQuery.ajax(properties)
$.ajax(properties)
jQuery.ajaxの引数には、Ajaxリクエストを設定するキーと値のペアのセットを次の形式で指定する。
{ key: value [, key: value ...] }
keyには次の表に示すキーのいずれかを指定する。
typeがGETの場合のみ指定が有効である。
デフォルト値はtrueなので注意が必要である(同一URLへの2回目以降のAjaxリクエストは実際にリクエストを発行するのではなく、キャッシュされた結果が使われる。つまり、サーバへリクエストを送信しない)。
cache
に false
を指定した場合、クエリパラメータに現在時刻(ミリ秒)が付加される。
ブラウザのキャッシュはURLが一致する場合にのみ行われるので、クエリパラメータに現在時刻を付加することで前回のAjaxのキャッシュは使われない。
たとえば、下記のサンプルコードの場合、クエリ文字列は https://segakuin.com/?foo=bar&_=1434101906455
のようになる。
$.ajax({
url: "https://segakuin.com",
data: {
foo: "bar"
},
cache: false
});
$.ajax({
url: "example.html",
context: document.body
}).done(function() {
$(this).addClass("done");
});
dataTypeを指定しなかった場合、jQueryがレスポンスの MIME タイプを元に判断する。
https://segakuin.com/foo.jsというテキストファイルの中身が次のようになっているとする。
myCallback({"bar":"baz"})
JSONPを使ってこれをクロスドメインで取得するJavaScriptは次のようになる。
$.ajax({
url: "https://segakuin.com/foo.js",
dataType: "jsonp",
jsonpCallback: "myCallback",
cache: false
}).fail({
alert("failed");
}).done(function(data){
alert(data.bar);
});
dataに指定したオブジェクトをクエリ文字列に変換するかどうかを指定する。
processData | 説明 |
---|---|
true (初期値) | dataに指定したオブジェクトをクエリ文字列に変換する。 |
false | dataに指定したオブジェクトをクエリ文字列に変換しない。 |
次に示すサンプルの場合、GETのURLは https://segakuin.com/?[object%20Object]
となる。
$.ajax({
url: "https://segakuin.com",
data: {foo:"bar",baz:"qux"},
dataType: "json",
processData: false
});
次に示すサンプルの場合、GETのURLは https://segakuin.com/?foo=bar&baz=qux
となる。
$.ajax({
url: "https://segakuin.com",
data: {foo:"bar",baz:"qux"},
dataType: "json",
processData: true
});
オブジェクトの値が配列の場合、jQueryは同じキーを持つ複数の値にシリアライズする。たとえば次に示すサンプルの場合、URLは https://segakuin.com?foo=bar&foo=baz
となる。
$.jax({
url: "https://segakuin.com",
data: {
["bar", "baz"]
},
processData: true
})
$.ajax({
statusCode: {
404: function() {
alert("page not found");
}
}
});
type | 説明 |
---|---|
GET | HTTPのGETメソッドで送信する。 |
POST | HTTPのPOSTメソッドで送信する。 |
GETを指定した場合、リクエスト結果がキャッシュされるので注意が必要である。同一URLへの2回目以降のAjaxリクエストは、実際にリクエストを発行するのではなく、キャッシュされた結果が使われる。つまり、サーバへリクエストを送信しない。
GETメソッドのAjax通信は、デフォルトでキャッシュが使われる。たとえば、「http://example.com/foo」に通信すると、取得データがキャッシュされ、次に同じURIにAjaxで通信しようとすると、実際にサーバと通信するのではなく、キャッシュした取得データが使われる。キャッシュはリクエストパラメータを含めたURIごとに管理される。Ajaxで「http://example.com/foo?p=1」にリクエストした後、Ajaxで「http://example.com/foo?p=2」にリクエストしてもキャッシュは使われない。
POSTメソッドのAjax通信ではキャッシュは使われない。
POSTメソッドでAjax通信を行うサンプルを示す。
jQuery.ajax({
type: "POST",
url: "ajax.php",
data: {
page: 2
}
});
jQuery.ajax()は、戻り値としてXMLHttpRequest(jqXHT)オブジェクトを返す。
jQuery XMLHttpRequest(jqXHR)オブジェクトは、JavaScriptのXMLHttpRequestオブジェクトのスーパーセットであり、jQuery.ajax()の戻り値として返される。
メソッド | 説明 |
---|---|
done | Ajax通信に成功した際に呼び出される。 |
fail | Ajax通信に失敗した際に呼び出される。 |
always | Ajax通信が完了した際に、done()やfail()が呼ばれた後に呼び出される。 |
then | Ajax通信に成功した際及びAjax通信に失敗した際に呼び出される。 |
done()は、Ajax通信に成功した際に呼び出されるメソッドである。
done(function(data, textStatus, jqXHR) { /* 処理 */ } )
Ajax通信に成功したら、ダイアログを表示するサンプルを示す。
$.ajax({
url: "http://segkuin.com/javascript/jquery/sample.json",
dataType: "json"
}).done(function(data, textStatus, jqXHR){
alert(data.foo);
})
always()は、Ajax通信に失敗した際に呼び出されるメソッドである。
fail(function(jqXHR, textStatus, errorThrown) { /* 処理 */ } )
always()は、Ajax通信が完了した際に、done()やfail()が呼ばれた後に呼び出されるメソッドである。
always(function(data, textStatus, jqXHR) { /* 処理 */ } )
always(function(jqXHR, textStatus, errorThrown) { /* 処理 */ } )
then()は、Ajax通信に成功した際及びAjax通信に失敗した際に呼び出されるメソッドである。
then(
function(data, textStatus, jqXHR) { /* 処理 */ },
function(jqXHR, textStatus, errorThrown) { /* 処理 */ }
)
第1引数には、Ajax通信が成功した際に呼び出されるコールバック関数を指定する。第2引数には、Ajax通信が失敗した際に呼び出されるコールバック関するを指定する。
jQuery.ajax()のサンプルを次に示す。
<a href="javascript:callAjax();">ここをクリックするとAjaxを実行します。</a>
<script>
function callAjax() {
$.ajax({
url: "https://segakuin.com/javascript/jquery/example.json",
dataType: "json"
})
.done(function(data, textStatus, jqXHR){
alert(data.title);
})
.fail(function(jqXHR, textStatus, errorThrown){
alert("fail ");
});
}
</script>
example.json の内容は次のとおり。
{
"isbn": "0241568811",
"title": "Charlotte's Web: 70th Anniversary Edition",
"author": "E. B. White"
}
上記サンプルの実行結果を次に示す。
IE8 IE9
Internet Explorer 8及びInternet Explorer 9でクロスドメイン通信を行う場合は、XMLHttpRequestではなく、XDomainRequestを使用する。AjaxでXMLHttpRequestの代わりにXDomainRequestを使うには、xdr.jsプラグインを使用する。