サーチ…
前書き
AJAXは "Asynchronous JavaScript and XML"の略です。この名前にはXMLが含まれていますが、JSONはフォーマットが簡単で冗長性が低いため、より頻繁に使用されます。 AJAXを使用すると、Webページをリロードせずに外部リソースと通信することができます。
備考
AJAXは、同期J avaScript ND X MLの略です。それにもかかわらず、実際には他のタイプのデータを使用することができます.xmlhttprequestの場合、廃止予定の同期モードに切り替えます。
AJAXは、ページ全体をリロードせずに、WebページがサーバーにHTTPリクエストを送信し、応答を受け取ることを許可します。
GETとパラメータなしの使用
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (xhttp.readyState === XMLHttpRequest.DONE && xhttp.status === 200) {
//parse the response in xhttp.responseText;
}
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
fetch
APIは、非同期HTTPリクエストを作成するためのより新しい約束に基づく方法です。
fetch('/').then(response => response.text()).then(text => {
console.log("The home page is " + text.length + " characters long.");
});
POSTを介したJSONデータの送受信
リクエスト要求のフェッチは、最初にレスポンスオブジェクトを返します。これらはレスポンスヘッダー情報を提供しますが、まだロードされていない可能性があるレスポンス本文を直接は含みません。 .json()
ようなResponseオブジェクトのメソッドを使用して、応答本体がロードされるのを待って解析することができます。
const requestData = {
method : 'getUsers'
};
const usersPromise = fetch('/api', {
method : 'POST',
body : JSON.stringify(requestData)
}).then(response => {
if (!response.ok) {
throw new Error("Got non-2XX response from API server.");
}
return response.json();
}).then(responseData => {
return responseData.users;
});
usersPromise.then(users => {
console.log("Known users: ", users);
}, error => {
console.error("Failed to fetch users due to error: ", error);
});
Stack OverflowのAPIから今月のトップのJavaScriptに関する質問を表示する
Stack ExchangeのAPIにAJAXリクエストを送信して、その月のトップのJavaScript質問のリストを取得し、それらをリンクのリストとして提示することができます。要求が失敗した場合、またはAPIエラーが返された場合、 Googleの約束のエラー処理によってエラーが表示されます。
const url =
'http://api.stackexchange.com/2.2/questions?site=stackoverflow' +
'&tagged=javascript&sort=month&filter=unsafe&key=gik4BOCMC7J9doavgYteRw((';
fetch(url).then(response => response.json()).then(data => {
if (data.error_message) {
throw new Error(data.error_message);
}
const list = document.createElement('ol');
document.body.appendChild(list);
for (const {title, link} of data.items) {
const entry = document.createElement('li');
const hyperlink = document.createElement('a');
entry.appendChild(hyperlink);
list.appendChild(entry);
hyperlink.textContent = title;
hyperlink.href = link;
}
}).then(null, error => {
const message = document.createElement('pre');
document.body.appendChild(message);
message.style.color = 'red';
message.textContent = String(error);
});
パラメータ付きGETの使用
この関数は、GETを使用してAJAX呼び出しを実行して、 パラメータ (オブジェクト)をファイル (文字列)に送信し、要求が終了したときにコールバック (関数)を起動します 。
function ajax(file, params, callback) {
var url = file + '?';
// loop through object and assemble the url
var notFirst = false;
for (var key in params) {
if (params.hasOwnProperty(key)) {
url += (notFirst ? '&' : '') + key + "=" + params[key];
}
notFirst = true;
}
// create a AJAX call with url as parameter
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
callback(xmlhttp.responseText);
}
};
xmlhttp.open('GET', url, true);
xmlhttp.send();
}
使用方法は次のとおりです。
ajax('cars.php', {type:"Volvo", model:"300", color:"purple"}, function(response) {
// add here the code to be executed when data comes back to this page
// for example console.log(response) will show the AJAX response in console
});
cars.php
、 cars.php
urlパラメータを取得する方法を示します。
if(isset($_REQUEST['type'], $_REQUEST['model'], $_REQUEST['color'])) {
// they are set, we can use them !
$response = 'The color of your car is ' . $_REQUEST['color'] . '. ';
$response .= 'It is a ' . $_REQUEST['type'] . ' model ' . $_REQUEST['model'] . '!';
echo $response;
}
コールバック関数でconsole.log(response)
があった場合、コンソールの結果は次のようになります。
あなたの車の色は紫色です。ボルボモデル300です!
HEADリクエストでファイルが存在するかどうかを確認する
この関数は、HEADメソッドを使ってAJAXリクエストを実行し、引数として与えられたディレクトリにファイルが存在するかどうかを確認します。また、 ケースごとにコールバックを開始することもできます (成功、失敗)。
function fileExists(dir, successCallback, errorCallback) {
var xhttp = new XMLHttpRequest;
/* Check the status code of the request */
xhttp.onreadystatechange = function() {
return (xhttp.status !== 404) ? successCallback : errorCallback;
};
/* Open and send the request */
xhttp.open('head', dir, false);
xhttp.send();
};
AJAXプリローダーを追加する
ここでは、AJAX呼び出しの実行中にGIFプリローダーを表示する方法があります。プリローダ機能の追加と削除を準備する必要があります:
function addPreloader() {
// if the preloader doesn't already exist, add one to the page
if(!document.querySelector('#preloader')) {
var preloaderHTML = '<img id="preloader" src="https://goo.gl/cNhyvX" />';
document.querySelector('body').innerHTML += preloaderHTML;
}
}
function removePreloader() {
// select the preloader element
var preloader = document.querySelector('#preloader');
// if it exists, remove it from the page
if(preloader) {
preloader.remove();
}
}
ここでは、これらの関数の使用場所を見ていきます。
var request = new XMLHttpRequest();
onreadystatechange
関数の中には、条件付きのif文が必要です: request.readyState == 4 && request.status == 200
。
trueの場合 :リクエストが終了し、 removePreloader()
使用するレスポンスが準備されます。
それ以外の場合はfalse :リクエストがまだ進行中です。この場合、 addPreloader()
関数を実行します。
xmlhttp.onreadystatechange = function() {
if(request.readyState == 4 && request.status == 200) {
// the request has come to an end, remove the preloader
removePreloader();
} else {
// the request isn't finished, add the preloader
addPreloader()
}
};
xmlhttp.open('GET', your_file.php, true);
xmlhttp.send();
グローバルレベルでのAJAXイベントのリッスン
// Store a reference to the native method
let open = XMLHttpRequest.prototype.open;
// Overwrite the native method
XMLHttpRequest.prototype.open = function() {
// Assign an event listener
this.addEventListener("load", event => console.log(XHR), false);
// Call the stored reference to the native method
open.apply(this, arguments);
};