サーチ…


前書き

AJAXは "Asynchronous JavaScript and XML"の略です。この名前にはXMLが含まれていますが、JSONはフォーマットが簡単で冗長性が低いため、より頻繁に使用されます。 AJAXを使用すると、Webページをリロードせずに外部リソースと通信することができます。

備考

AJAXは、同期J avaScript ND X MLの略です。それにもかかわらず、実際には他のタイプのデータを使用することができますの場合、廃止予定の同期モードに切り替えます。

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();
6

fetch APIは、非同期HTTPリクエストを作成するためのより新しい約束に基づく方法です。

fetch('/').then(response => response.text()).then(text => {
  console.log("The home page is " + text.length + " characters long.");
});

POSTを介したJSONデータの送受信

6

リクエスト要求のフェッチは、最初にレスポンスオブジェクトを返します。これらはレスポンスヘッダー情報を提供しますが、まだロードされていない可能性があるレスポンス本文を直接は含みません。 .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の約束のエラー処理によってエラーが表示されます。

6
HyperWebでライブ結果を表示します
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.phpcars.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);
};


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow