Há várias tarefas comuns de front-end para as quais muitos de nós nunca tocamos nas APIs profundas e sujas porque nossas amadas estruturas de JavaScript forneceram maneiras mais fáceis de trabalhar com elas. É por isso que escrevi Como funciona a delegação de eventos em JavaScript, Fazer uma solicitação HTTP básica com o Node.jse dezenas de tutoriais sobre outras publicações de API de baixo nível. A seguir, o XMLHttpRequest, a API que usamos para fazer nossas chamadas AJAX!

Recuperação do objeto XHR

Ao contrário da maioria das APIs, obter o componente principal é, na verdade, um pouco trabalhoso, pois o Internet Explorer costumava exigir um componente ActiveX para que o AJAX funcionasse:

var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
  request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
  try {
    request = new ActiveXObject('Msxml2.XMLHTTP');
  } 
  catch (e) {
    try {
      request = new ActiveXObject('Microsoft.XMLHTTP');
    } 
    catch (e) {}
  }
}

Bleh; o código é feio, mas é isso que o senhor deve esperar por trás da cortina, certo?

Como fazer uma solicitação

Fazer uma solicitação requer duas chamadas de função:

request.open('GET', 'https://davidwalsh.name/ajax-endpoint', true);
request.send(null);

A chamada aberta define o tipo de solicitação (get, post, etc.) e o método send executa a solicitação. Bastante simples! Adicionar cabeçalhos personalizados também é simples:

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

Solicitação de retornos de chamada

É claro que fazer solicitações é um tanto inútil se o senhor não lidar com o resultado, e há duas maneiras de definir um retorno de chamada:

// state changes
request.onreadystatechange = function() {
	if(request.readyState === 4) { // done
		if(request.status === 200) { // complete	
			console.log(request.responseText)
		}
	}
};

// addEventListener
function callbackFn(e) {
	// Handle each event
}
request.addEventListener("progress", callbackFn, false);
request.addEventListener("load", callbackFn, false);
request.addEventListener("error", callbackFn, false);
request.addEventListener("abort", callbackFn, false);

Escolha o método que o senhor preferir, mas o addEventListener provavelmente é mais elegante.


Essa é a minha introdução simples à criação de solicitações AJAX simples com a API XMLHttpRequest nativa. Para obter mais informações sobre testes AJAX comuns, como o envio de dados de formulário, consulte a seção Rede de Desenvolvedores Mozilla!