Para facilitar a utilização de AJAX em alguns sites que estava desenvolvendo resolvi criar uma classe. Conforme pedido de membro, postarei essa classe aqui.
Embora o código da classe seja auto-explicativo, postarei uma breve explicação:
Para evitar problemas quando o navegador não possui suporte a AJAX, o uso da classe (cujo nome, por falta de criatividade do autor motivos desconhecidos, é AjaxClass) só ficará habilitado se o navegador suportar AJAX. Sendo assim, antes de utilizar a classe verifique se ela existe. Isso pode ser feito da seguinte forma:
if(AjaxClass){
alert("tem suporte AJAX !!!")
//...cria a requisição...
}else{
alert("Não há suporte a AJAX")
}
O AjaxClass traz uma classe interna (AjaxClass.RequestValue) que pode ser utilizada para passar parâmetros à página que será requisitada (seja por POST ou GET). Basta instanciar a classe, manipular os valores (métodos setValue, getValue e remove) e passar essa subclasse como um dos parâmetros do método add (explicarei depois). Exemplo:
//...
var valores = new AjaxClass.RequestValue()
valores.setValue("valor1","bom dia")
valores.setValue("tarde","boa tarde")
valores.setValue("outro_valor","boa noite")
valores.remove("tarde")
alert(valores.getValue("valor1")) // bom dia
alert(valores.getValue("tarde")) // null
alert(valores.getValue("outro_valor")) // boa noite
Para adicionar uma requisição, basta utilizar o método add do AjaxClass. O protótipo da função é:
function(
metodo, //Método da requisição. "GET" ou "POST"
url, //Url da página que será requisitada. Ex.: "pagina1.php"
valores, //Objeto da classe "RequestValue". Também pode ser null (nesse caso, nenhum valor é utilizado)
funcao_sucesso, /*Função chamada quando há
sucesso (o primeiro parâmetro é o resultado da requisição)*/
funcao_erro /*Função chamada quando ocorre algum erro.
Se for passado o valor booleano "true", a função "funcao_sucesso" será
chamada (mas o primeiro parâmetro será "null" ao invés de ser o retorno da requisição)*/
)
Para os exemplos de utilização criei quatro arquivos (dos quais somente três são necessários)
AjaxClass.js (código responsável pela nossa classe);
pagina.html (página que utiliza a classe);
arquivo.asp (script simples em ASP que mostra os valores passados por GET/POST)
arquivo.php (script simples em PHP 5 que mostra os valores passados por GET/POST)
Obs.:
Lembrem-se de salvar os arquivos arquivo.asp e arquivo.php em UTF-8 (na dúvida, abra o bloco de notas, vá em Salvar como, coloque a codificação como UTF-8 e clique em Salvar). Isso deve ser utilizado para qualquer arquivo que venha a ser requisitado por AJAX. Isso pode ser feito nas opções de seu editor.
Criei os arquivos em PHP e ASP apenas para facilitar o entendimento de quem ler (se fizesse em apenas uma linguagem, quem não tivesse experiência nela teria mais dificuldade em entender o código). No arquivo de utilização (pagina.html), o arquivo arquivo.php é requisitado, mas isso pode ser alterado facilmente (basta trocar o ".php" para ".asp" na linha 20). Também é possível alterar o método de POST para GET (o que também irá modificar o resultado da requisição), basta trocar o POST para GET na linha 19.
AjaxClass.js
/******** Classe AJAX ********
Autor: Jonathan Coutinho Luz de Queiroz
E-mail: jonathan.jclq@gmail.com
*/
AjaxClass = function () {
/*Criar requisição AJAX*/
this.CreateXMLHttpRequest = function () {
try {
// Firefox, Opera 8.0+, Safari, IE7+, ...
return new XMLHttpRequest();
} catch (e) {
// Internet Explorer 6+
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
//Internet Explorer 5.5+
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
//Não conseguiu criar o objeto
return null;
}
}
}
return xmlHttp
}
//Objeto XMLHTTP
var xmlhttp = this.CreateXMLHttpRequest()
//Verificamos se a requisição foi instancia com sucesso
if (!xmlhttp) {
/*Não conseguimos instanciar o XMLHTTP.
Nesse caso, o objeto AJAX será "null"*/
return null
}
//Requisições
var atual
var requisicoes = []
var processando
if (!atual) {
atual = 0
}
//Valores para requisição
this.RequestValue = function () {
//Variáveis
var itens = []
//adicionar/Modificar
this.setValue = function (nome, valor) {
try {
valor = valor.toString()
} catch (e) {
valor = ""
}
itens[nome] = valor
}
//Remover
this.remove = function (nome) {
itens[nome] = null
}
//Obter valor
this.getValue = function (nome) {
return itens[nome]
}
//Obter string
this.getString = function () {
//Retorno dessa função
var retorno = ""
//Codificação (tratamento de string)
var encode = function (v) {
return v
.toString()
.replace(/&/g, "%26")
.replace(/ /g, "%20")
}
//Percorre nossos objetos e gera o retorno
for (var i in itens) {
if (itens[i] != null) {
if (retorno != "") {
retorno += "&"
}
retorno += encode(i) + "=" + encode(itens[i])
}
}
//Retornamos o valor
return retorno
}
}
//Adicionar requisição requisição
this.add = function (metodo, url, valores, funcao_sucesso, funcao_erro) {
//Adiciona os valores no array
var i = requisicoes.length
requisicoes[i] = []
//Método da requisição
requisicoes[i]["method"] = metodo.toUpperCase()
//Url da requisição
requisicoes[i]["url"] = url
//Valores da requisição
if (valores == null) {
//Se era nulo, transformamos numa string vazia
valores = ""
} else if (valores.constructor == this.RequestValue) {
/*Se o valor é da classe "RequestValue", obtemos
transformamos numa string que será o novo valor*/
valores = valores.getString()
}
requisicoes[i]["valor"] = valores
//Funções (sucesso/erro)
requisicoes[i]["funcao"] = funcao_sucesso
requisicoes[i]["funcao_erro"] = funcao_erro
//Processa as requisições (não necessariamente essa)
Processa()
}
//Processa
var Processa = function () {
//Verifica se já está processando
if (processando) {
//Se já estamos processando, sai
return
}
//Verifica se ainda há requisições
if (!requisicoes[atual]) {
//Se não há requisição, vamos sair
return
}
//Indica que está processando
processando = true
//Função executada ao terminar a requisição
var OnEnd = function (retorno) {
//Executa as funções de erro/sucesso
if (retorno == null) {
//Verificamos se a função de erro é realmente uma função
if (typeof (requisicoes[atual]["funcao_erro"]) == "function") {
//Se sim, a chamamos passando "null" como parâmetro
requisicoes[atual]["funcao_erro"](null);
} else if (requisicoes[atual]["funcao_erro"] == true) {
/*Se o valor de "funcao_erro" for null, devemos chamar
a mesma função de sucesso com parâmetro "null"*/
requisicoes[atual]["funcao"](null);
}
} else {
/*Se tivermos uma função de sucesso a executamos
passando o valor de retorno como parâmetro*/
if (typeof (requisicoes[atual]["funcao"]) == "function") {
requisicoes[atual]["funcao"](retorno)
}
}
//Indica que não estamos mais processando
processando = false
//Processamos a próxima requisição
atual++
Processa()
}
//Processamento para método GET
var requisicao_url = requisicoes[atual]["url"]
if (
requisicoes[atual]["method"] == "GET" &&
requisicoes[atual]["valor"]
) {
requisicao_url += "?" + requisicoes[atual]["valor"]
}
//Criamos a requisição
xmlhttp.open(requisicoes[atual]["method"], requisicao_url, true)
//Processamento para método POST
if (requisicoes[atual]["method"] == "POST") {
xmlhttp.setRequestHeader(
"Content-type",
"application/x-www-form-urlencoded; charset=UTF-8")
xmlhttp.setRequestHeader('Content-length', requisicoes[atual]["valor"].length)
}
//Função executada na mudança de estado da requisição
xmlhttp.onreadystatechange = function () {
//Verificamos se o "readyState" é "4" (requisição finalizada)
if (xmlhttp.readyState == 4) {
//Verificamo o "status"
if (xmlhttp.status == 200) {
//Se o status for 200, tudo OK !
OnEnd(xmlhttp.responseText) //Sucesso !
} else {
//Se não for 200, problemas !
OnEnd(null) //Erro !
}
}
}
//Função executada quando ocorrerem erros
try {
//Nem sempre o "onerror" é suportado, por isso o try..catch
xmlhttp.onerror = function () {
OnEnd(null) //Erro !
}
} catch (erro) {
//Vamos ter que "sobreviver" sem o onerror
}
//Parâmetro do método "send"
var requisicao_sendvalue = null
//Só é necessário se o método for POST
if (requisicoes[atual]["method"] == "POST") {
requisicao_sendvalue = requisicoes[atual]["valor"]
}
//Enviamos a requisição
xmlhttp.send(requisicao_sendvalue)
//Retorna true
return true
}
//Retorna nossa classe
return this
} ()
pagina.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Exemplo com AjaxClass</title>
<meta name="author" content="Jonathan Coutinho Luz de Queiroz" />
<script type="text/javascript" src="AjaxClass.js"></script>
<script type="text/javascript">
onload = function () {
//Verificamos o suporte a AJAX
if (AjaxClass) {
//Valores que passaremos (modifique-os e veja o resultado da requisição)
var valores = new AjaxClass.RequestValue()
valores.setValue("Valor1", 50)
valores.setValue("Outro_valor", "Olá !")
valores.setValue("Pergunta", "Tudo bem com você ?")
//Adiciona a requisição
AjaxClass.add(
"GET", /*Método (recomendo que altere
para testar, o resultado será diferente)*/
"arquivo.php", //Url
valores, //Valores passados por GET
function (r) {
var txtResultadoRequisicao = document.createElement("textarea")
txtResultadoRequisicao.value = r
txtResultadoRequisicao.style.width = "100%"
txtResultadoRequisicao.style.height = "200px"
document.body.appendChild(txtResultadoRequisicao)
}, //Função executada quando houver sucesso
function () {
alert("Ocorreu um erro ao processar a requisição")
} //Função executada quando ocorrerem erros
)
} else {
alert("Desculpe, seu navegador não possui suporte a AJAX")
}
}
</script>
</head>
<body>
<h1>Exemplo de código utilizando AjaxClass</h1>
Autor da classe: Jonathan Coutinho Luz de Queiroz
</body>
</html>
arquivo.asp
Se você está visualizando esse texto, parabéns !
O arquivo foi carregado corretamente por AJAX.
<%
'Esse código ASP foi criado para servir de exemplo para o AjaxClass
'Basicamente, esse script lista os valores vindos pelos métodos GET e POST
'Autor: Jonathan Coutinho Luz de Queiroz
'Contato: jonathan.jclq@gmail.com
'Função para listar valores de uma coleção
function Listar(a)
for each i in a
Response.Write(" " & i & " = """ & a(i) & """" & vbcrlf)
next
end function
'Charset
Response.CharSet="UTF-8"
'Listamos os valores vindos por GET
Response.Write("Valores vindos por GET:" & vbcrlf)
Listar(Request.QueryString)
'Listamos os valores vindos por POST
Response.Write("Valores vindos por POST:" & vbcrlf)
Listar(Request.Form)
%>
arquivo.php
Se você está visualizando esse texto, parabéns !
O arquivo foi carregado corretamente por AJAX.
<?php
/*
Esse código PHP 5 foi criado para servir de exemplo para o AjaxClass
Basicamente, esse script lista os valores vindos pelos métodos GET e POST
Autor: Jonathan Coutinho Luz de Queiroz
Contato: jonathan.jclq@gmail.com
*/
//Função para listar valores
function Listar($a){
foreach($a as $nome => $valor){
echo ' ' . $nome . " = \"" . $valor . "\"\n";
}
}
//Lista os valores passados por GET
echo "Valores vindos por GET:\n";
Listar($_GET);
//Lista os valores passados por POST
echo "Valores vindos por POST:\n";
Listar($_POST);
?>
Testem e postem o que acham, o que poderia ser melhorado, etc.
Pergunta
Jonathan Queiroz
Para facilitar a utilização de AJAX em alguns sites que estava desenvolvendo resolvi criar uma classe. Conforme pedido de membro, postarei essa classe aqui.
Embora o código da classe seja auto-explicativo, postarei uma breve explicação:
Para os exemplos de utilização criei quatro arquivos (dos quais somente três são necessários)- AjaxClass.js (código responsável pela nossa classe);
- pagina.html (página que utiliza a classe);
- arquivo.asp (script simples em ASP que mostra os valores passados por GET/POST)
- arquivo.php (script simples em PHP 5 que mostra os valores passados por GET/POST)
Obs.:- Lembrem-se de salvar os arquivos arquivo.asp e arquivo.php em UTF-8 (na dúvida, abra o bloco de notas, vá em Salvar como, coloque a codificação como UTF-8 e clique em Salvar). Isso deve ser utilizado para qualquer arquivo que venha a ser requisitado por AJAX. Isso pode ser feito nas opções de seu editor.
- Criei os arquivos em PHP e ASP apenas para facilitar o entendimento de quem ler (se fizesse em apenas uma linguagem, quem não tivesse experiência nela teria mais dificuldade em entender o código). No arquivo de utilização (pagina.html), o arquivo arquivo.php é requisitado, mas isso pode ser alterado facilmente (basta trocar o ".php" para ".asp" na linha 20). Também é possível alterar o método de POST para GET (o que também irá modificar o resultado da requisição), basta trocar o POST para GET na linha 19.
AjaxClass.js/******** Classe AJAX ******** Autor: Jonathan Coutinho Luz de Queiroz E-mail: jonathan.jclq@gmail.com */ AjaxClass = function () { /*Criar requisição AJAX*/ this.CreateXMLHttpRequest = function () { try { // Firefox, Opera 8.0+, Safari, IE7+, ... return new XMLHttpRequest(); } catch (e) { // Internet Explorer 6+ try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { //Internet Explorer 5.5+ try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { //Não conseguiu criar o objeto return null; } } } return xmlHttp } //Objeto XMLHTTP var xmlhttp = this.CreateXMLHttpRequest() //Verificamos se a requisição foi instancia com sucesso if (!xmlhttp) { /*Não conseguimos instanciar o XMLHTTP. Nesse caso, o objeto AJAX será "null"*/ return null } //Requisições var atual var requisicoes = [] var processando if (!atual) { atual = 0 } //Valores para requisição this.RequestValue = function () { //Variáveis var itens = [] //adicionar/Modificar this.setValue = function (nome, valor) { try { valor = valor.toString() } catch (e) { valor = "" } itens[nome] = valor } //Remover this.remove = function (nome) { itens[nome] = null } //Obter valor this.getValue = function (nome) { return itens[nome] } //Obter string this.getString = function () { //Retorno dessa função var retorno = "" //Codificação (tratamento de string) var encode = function (v) { return v .toString() .replace(/&/g, "%26") .replace(/ /g, "%20") } //Percorre nossos objetos e gera o retorno for (var i in itens) { if (itens[i] != null) { if (retorno != "") { retorno += "&" } retorno += encode(i) + "=" + encode(itens[i]) } } //Retornamos o valor return retorno } } //Adicionar requisição requisição this.add = function (metodo, url, valores, funcao_sucesso, funcao_erro) { //Adiciona os valores no array var i = requisicoes.length requisicoes[i] = [] //Método da requisição requisicoes[i]["method"] = metodo.toUpperCase() //Url da requisição requisicoes[i]["url"] = url //Valores da requisição if (valores == null) { //Se era nulo, transformamos numa string vazia valores = "" } else if (valores.constructor == this.RequestValue) { /*Se o valor é da classe "RequestValue", obtemos transformamos numa string que será o novo valor*/ valores = valores.getString() } requisicoes[i]["valor"] = valores //Funções (sucesso/erro) requisicoes[i]["funcao"] = funcao_sucesso requisicoes[i]["funcao_erro"] = funcao_erro //Processa as requisições (não necessariamente essa) Processa() } //Processa var Processa = function () { //Verifica se já está processando if (processando) { //Se já estamos processando, sai return } //Verifica se ainda há requisições if (!requisicoes[atual]) { //Se não há requisição, vamos sair return } //Indica que está processando processando = true //Função executada ao terminar a requisição var OnEnd = function (retorno) { //Executa as funções de erro/sucesso if (retorno == null) { //Verificamos se a função de erro é realmente uma função if (typeof (requisicoes[atual]["funcao_erro"]) == "function") { //Se sim, a chamamos passando "null" como parâmetro requisicoes[atual]["funcao_erro"](null); } else if (requisicoes[atual]["funcao_erro"] == true) { /*Se o valor de "funcao_erro" for null, devemos chamar a mesma função de sucesso com parâmetro "null"*/ requisicoes[atual]["funcao"](null); } } else { /*Se tivermos uma função de sucesso a executamos passando o valor de retorno como parâmetro*/ if (typeof (requisicoes[atual]["funcao"]) == "function") { requisicoes[atual]["funcao"](retorno) } } //Indica que não estamos mais processando processando = false //Processamos a próxima requisição atual++ Processa() } //Processamento para método GET var requisicao_url = requisicoes[atual]["url"] if ( requisicoes[atual]["method"] == "GET" && requisicoes[atual]["valor"] ) { requisicao_url += "?" + requisicoes[atual]["valor"] } //Criamos a requisição xmlhttp.open(requisicoes[atual]["method"], requisicao_url, true) //Processamento para método POST if (requisicoes[atual]["method"] == "POST") { xmlhttp.setRequestHeader( "Content-type", "application/x-www-form-urlencoded; charset=UTF-8") xmlhttp.setRequestHeader('Content-length', requisicoes[atual]["valor"].length) } //Função executada na mudança de estado da requisição xmlhttp.onreadystatechange = function () { //Verificamos se o "readyState" é "4" (requisição finalizada) if (xmlhttp.readyState == 4) { //Verificamo o "status" if (xmlhttp.status == 200) { //Se o status for 200, tudo OK ! OnEnd(xmlhttp.responseText) //Sucesso ! } else { //Se não for 200, problemas ! OnEnd(null) //Erro ! } } } //Função executada quando ocorrerem erros try { //Nem sempre o "onerror" é suportado, por isso o try..catch xmlhttp.onerror = function () { OnEnd(null) //Erro ! } } catch (erro) { //Vamos ter que "sobreviver" sem o onerror } //Parâmetro do método "send" var requisicao_sendvalue = null //Só é necessário se o método for POST if (requisicoes[atual]["method"] == "POST") { requisicao_sendvalue = requisicoes[atual]["valor"] } //Enviamos a requisição xmlhttp.send(requisicao_sendvalue) //Retorna true return true } //Retorna nossa classe return this } ()pagina.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Exemplo com AjaxClass</title> <meta name="author" content="Jonathan Coutinho Luz de Queiroz" /> <script type="text/javascript" src="AjaxClass.js"></script> <script type="text/javascript"> onload = function () { //Verificamos o suporte a AJAX if (AjaxClass) { //Valores que passaremos (modifique-os e veja o resultado da requisição) var valores = new AjaxClass.RequestValue() valores.setValue("Valor1", 50) valores.setValue("Outro_valor", "Olá !") valores.setValue("Pergunta", "Tudo bem com você ?") //Adiciona a requisição AjaxClass.add( "GET", /*Método (recomendo que altere para testar, o resultado será diferente)*/ "arquivo.php", //Url valores, //Valores passados por GET function (r) { var txtResultadoRequisicao = document.createElement("textarea") txtResultadoRequisicao.value = r txtResultadoRequisicao.style.width = "100%" txtResultadoRequisicao.style.height = "200px" document.body.appendChild(txtResultadoRequisicao) }, //Função executada quando houver sucesso function () { alert("Ocorreu um erro ao processar a requisição") } //Função executada quando ocorrerem erros ) } else { alert("Desculpe, seu navegador não possui suporte a AJAX") } } </script> </head> <body> <h1>Exemplo de código utilizando AjaxClass</h1> Autor da classe: Jonathan Coutinho Luz de Queiroz </body> </html>arquivo.aspSe você está visualizando esse texto, parabéns ! O arquivo foi carregado corretamente por AJAX. <% 'Esse código ASP foi criado para servir de exemplo para o AjaxClass 'Basicamente, esse script lista os valores vindos pelos métodos GET e POST 'Autor: Jonathan Coutinho Luz de Queiroz 'Contato: jonathan.jclq@gmail.com 'Função para listar valores de uma coleção function Listar(a) for each i in a Response.Write(" " & i & " = """ & a(i) & """" & vbcrlf) next end function 'Charset Response.CharSet="UTF-8" 'Listamos os valores vindos por GET Response.Write("Valores vindos por GET:" & vbcrlf) Listar(Request.QueryString) 'Listamos os valores vindos por POST Response.Write("Valores vindos por POST:" & vbcrlf) Listar(Request.Form) %>arquivo.phpSe você está visualizando esse texto, parabéns ! O arquivo foi carregado corretamente por AJAX. <?php /* Esse código PHP 5 foi criado para servir de exemplo para o AjaxClass Basicamente, esse script lista os valores vindos pelos métodos GET e POST Autor: Jonathan Coutinho Luz de Queiroz Contato: jonathan.jclq@gmail.com */ //Função para listar valores function Listar($a){ foreach($a as $nome => $valor){ echo ' ' . $nome . " = \"" . $valor . "\"\n"; } } //Lista os valores passados por GET echo "Valores vindos por GET:\n"; Listar($_GET); //Lista os valores passados por POST echo "Valores vindos por POST:\n"; Listar($_POST); ?>Testem e postem o que acham, o que poderia ser melhorado, etc.
Scripts relacionados
- Interface Ajax
- Autor: Kakarotto
- Descrição: Código pronto para executar ajax.
- Ajax.Class
- Autor: Kakarotto
- Descrição: Outra classe simples para manipulação de ajax.
Anexos- Megaupload
- AjaxClass_example.rar - Exemplo de utilização + arquivo da classe
- AjaxClass.js.rar - Arquivo da classe (.js) - Não inclui exemplo de implementação
Anexos no fórum:AjaxClass_example.rar
AjaxClass.js.rar
Link para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.