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