Suche…


Einführung

AJAX steht für "Asynchronous JavaScript und XML". Obwohl der Name XML enthält, wird JSON aufgrund seiner einfacheren Formatierung und geringeren Redundanz häufiger verwendet. Mit AJAX kann der Benutzer mit externen Ressourcen kommunizieren, ohne die Webseite erneut laden zu müssen.

Bemerkungen

AJAX steht für einen synchronen J avascript nd X ML. Dennoch können Sie tatsächlich andere Arten von Daten verwenden , und in dem Fall von -Schalter zum deprecated synchronen Modus.

Mit AJAX können Webseiten HTTP-Anforderungen an den Server senden und eine Antwort erhalten, ohne die gesamte Seite neu laden zu müssen.

Verwenden Sie GET und keine Parameter

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

Die fetch API ist eine neuere versprechenbasierte Möglichkeit, asynchrone HTTP-Anforderungen zu stellen.

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

Senden und Empfangen von JSON-Daten per POST

6

Abrufanforderungsversprechen geben zunächst Antwortobjekte zurück. Diese enthalten Antwortheaderinformationen, enthalten jedoch nicht direkt den Antworttext, der möglicherweise noch nicht einmal geladen wurde. Methoden für das Response-Objekt wie .json() können verwendet werden, um zu warten, bis der Antworttext geladen wird, und ihn dann zu analysieren.

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);
});

Anzeige der wichtigsten JavaScript-Fragen des Monats aus der Stack Overflow-API

Wir können eine AJAX-Anforderung an die API von Stack Exchange stellen , um eine Liste der wichtigsten JavaScript-Fragen für den Monat abzurufen, und diese dann als Linkliste präsentieren. Wenn die Anforderung eines API - Fehler fehlschlägt oder die Erträge, unsere Versprechen zeigt Fehlerbehandlung die Fehler statt.

6
Live-Ergebnisse auf HyperWeb anzeigen .
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);
});

Verwendung von GET mit Parametern

Diese Funktion führt einen AJAX-Aufruf mit GET aus, sodass wir Parameter (Objekt) an eine Datei (String) senden und einen Callback (Funktion) starten können, wenn die Anforderung beendet ist.

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

So verwenden wir es:

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
});

Und das Folgende zeigt, wie man die URL-Parameter in cars.php :

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;
}

Wenn Sie console.log(response) in der Rückruffunktion hätten, wäre das Ergebnis in der Konsole console.log(response) gewesen:

Die Farbe Ihres Autos ist lila. Es ist ein Volvo-Modell 300!

Prüfen Sie, ob eine Datei über eine HEAD-Anforderung vorhanden ist

Diese Funktion führt eine AJAX-Anforderung unter Verwendung der HEAD-Methode aus, um zu prüfen, ob eine Datei in dem als Argument angegebenen Verzeichnis vorhanden ist . Außerdem können wir für jeden Fall einen Rückruf starten (Erfolg, Misserfolg).

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

Fügen Sie einen AJAX-Preloader hinzu

So zeigen Sie einen GIF-Preloader an, während ein AJAX-Aufruf ausgeführt wird. Wir müssen das Hinzufügen und Entfernen von Preloader-Funktionen vorbereiten:

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

Jetzt werden wir untersuchen, wo diese Funktionen verwendet werden können.

var request = new XMLHttpRequest();

Innerhalb der onreadystatechange Funktion sollten Sie eine if-Anweisung mit der folgenden Bedingung haben: request.readyState == 4 && request.status == 200 .

Wenn wahr : Die Anfrage ist abgeschlossen und die Antwort ist fertig. Dort verwenden wir removePreloader() .

Andernfalls false : Die Anforderung wird noch ausgeführt. In diesem Fall führen wir die Funktion 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-Events auf globaler Ebene anhören

// 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow