Come effettuare una chiamata AJAX senza jQuery?


789

Come effettuare una chiamata AJAX utilizzando JavaScript, senza utilizzare jQuery?


20
Si noti che, sebbene molte delle risposte qui suggeriscano l'ascolto di readystatechange , i browser moderni ora supportano il caricamento , l' interruzione , l' avanzamento e gli eventi di errore per XMLHttpRequest (probabilmente ti preoccuperai solo del caricamento ).
Paul S.

2
@ImadoddinIbnAlauddin ad esempio quando non è necessaria la sua funzionalità principale (attraversamento DOM).
SET

8
youmightnotneedjquery.com molti esempi js puri incl. ajax per ie8 +, ie9 + e ie10 +
Sanya_Zol

1
w3schools ha fatto una graduale introduzione ajax senza jquery: w3schools.com/js/js_ajax_intro.asp
eli

Puoi anche usare EHTML: github.com/Guseyn/EHTML Usa l'elemento e-json per recuperare json e
mapparlo

Risposte:


591

Con JavaScript "vaniglia":

<script type="text/javascript">
function loadXMLDoc() {
    var xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == XMLHttpRequest.DONE) {   // XMLHttpRequest.DONE == 4
           if (xmlhttp.status == 200) {
               document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
           }
           else if (xmlhttp.status == 400) {
              alert('There was an error 400');
           }
           else {
               alert('something else other than 200 was returned');
           }
        }
    };

    xmlhttp.open("GET", "ajax_info.txt", true);
    xmlhttp.send();
}
</script>

Con jQuery:

$.ajax({
    url: "test.html",
    context: document.body,
    success: function(){
      $(this).addClass("done");
    }
});

1
@Fractaliste Se chiami semplicemente i callback dopo i blocchi if relativi a xmlhttp.status, chiamali lì e il gioco è fatto.
Jay,

5
@Wade Penso che Gokigooooks stia dicendo quando ha letto Con JavaScript "vaniglia" ha pensato che fosse una libreria JavaScript che doveva scaricare. Potrebbe anche riferirsi a Vanilla JS .
Trisped

221

Usando il seguente frammento puoi fare cose simili abbastanza facilmente, in questo modo:

ajax.get('/test.php', {foo: 'bar'}, function() {});

Ecco il frammento:

var ajax = {};
ajax.x = function () {
    if (typeof XMLHttpRequest !== 'undefined') {
        return new XMLHttpRequest();
    }
    var versions = [
        "MSXML2.XmlHttp.6.0",
        "MSXML2.XmlHttp.5.0",
        "MSXML2.XmlHttp.4.0",
        "MSXML2.XmlHttp.3.0",
        "MSXML2.XmlHttp.2.0",
        "Microsoft.XmlHttp"
    ];

    var xhr;
    for (var i = 0; i < versions.length; i++) {
        try {
            xhr = new ActiveXObject(versions[i]);
            break;
        } catch (e) {
        }
    }
    return xhr;
};

ajax.send = function (url, callback, method, data, async) {
    if (async === undefined) {
        async = true;
    }
    var x = ajax.x();
    x.open(method, url, async);
    x.onreadystatechange = function () {
        if (x.readyState == 4) {
            callback(x.responseText)
        }
    };
    if (method == 'POST') {
        x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    }
    x.send(data)
};

ajax.get = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    ajax.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async)
};

ajax.post = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    ajax.send(url, callback, 'POST', query.join('&'), async)
};

1
Questo è davvero un grande passo in avanti, ma penso che ti manchi qualcosa che è presente nella risposta di @ 3nigma. Cioè, non sono sicuro di quanto abbia senso fare determinate richieste (tutte ricevono e alcuni messaggi) senza restituire la risposta del server. Ho aggiunto un'altra linea alla fine del metodo di invio - return x.responseText;- e quindi restituire ciascuna delle ajax.sendchiamate.
Sam,

3
@Sam [in genere] non è possibile restituire come richiesta asincrona. È necessario gestire la risposta in una richiamata.
Petah,

@ Sam c'è un esempio:ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });
Petah,

Bel frammento. Tuttavia, non dovrebbe essere query.join('&').replace(/%20/g, '+')invece?
afsantos,

3
Includi anche la richiesta CORS includendo questa riga come opzione. 'xhr.withCredentials = true;'
Akam

131

So che questa è una domanda abbastanza vecchia, ma ora c'è un'API più bella disponibile nativamente nei browser più recenti . Il fetch()metodo consente di effettuare richieste Web. Ad esempio, per richiedere alcuni json da /get-data:

var opts = {
  method: 'GET',      
  headers: {}
};
fetch('/get-data', opts).then(function (response) {
  return response.json();
})
.then(function (body) {
  //doSomething with body;
});

Vedi qui per maggiori dettagli.


9
In realtà, sarebbe errato affermare che l'API Fetch funziona nei "browser più recenti", poiché IE e Edge non lo supportano. (Edge 14 richiede all'utente di abilitare specificamente questa funzione) caniuse.com/#feat=fetch
saluce

7
Qui dovrebbe essere menzionato il polyfill di GitHub. github.com/github/fetch
TylerY86

7
Aggiungi <script src="https://cdn.rawgit.com/github/fetch/master/fetch.js"></script>e usa il recupero come un campione.
TylerY86,

7
@saluce Ora è abilitato per impostazione predefinita in Edge 14 (e IE non è più il "nuovo" browser :-)
Supersharp

1
Non usare Fetch su dispositivo mobile. Ha un problema con le lettere minuscole dell'intestazione HTTP su Android. Funziona bene su iOS.
Kenny Lim,

104

È possibile utilizzare la seguente funzione:

function callAjax(url, callback){
    var xmlhttp;
    // compatible with IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
            callback(xmlhttp.responseText);
        }
    }
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

Puoi provare soluzioni simili online su questi link:


Sarebbe anche bello aggiungere alcune variabili di input per la richiesta (verrà utilizzato in xmlhttp.send (richiesta);)
Pavel Perna,

2
@PavelPerna, poiché l'esempio qui è a GET, quindi puoi semplicemente aggiungerli alla richiesta, ma per essere più generale, sono con te, ho davvero pensato di aggiornare la risposta per accettare i parametri di richiesta come parametro della funzione qui , e anche per passare il metodo ( GETo POST), ma ciò che mi ha fermato è che voglio mantenere la risposta qui il più semplice possibile per la gente di provarla il più velocemente possibile. In realtà, odiavo altre risposte per essere troppo lungo perché stanno cercando di essere perfetti :)
AbdelHady,

40

Che ne dici di questa versione in semplice ES6 / ES2015 ?

function get(url) {
  return new Promise((resolve, reject) => {
    const req = new XMLHttpRequest();
    req.open('GET', url);
    req.onload = () => req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));
    req.onerror = (e) => reject(Error(`Network Error: ${e}`));
    req.send();
  });
}

La funzione restituisce una promessa . Ecco un esempio su come utilizzare la funzione e gestire la promessa che restituisce:

get('foo.txt')
.then((data) => {
  // Do stuff with data, if foo.txt was successfully loaded.
})
.catch((err) => {
  // Do stuff on error...
});

Se è necessario caricare un file json, è possibile utilizzare JSON.parse()per convertire i dati caricati in un oggetto JS.

Puoi anche integrarti req.responseType='json'nella funzione, ma sfortunatamente non esiste un supporto IE per questo , quindi mi atterrei JSON.parse().


2
Usando XMLHttpRequestsi effettua un tentativo asincrono di caricare un file. Ciò significa che l'esecuzione del codice continuerà, mentre il file verrà caricato in background. Per utilizzare il contenuto del file nello script è necessario un meccanismo che indichi allo script quando il file ha terminato il caricamento o il caricamento non è riuscito. Ecco dove le promesse tornano utili. Esistono altri modi per risolvere questo problema, ma penso che le promesse siano più convenienti.
Rotareti,

@Rotareti I browser mobili supportano questo approccio?
bodruk,

Solo le versioni più recenti del browser lo supportano. Una pratica comune è scrivere il tuo codice nell'ultima ES6 / 7 / .. e usare Babel o simili per traspilarlo di nuovo su ES5 per un migliore supporto del browser.
Rotareti,

2
@Rotareti Puoi anche spiegare perché questo sarebbe più conveniente di un callback 'semplice'? Questa convenienza vale lo sforzo extra per traspilarla per il supporto del vecchio browser?
lennyklb,

@LennartKloppenburg Penso che questa risposta la spieghi bene: stackoverflow.com/a/14244950/1612318 "Vale la pena di dedicare uno sforzo in più per traspilarla per il supporto del vecchio browser?" Le promesse sono solo una delle tante funzioni fornite con ES6 / 7. Se usi un transpiler puoi scrivere JS aggiornato. Ne vale la pena!
Rotareti,

38
 var xhReq = new XMLHttpRequest();
 xhReq.open("GET", "sumGet.phtml?figure1=5&figure2=10", false);
 xhReq.send(null);
 var serverResponse = xhReq.responseText;
 alert(serverResponse); // Shows "15"

58
Non effettuare chiamate sincrone. Utilizzare xhReq.onload e utilizzare i callback.
19

3
@FellowStranger oReq.onload = function () {/*this.responseText*/};
19h

3
@kenansulayman Cosa c'è che non va nella chiamata sincrona? A volte si adatta al meglio.
Andrii Nemchenko,

@Andrey: niente, per quanto ti rendi conto che stai interrompendo l'esecuzione di tutto fino a quando non viene restituita la risposta dal server. Niente di eccezionale, ma forse non esattamente adeguato per alcuni usi.
mrówa,

Inoltre, se il server in realtà non risponde mai per qualche motivo, il resto del codice non verrà mai eseguito.
Elefante casuale

35

Usa XMLHttpRequest .

Richiesta GET semplice

httpRequest = new XMLHttpRequest()
httpRequest.open('GET', 'http://www.example.org/some.file')
httpRequest.send()

Richiesta POST semplice

httpRequest = new XMLHttpRequest()
httpRequest.open('POST', 'http://www.example.org/some/endpoint')
httpRequest.send('some data')

Possiamo specificare che la richiesta deve essere asincrona (true), predefinita o sincrona (false) con un terzo argomento facoltativo.

// Make a synchronous GET request
httpRequest.open('GET', 'http://www.example.org/some.file', false)

Possiamo impostare le intestazioni prima di chiamare httpRequest.send()

httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Siamo in grado di gestire la risposta impostando httpRequest.onreadystatechangeuna funzione prima di chiamarehttpRequest.send()

httpRequest.onreadystatechange = function(){
  // Process the server response here.
  if (httpRequest.readyState === XMLHttpRequest.DONE) {
    if (httpRequest.status === 200) {
      alert(httpRequest.responseText);
    } else {
      alert('There was a problem with the request.');
    }
  }
}

1
Si noti che esistono altri stati di successo oltre 200, ad esempio 201
Nate Vaughan,

30

È possibile ottenere l'oggetto corretto in base al browser con

function getXmlDoc() {
  var xmlDoc;

  if (window.XMLHttpRequest) {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlDoc = new XMLHttpRequest();
  }
  else {
    // code for IE6, IE5
    xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return xmlDoc;
}

Con l'oggetto corretto, un GET potrebbe essere astratto per:

function myGet(url, callback) {
  var xmlDoc = getXmlDoc();

  xmlDoc.open('GET', url, true);

  xmlDoc.onreadystatechange = function() {
    if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
      callback(xmlDoc);
    }
  }

  xmlDoc.send();
}

E un POST per:

function myPost(url, data, callback) {
  var xmlDoc = getXmlDoc();

  xmlDoc.open('POST', url, true);
  xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

  xmlDoc.onreadystatechange = function() {
    if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
      callback(xmlDoc);
    }
  }

  xmlDoc.send(data);
}

18

Stavo cercando un modo per includere le promesse con Ajax ed escludere jQuery. C'è un articolo su HTML5 Rocks che parla delle promesse di ES6. (È possibile eseguire il polyfill con una libreria di promesse come Q ). È possibile utilizzare lo snippet di codice che ho copiato dall'articolo.

function get(url) {
  // Return a new promise.
  return new Promise(function(resolve, reject) {
    // Do the usual XHR stuff
    var req = new XMLHttpRequest();
    req.open('GET', url);

    req.onload = function() {
      // This is called even on 404 etc
      // so check the status
      if (req.status == 200) {
        // Resolve the promise with the response text
        resolve(req.response);
      }
      else {
        // Otherwise reject with the status text
        // which will hopefully be a meaningful error
        reject(Error(req.statusText));
      }
    };

    // Handle network errors
    req.onerror = function() {
      reject(Error("Network Error"));
    };

    // Make the request
    req.send();
  });
}

Nota: ho anche scritto un articolo su questo .


15

Una piccola combinazione da un paio degli esempi seguenti e creato questo semplice pezzo:

function ajax(url, method, data, async)
{
    method = typeof method !== 'undefined' ? method : 'GET';
    async = typeof async !== 'undefined' ? async : false;

    if (window.XMLHttpRequest)
    {
        var xhReq = new XMLHttpRequest();
    }
    else
    {
        var xhReq = new ActiveXObject("Microsoft.XMLHTTP");
    }


    if (method == 'POST')
    {
        xhReq.open(method, url, async);
        xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        xhReq.send(data);
    }
    else
    {
        if(typeof data !== 'undefined' && data !== null)
        {
            url = url+'?'+data;
        }
        xhReq.open(method, url, async);
        xhReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        xhReq.send(null);
    }
    //var serverResponse = xhReq.responseText;
    //alert(serverResponse);
}

// Example usage below (using a string query):

ajax('http://www.google.com');
ajax('http://www.google.com', 'POST', 'q=test');

OPPURE se i parametri sono oggetto / i - piccola modifica del codice aggiuntivo:

var parameters = {
    q: 'test'
}

var query = [];
for (var key in parameters)
{
    query.push(encodeURIComponent(key) + '=' + encodeURIComponent(parameters[key]));
}

ajax('http://www.google.com', 'POST', query.join('&'));

Entrambi dovrebbero essere completamente compatibili con browser + versione.


Vale la pena usare hasOwnProperty all'interno del ciclo for qui?
Kibibu,

15

Se non vuoi includere JQuery, proverei alcune librerie AJAX leggere.

Il mio preferito è reqwest. È solo 3,4kb e molto ben costruito: https://github.com/ded/Reqwest

Ecco una richiesta GET di esempio con reqwest:

reqwest({
    url: url,
    method: 'GET',
    type: 'json',
    success: onSuccess
});

Ora, se vuoi qualcosa di ancora più leggero, proverei microAjax a soli 0,4kb: https://code.google.com/p/microajax/

Questo è tutto il codice qui:

function microAjax(B,A){this.bindFunction=function(E,D){return function(){return E.apply(D,[D])}};this.stateChange=function(D){if(this.request.readyState==4){this.callbackFunction(this.request.responseText)}};this.getRequest=function(){if(window.ActiveXObject){return new ActiveXObject("Microsoft.XMLHTTP")}else{if(window.XMLHttpRequest){return new XMLHttpRequest()}}return false};this.postBody=(arguments[2]||"");this.callbackFunction=A;this.url=B;this.request=this.getRequest();if(this.request){var C=this.request;C.onreadystatechange=this.bindFunction(this.stateChange,this);if(this.postBody!==""){C.open("POST",B,true);C.setRequestHeader("X-Requested-With","XMLHttpRequest");C.setRequestHeader("Content-type","application/x-www-form-urlencoded");C.setRequestHeader("Connection","close")}else{C.open("GET",B,true)}C.send(this.postBody)}};

Ed ecco una chiamata di esempio:

microAjax(url, onSuccess);

1
Penso che ci sia un problema con microAjax, quando lo chiami due volte (a causa del numeroso "questo", penso, ci deve essere una collisione). Non so se chiamare due "nuovi microAjax" sia una buona soluzione, vero?
Jill-Jênn Vie,

13

Vecchio ma ci proverò, forse qualcuno troverà queste informazioni utili.

Questa è la quantità minima di codice necessaria per eseguire una GETrichiesta e recuperare alcuni JSONdati formattati. Questo è applicabile solo ai browser moderni come le ultime versioni di Chrome , FF , Safari , Opera e Microsoft Edge .

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data.json'); // by default async 
xhr.responseType = 'json'; // in which format you expect the response to be


xhr.onload = function() {
  if(this.status == 200) {// onload called even on 404 etc so check the status
   console.log(this.response); // No need for JSON.parse()
  }
};

xhr.onerror = function() {
  // error 
};


xhr.send();

Scopri anche la nuova API Fetch che è una sostituzione basata sulle promesse per l' API XMLHttpRequest .


9

XMLHttpRequest ()

Puoi usare il XMLHttpRequest()costruttore per creare un nuovo XMLHttpRequestoggetto (XHR) che ti permetterà di interagire con un server usando metodi di richiesta HTTP standard (come GETe POST):

const data = JSON.stringify({
  example_1: 123,
  example_2: 'Hello, world!',
});

const request = new XMLHttpRequest();

request.addEventListener('load', function () {
  if (this.readyState === 4 && this.status === 200) {
    console.log(this.responseText);
  }
});

request.open('POST', 'example.php', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(data);

fetch ()

Puoi anche usare il fetch()metodo per ottenere un oggetto Promiseche si risolve Responsenell'oggetto che rappresenta la risposta alla tua richiesta:

const data = JSON.stringify({
  example_1: 123,
  example_2: 'Hello, world!',
});

fetch('example.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  },
  body: data,
}).then(response => {
  if (response.ok) {
    response.text().then(response => {
      console.log(response);
    });
  }
});

navigator.sendBeacon ()

D'altra parte, se si sta semplicemente tentando di inserire POSTdati e non è necessaria una risposta dal server, la soluzione più breve sarebbe quella di utilizzare navigator.sendBeacon():

const data = JSON.stringify({
  example_1: 123,
  example_2: 'Hello, world!',
});

navigator.sendBeacon('example.php', data);

1
Mi piacciono molto le tue risposte, perché copri la maggior parte dei casi anche per Internet Explorer con XMLHttpRequest, ma consiglierei di cambiare: "const data = ..." in: "var data = ..." in questo esempio (XMLHttpRequest) quindi è pienamente compatibile con esso
Dazag

8

Da youMightNotNeedJquery.com +JSON.stringify

var request = new XMLHttpRequest();
request.open('POST', '/my/url', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(JSON.stringify(data));

7

Questo può aiutare:

function doAjax(url, callback) {
    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            callback(xmlhttp.responseText);
        }
    }

    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

4
<html>
  <script>
    var xmlDoc = null ;

  function load() {
    if (typeof window.ActiveXObject != 'undefined' ) {
      xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
      xmlDoc.onreadystatechange = process ;
    }
    else {
      xmlDoc = new XMLHttpRequest();
      xmlDoc.onload = process ;
    }
    xmlDoc.open( "GET", "background.html", true );
    xmlDoc.send( null );
  }

  function process() {
    if ( xmlDoc.readyState != 4 ) return ;
    document.getElementById("output").value = xmlDoc.responseText ;
  }

  function empty() {
    document.getElementById("output").value = '<empty>' ;
  }
</script>

<body>
  <textarea id="output" cols='70' rows='40'><empty></textarea>
  <br></br>
  <button onclick="load()">Load</button> &nbsp;
  <button onclick="empty()">Clear</button>
</body>
</html>

4

Bene, è solo un processo facile in 4 fasi,

spero possa essere d'aiuto

Step 1. Memorizzare il riferimento all'oggetto XMLHttpRequest

var xmlHttp = createXmlHttpRequestObject();

Step 2. Recupera l'oggetto XMLHttpRequest

function createXmlHttpRequestObject() {
    // will store the reference to the XMLHttpRequest object
    var xmlHttp;
    // if running Internet Explorer
    if (window.ActiveXObject) {
        try {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
            xmlHttp = false;
        }
    }
    // if running Mozilla or other browsers
    else {
        try {
            xmlHttp = new XMLHttpRequest();
        } catch (e) {
            xmlHttp = false;
        }
    }
    // return the created object or display an error message
    if (!xmlHttp)
        alert("Error creating the XMLHttpRequest object.");
    else
        return xmlHttp;
}

Step 3. Effettua una richiesta HTTP asincrona utilizzando l'oggetto XMLHttpRequest

function process() {
    // proceed only if the xmlHttp object isn't busy
    if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {
        // retrieve the name typed by the user on the form
        item = encodeURIComponent(document.getElementById("input_item").value);
        // execute the your_file.php page from the server
        xmlHttp.open("GET", "your_file.php?item=" + item, true);
        // define the method to handle server responses
        xmlHttp.onreadystatechange = handleServerResponse;
        // make the server request
        xmlHttp.send(null);
    }
}

Step 4. Eseguito automaticamente alla ricezione di un messaggio dal server

function handleServerResponse() {

    // move forward only if the transaction has completed
    if (xmlHttp.readyState == 4) {
        // status of 200 indicates the transaction completed successfully
        if (xmlHttp.status == 200) {
            // extract the XML retrieved from the server
            xmlResponse = xmlHttp.responseText;
            document.getElementById("put_response").innerHTML = xmlResponse;
            // restart sequence
        }
        // a HTTP status different than 200 signals an error
        else {
            alert("There was a problem accessing the server: " + xmlHttp.statusText);
        }
    }
}

3

in semplice JavaScript nel browser:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
  if (xhr.readyState == XMLHttpRequest.DONE ) {
    if(xhr.status == 200){
      console.log(xhr.responseText);
    } else if(xhr.status == 400) {
      console.log('There was an error 400');
    } else {
      console.log('something else other than 200 was returned');
    }
  }
}

xhr.open("GET", "mock_data.json", true);

xhr.send();

O se vuoi usare Browserify per raggruppare i tuoi moduli usando node.js. Puoi usare superagent :

var request = require('superagent');
var url = '/mock_data.json';

 request
   .get(url)
   .end(function(err, res){
     if (res.ok) {
       console.log('yay got ' + JSON.stringify(res.body));
     } else {
       console.log('Oh no! error ' + res.text);
     }
 });

3

Ecco un JSFiffle senza JQuery

http://jsfiddle.net/rimian/jurwre07/

function loadXMLDoc() {
    var xmlhttp = new XMLHttpRequest();
    var url = 'http://echo.jsontest.com/key/value/one/two';

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == XMLHttpRequest.DONE) {
            if (xmlhttp.status == 200) {
                document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
            } else if (xmlhttp.status == 400) {
                console.log('There was an error 400');
            } else {
                console.log('something else other than 200 was returned');
            }
        }
    };

    xmlhttp.open("GET", url, true);
    xmlhttp.send();
};

loadXMLDoc();

3
var load_process = false;
function ajaxCall(param, response) {

 if (load_process == true) {
     return;
 }
 else
 { 
  if (param.async == undefined) {
     param.async = true;
 }
 if (param.async == false) {
         load_process = true;
     }
 var xhr;

 xhr = new XMLHttpRequest();

 if (param.type != "GET") {
     xhr.open(param.type, param.url, true);

     if (param.processData != undefined && param.processData == false && param.contentType != undefined && param.contentType == false) {
     }
     else if (param.contentType != undefined || param.contentType == true) {
         xhr.setRequestHeader('Content-Type', param.contentType);
     }
     else {
         xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
     }


 }
 else {
     xhr.open(param.type, param.url + "?" + obj_param(param.data));
 }

 xhr.onprogress = function (loadTime) {
     if (param.progress != undefined) {
         param.progress({ loaded: loadTime.loaded }, "success");
     }
 }
 xhr.ontimeout = function () {
     this.abort();
     param.success("timeout", "timeout");
     load_process = false;
 };

 xhr.onerror = function () {
     param.error(xhr.responseText, "error");
     load_process = false;
 };

 xhr.onload = function () {
    if (xhr.status === 200) {
         if (param.dataType != undefined && param.dataType == "json") {

             param.success(JSON.parse(xhr.responseText), "success");
         }
         else {
             param.success(JSON.stringify(xhr.responseText), "success");
         }
     }
     else if (xhr.status !== 200) {
         param.error(xhr.responseText, "error");

     }
     load_process = false;
 };
 if (param.data != null || param.data != undefined) {
     if (param.processData != undefined && param.processData == false && param.contentType != undefined && param.contentType == false) {
             xhr.send(param.data);

     }
     else {
             xhr.send(obj_param(param.data));

     }
 }
 else {
         xhr.send();

 }
 if (param.timeout != undefined) {
     xhr.timeout = param.timeout;
 }
 else
{
 xhr.timeout = 20000;
}
 this.abort = function (response) {

     if (XMLHttpRequest != null) {
         xhr.abort();
         load_process = false;
         if (response != undefined) {
             response({ status: "success" });
         }
     }

 }
 }
 }

function obj_param(obj) {
var parts = [];
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
    }
}
return parts.join('&');
}

la mia chiamata ajax

  var my_ajax_call=ajaxCall({
    url: url,
    type: method,
    data: {data:value},
    dataType: 'json',
    async:false,//synchronous request. Default value is true 
    timeout:10000,//default timeout 20000
    progress:function(loadTime,status)
    {
    console.log(loadTime);
     },
    success: function (result, status) {
      console.log(result);
    },
      error :function(result,status)
    {
    console.log(result);
     }
      });

per interrompere precedenti richieste

      my_ajax_call.abort(function(result){
       console.log(result);
       });

2

HTML:

<!DOCTYPE html>
    <html>
    <head>
    <script>
    function loadXMLDoc()
    {
    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
      }
    xmlhttp.open("GET","1.php?id=99freebies.blogspot.com",true);
    xmlhttp.send();
    }
    </script>
    </head>
    <body>

    <div id="myDiv"><h2>Let AJAX change this text</h2></div>
    <button type="button" onclick="loadXMLDoc()">Change Content</button>

    </body>
    </html>

PHP:

<?php

$id = $_GET[id];
print "$id";

?>

Se la linea singola non ha bisogno di parentesi graffe, nessuno usa IE6, questo probabilmente è stato incollato, usa onload anziché onreadystatechange, trova errori per possibili chiamate ricorsive, xmlhttp è un nome variabile terribile, chiamalo semplicemente x.
super

1

Una soluzione molto buona con javascript puro è qui

/*create an XMLHttpRequest object*/

let GethttpRequest=function(){  
  let httpRequest=false;
  if(window.XMLHttpRequest){
    httpRequest   =new XMLHttpRequest();
    if(httpRequest.overrideMimeType){
    httpRequest.overrideMimeType('text/xml');
    }
  }else if(window.ActiveXObject){
    try{httpRequest   =new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
      try{
        httpRequest   =new ActiveXObject("Microsoft.XMLHTTP");
      }catch(e){}
    }
  }
  if(!httpRequest){return 0;}
  return httpRequest;
}

  /*Defining a function to make the request every time when it is needed*/

  function MakeRequest(){

    let uriPost       ="myURL";
    let xhrPost       =GethttpRequest();
    let fdPost        =new FormData();
    let date          =new Date();

    /*data to be sent on server*/
    let data          = { 
                        "name"      :"name",
                        "lName"     :"lName",
                        "phone"     :"phone",
                        "key"       :"key",
                        "password"  :"date"
                      };

    let JSONdata =JSON.stringify(data);             
    fdPost.append("data",JSONdata);
    xhrPost.open("POST" ,uriPost, true);
    xhrPost.timeout = 9000;/*the time you need to quit the request if it is not completed*/
    xhrPost.onloadstart = function (){
      /*do something*/
    };
    xhrPost.onload      = function (){
      /*do something*/
    };
    xhrPost.onloadend   = function (){
      /*do something*/
    }
    xhrPost.onprogress  =function(){
      /*do something*/
    }

    xhrPost.onreadystatechange =function(){

      if(xhrPost.readyState < 4){

      }else if(xhrPost.readyState === 4){

        if(xhrPost.status === 200){

          /*request succesfull*/

        }else if(xhrPost.status !==200){

          /*request failled*/

        }

      }


   }
  xhrPost.ontimeout = function (e){
    /*you can stop the request*/
  }
  xhrPost.onerror = function (){
    /*you can try again the request*/
  };
  xhrPost.onabort = function (){
    /*you can try again the request*/
  };
  xhrPost.overrideMimeType("text/plain; charset=x-user-defined-binary");
  xhrPost.setRequestHeader("Content-disposition", "form-data");
  xhrPost.setRequestHeader("X-Requested-With","xmlhttprequest");
  xhrPost.send(fdPost);
}

/*PHP side
<?php
  //check if the variable $_POST["data"] exists isset() && !empty()
  $data        =$_POST["data"];
  $decodedData =json_decode($_POST["data"]);
  //show a single item from the form
  echo $decodedData->name;

?>
*/

/*Usage*/
MakeRequest();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.