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 xmlhttprequest -switch, 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();
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
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.
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);
};