Ajax request with pure Javascript (without APIs)

57

Generally, when we need to use Ajax requests using Javascript, we have handy APIs that help us with this (eg jQuery ).

However, what would be the safest and cross-browser way to accomplish these requests (POST and GET) using pure Javascript ?

    
asked by anonymous 30.01.2014 / 16:15

4 answers

43

quirksmode.org has a complete example Ajax request to work in most browsers (current and former), without the use of external libraries:

function sendRequest(url,callback,postData) {
    var req = createXMLHTTPObject();
    if (!req) return;
    var method = (postData) ? "POST" : "GET";
    req.open(method,url,true);
    req.setRequestHeader('User-Agent','XMLHTTP/1.0');
    if (postData)
        req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    req.onreadystatechange = function () {
        if (req.readyState != 4) return;
        if (req.status != 200 && req.status != 304) {
//          alert('HTTP error ' + req.status);
            return;
        }
        callback(req);
    }
    if (req.readyState == 4) return;
    req.send(postData);
}

var XMLHttpFactories = [
    function () {return new XMLHttpRequest()},
    function () {return new ActiveXObject("Msxml2.XMLHTTP")},
    function () {return new ActiveXObject("Msxml3.XMLHTTP")},
    function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
    var xmlhttp = false;
    for (var i=0;i<XMLHttpFactories.length;i++) {
        try {
            xmlhttp = XMLHttpFactories[i]();
        }
        catch (e) {
            continue;
        }
        break;
    }
    return xmlhttp;
}

The "standardized" part (ie supported by recent browsers, which follow the established standards) is the XMLHttpRequest ". The rest are there to support older browsers.

Source: this answer in SOEN

    
30.01.2014 / 16:22
12
try
{
    var loader = new XMLHttpRequest();
}
catch (err)
{
    // versões antigas do Internet Explorer não tem a classe XMLHttpRequest, precisa usar esse componente ActiveX
    var loader = new ActiveXObject('Microsoft.XMLHTTP');
}

loader.onreadystatechange = function ()
{
    // esse callback é chamado várias vezes para cada mudança de readyState
    // readyState 4 é chamado quando o request é concluído (mesmo que .done() do jQuery)
    // você também pode checar o this.status para ver código de retorno HTTP
    // 200 é sucesso
    // 404 é página não encontrada
    // 403 é acesso negado
    // 500 é erro interno do servidor etc
    if (this.readyState == 4)
    {
        alert(this.responseText);
    }
}
loader.open('POST', 'http://www.exemple.com/submit.php', true);
loader.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
loader.send('nome=Manoel&idade=50'); // use null para métodos que não forem POST
    
30.01.2014 / 16:20
7

The AJAX request in pure Javascript is done with the object XMLHttpRequest . Unless you want to use an old version of Internet Explorer, for example, that used a ActiveX object. So, we usually start with this "quickfix":

var xmlhttp;
if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
else if(window.ActiveXObject) xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.3.0");
else throw "AJAX não suportado!";

Next, you need to listen to the onreadystatechange event of your XMLHttpRequest object:

xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) { // Download concluído e a resposta não contém erros
        return this.responseText; // this dentro dessa function é seu XMLHttpRequest
    }
    // Você pode colocar outras condições aqui, como responder com erro quando o status for 404 ou 500, por exemplo
}

And finally start the request:

xmlhttp.open(metodo, url, true);
// metodo: "GET", "POST", "PUT", "DELETE"... enfim, um suportado pelo HTTP
// url: a URL do seu request
// o terceiro argumento é o 'A' do AJAX. True = request assíncrono; False = request síncrono.
loader.send(queryString); // quesyString é opcional
    
30.01.2014 / 16:27
4

Follow the example below:

try{
    xmlhttp = new XMLHttpRequest();
}catch(ee){
    try{
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
        try{
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }catch(E){
            xmlhttp = false;
        }
    }
}

function pegarCep( CEP ){
    if( CEP.length==0) return false;
    var divCep = document.getElementById('divCep');
    divCep.innerHTML = "Carregando...";
    xmlhttp.open("GET", "/cadastro-sms/br/cep.asp?CEP="+ CEP,true);
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4){
            var resposta = xmlhttp.responseText;
            divCep.innerHTML = resposta;
        }
    }
    xmlhttp.send(null);             
}
    
06.05.2014 / 20:31