Sök…


Introduktion

AJAX står för "Asynkron JavaScript och XML". Även om namnet innehåller XML används JSON oftare på grund av dess enklare formatering och lägre redundans. AJAX tillåter användaren att kommunicera med externa resurser utan att ladda om webbsidan.

Anmärkningar

AJAX står för A synkron J avascript en nd X ML. Ändå kan du faktiskt använda andra typer av data och - i fallet med växla till det avskrivna synkronläget.

AJAX tillåter webbsidor att skicka HTTP-förfrågningar till servern och få ett svar utan att behöva ladda om hela sidan.

Med GET och inga parametrar

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 är ett nyare löfte-baserat sätt att göra asynkrona HTTP-förfrågningar.

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

Skicka och ta emot JSON-data via POST

6

Hämta begäran lovar tillbaka svarobjekt. Dessa kommer att ge information om svarshuvud, men de inkluderar inte direkt svarskroppen, som kanske inte ens har laddat ännu. Metoder på svar-objektet som .json() kan användas för att vänta på att svarskroppen laddas och sedan analysera den.

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

Visar de senaste JavaScript-frågorna för månaden från Stack Overflow API

Vi kan göra en AJAX-begäran till Stack Exchange: s API för att hämta en lista över de bästa JavaScript-frågorna för månaden och sedan presentera dem som en lista med länkar. Om begäran misslyckas eller returnerar ett API-fel visar vår löftfelhantering felet istället.

6
Visa liveresultat på 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);
});

Använda GET med parametrar

Denna funktion kör ett AJAX-samtal med GET så att vi kan skicka parametrar (objekt) till en fil (sträng) och starta ett återuppringning (funktion) när begäran har avslutats.

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

Så här använder vi det:

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

Och följande visar hur du återuppstår url-parametrarna i 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;
}

Om du hade console.log(response) i återuppringningsfunktionen skulle resultatet i konsolen ha varit:

Färgen på din bil är lila. Det är en Volvo-modell 300!

Kontrollera om en fil finns via en HEAD-begäran

Denna funktion kör en AJAX-förfrågan med hjälp av HEAD-metoden som gör att vi kan kontrollera om det finns en fil i katalogen som ges som ett argument. Det ger oss också möjlighet att starta en återuppringning för varje enskilt fall (framgång, misslyckande).

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

Lägg till en AJAX förladdare

Här är ett sätt att visa en GIF-förladdare medan ett AJAX-samtal körs. Vi måste förbereda våra lägga till och ta bort förladdningsfunktioner:

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

Nu ska vi titta på var vi ska använda dessa funktioner.

var request = new XMLHttpRequest();

Inuti onreadystatechange funktionen bör du ha ett if-uttalande med villkor: request.readyState == 4 && request.status == 200 .

Om det är sant : begäran är klar och svaret är klart, det är där vi använder removePreloader() .

Annars om det är falskt : begäran fortfarande pågår, i detta fall kör vi funktionen 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();

Lyssna på AJAX-händelser på global nivå

// 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow