Ricerca…


introduzione

AJAX sta per "Asynchronous JavaScript and XML". Sebbene il nome includa XML, JSON è più spesso utilizzato a causa della sua formattazione più semplice e ridondanza inferiore. AJAX consente all'utente di comunicare con risorse esterne senza ricaricare la pagina web.

Osservazioni

AJAX sta per un sincrono J avascript un ND X ML. Ciononostante è possibile utilizzare altri tipi di dati e, nel caso di alla modalità sincrona deprecata.

AJAX consente alle pagine Web di inviare richieste HTTP al server e ricevere una risposta, senza dover ricaricare l'intera pagina.

Utilizzo di GET e nessun parametro

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

L'API di fetch è un modo più promettente per fare richieste HTTP asincrone.

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

Invio e ricezione di dati JSON tramite POST

6

La richiesta di recupero promette di restituire inizialmente oggetti di risposta. Questi forniranno informazioni di intestazione di risposta, ma non includono direttamente il corpo della risposta, che potrebbe non essere stato ancora caricato. I metodi sull'oggetto Response come .json() possono essere utilizzati per attendere il caricamento del corpo della risposta, quindi analizzarlo.

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

Visualizzazione delle domande JavaScript principali del mese dall'API di Stack Overflow

Possiamo fare una richiesta AJAX all'API di Stack Exchange per recuperare un elenco delle principali domande JavaScript per il mese, quindi presentarle come elenco di collegamenti. Se la richiesta non riesce o restituisce un errore API, la nostra gestione degli errori di promessa visualizza invece l'errore.

6
Visualizza i risultati in tempo reale su 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);
});

Utilizzo di GET con parametri

Questa funzione esegue una chiamata AJAX utilizzando GET che ci consente di inviare parametri (oggetto) a un file (stringa) e di avviare una funzione di richiamata (funzione) al termine della richiesta.

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

Ecco come lo usiamo:

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

E il seguente mostra come recuperare i parametri cars.php 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;
}

Se avessi console.log(response) nella funzione di callback, il risultato in console sarebbe stato:

Il colore della tua auto è viola. È un modello Volvo 300!

Controlla se esiste un file tramite una richiesta HEAD

Questa funzione esegue una richiesta AJAX usando il metodo HEAD permettendoci di verificare se un file esiste nella directory data come argomento. Ci consente inoltre di avviare un callback per ogni caso (successo, fallimento).

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

Aggiungi un preloader AJAX

Ecco un modo per mostrare un preloader GIF mentre una chiamata AJAX è in esecuzione. Dobbiamo preparare le nostre funzioni di aggiunta e rimozione del preloader:

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

Ora stiamo andando a vedere dove usare queste funzioni.

var request = new XMLHttpRequest();

All'interno della funzione onreadystatechange dovresti avere un'istruzione if con condizione: request.readyState == 4 && request.status == 200 .

Se vero : la richiesta è finita e la risposta è pronta è dove utilizzeremo removePreloader() .

Altrimenti se false : la richiesta è ancora in corso, in questo caso eseguiremo la funzione 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();

Ascoltare eventi AJAX a livello globale

// 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow