var isIE = /*@cc_on!@*/false; //vendo se é o IE
/* TESTAR VÁRIOS ERROS HTTP
por pra funcionar styles no IE e flash */
function ajaxGo(param){
/**
* ajaxGo - envia uma solicitação ajax simples ou submete um formulário via ajax
* sintaxe: ajaxGo({ url | form [, elem_return] [, timeout] [, loading] [, callback] [, unescape] [, hide_err]})
* Versão: 1.0 - 28/12/2007
* Autores: Micox - www.elmicox.com - elmicox.blogspot.com
* Klawdyo - José Cláudio
* Licença: Creative Commons - http://creativecommons.org/licenses/by/2.5/br/
* Some Rights Reserved - http://creativecommons.org/licenses/by/2.5/
*
ajaxGo(
{
form: 'id_do_form' OU referencia_html_do_form, // url a ser submetida (string ou HTMLobject)
url: 'arquivo.php', // url a ser submetida. Colocando o form, a url não é obrigatória
//opcionais:
timeout: XX, // tempo máximo em segundos para pegar a página
loading: 'Loading', // html a ser exibido enquanto carrega caso queira
elem_return: 'id_do_elemento' OU referencia_html_de_elemento, // o elemento que receberá o retorno ajax caso queira
callback: function(data){blablalb}, // função que será executada ao final com os dados retornados
unescape: true OU false, // para desencodar caso o script serverside tenha encodado (boolean)
hide_err: true OU false // para não exibir os erros caso queira. Padrão=false (boolean)
}
)
Exemplos que apenas enviam a solicitação mas não trabalham nada com o resultado:
ajaxGo({ form:'meu_form' });
ajaxGo({ url:'arquivo.php' });
ajaxGo({ form:document.getElementById('meu_form') });
ajaxGo({ url:'arquivo.php' , form:this.parentNode.form });
ajaxGo({ url:'arquivo.php' , timeout: 10, loading:'Carregando' });
ajaxGo({ form:this.form , timeout: 10, loading:'Carregando' , unescape:true });
Exemplos que fazem algo com o resultado:
ajaxGo({ form:'meu_form' , elem_return: 'meu_div' });
ajaxGo({ url:'arquivo.php', elem_return: this.nextSibling() });
ajaxGo({ form:this.parentNode , callback: funcao_x }); // funcao_x = function(data){ alert(data);}
ajaxGo({ url:'arquivo.php' , callback: function(data){ if(data=='ok'){alert('sucesso')} } , loading:'Carregando' });
ajaxGo({ url:'arquivo.php' , timeout: 10, callback: function(data){ document.getElementById('meu_div').innerHTML=data } });
Teste: http://www.elmicox.com/wp-content/uploads/2008/03/ajaxvai2.htm
Forum: http://forum.ievolutionweb.com/index.php?showtopic=18264&st=60
**/
/******** declaracao de variaveis ********/
var url, the_form, callback, timeout, html_loading='', elem_return, unescape_, hide_err, acento_, base64_, elem_loading ; //vars que receberão os parametros da funcao
var concat, url_orig, msg, timeload, timeout, ajax; //outras variáveis
var method='GET', query='', loadpos=0, timecounter=0, self=this; //variáveis inicializadas
var loads = [':::','|::',':|:','::|']; //animacao do loading
/******** pegando os parametros obrigatorios ********/
if(!param.url && !param.form){//pelo menos 1 dos 2 argumentos deve ser obrigatório
alert('Programador, reveja sua chamada ao ajaxGo.\r\nVocê deve informar pelo menos a "url" ou o "form".');
return false;
}
if(param.url){ url = param.url; }
if(param.form){
if(param.form.constructor==String){ //id do form passada
the_form = document.getElementById(param.form);
}else if(typeof(param.form.nodeType)!='undefined'){ //form passado como referencia ao objeto html
the_form = param.form;
}
if(the_form && the_form.nodeName.toLowerCase()=='form'){//se o elemento existe e é realmente um form
if(!url) { url = the_form.action; }
if(the_form.method) { method = the_form.method.toUpperCase();}
}else{ //form não existe
alert('Programador, reveja sua chamada ao ajaxGo.\r\nO form "' + url_ou_form + '" informado, nao existe');
return false;
}
}
//pegando os parametros opcionais.
if(param.acento){acento_=param.acento; }
if(param.base64){base64_=param.base64; }
if(param.callback){ callback = param.callback; }
if(param.timeout){ timeout = param.timeout; }
if(param.loading){ html_loading = param.loading; }
if(param.unescape){ unescape_ = param.unescape;}
if(param.hide_err){ hide_err = param.hide_err;}
if(param.elem_return){
if(param.elem_return.constructor==String){
elem_return = document.getElementById(param.elem_return);
}else if(typeof(param.elem_return.nodeType)!='undefined'){ //elemento passado como referencia ao objeto html
elem_return = param.elem_return;
}
if(!elem_return){
alert('Programador, reveja sua chamada ao ajaxGo.\r\nO elem_return "' + arguments[1] + ' ( '+param.elem_loading+' ) ' + '" informado, nao existe');
return false;
}
}
if(param.elem_loading) {
if(param.elem_loading.constructor==String){
elem_loading = document.getElementById(param.elem_loading);
}else if(typeof(param.elem_loading.nodeType)!='undefined'){ //elemento passado como referencia ao objeto html
elem_loading = param.elem_loading;
}
if(!elem_loading){
alert('Programador, reveja sua chamada ao ajaxGo.\r\nO elem_loading "' + arguments[1] + ' ( '+param.elem_loading+' ) ' +'" informado, nao existe');
if(elem_return) elem_loading=elem_return
}
} else{
if(elem_return) elem_loading=elem_return
}
if (param.debug) alert(elem_return.id+' - '+elem_loading.id)
/******** começando o ajax ********/
ajax = getAjax(); //capturando um NOVO objeto xmlHttpRequest
if(ajax){
if(the_form){
if (acento_) {
//codifica o acento
query = encodeURI((decodeURI(getFieldsForm(the_form, ""))).Acento("c"));
} else if (base64_) {
// codigica base64
query = getFieldsForm(the_form, "base64")
} else {
query = getFieldsForm(the_form, "")
}
}
//montando a URL
url_orig = url;
concat = (url.indexOf('?')>=0) ? "&" : '?';
//antiga antiCacheRand. Para o problema de cache com ajax do IE
if(isIE){
dt = new Date();
url += concat + encodeURI(dt.getTime());
concat = '&';
delete dt;
}
ajax.onreadystatechange = ajaxOnReady;
try{
if(method=='GET'){
query = query.substr(0,2030); //IE limits http://classicasp.aspfaq.com/forms/what-is-the-limit-on-querystring/get/url-parameters.html
ajax.open(method, url + concat + query ,true)
ajax.setRequestHeader("Content-Type", "text/html; charset=utf-8");
ajax.setRequestHeader("Content-length", query.length);
query='';
}else{ //POST
ajax.open(method, url ,true);
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajax.setRequestHeader("Content-length", query.length);
}
ajax.setRequestHeader('X-Requested-With', 'ajax'); //dizendo ao servidor que foi pedido via ajax. Recupera-se com $_SERVER['X-Requested-With'] (no php)
ajax.setRequestHeader("Cache-Control", "no-cache");
ajax.setRequestHeader("Pragma", "no-cache");
ajax.send(query);
}catch(e){
var e_men = "Programador, verifique se a url "+ url +" é válida e está em seu domínio."
if(isIE) { e_men = e.description + "\r\n\r\n" + e_men }
else{ e_men = e + "\n\n" + e_men }
alert(e_men)
return;
}
//função periódica que verifica o timeout e gera animação
timeload = setInterval(periodic,250);
return true;
}else{
return false;
}
/******** funções extra que serão chamadas ****************/
function ajaxOnReady(){ //executada a cada alteração no status http
if(timeout && timecounter/4 > timeout){ //estourou o timeout. O abort() foi feito na funcao periodic()
clearInterval(timeload); //fim do contador
msg = "Falha no carregamento. Tempo limite excedido: " + timeout + ' segs.';
if(!hide_err){ put(msg); }
window.status = '';
if(callback){ callback(msg); } //chamando a função de callback
ajax = null; delete ajax; delete self;
return false;
}
/* o readystate=2 status!=200 mata o ajax, mas alguns navegadores ainda chamam o onready sem ter ajax */
if(!ajax) { return }
if(ajax.readyState==4){ //carregamento (ou não carregamento) completo
clearInterval(timeload); //fim do contador
if(ajax.status == 200){ //com sucesso
var texto=ajax.responseText;
if(texto.indexOf(" ")<0) texto=texto.replace(/\+/g, " ");
if(unescape_==true){ //se tiver usado o urlencode no php ou asp
texto=unescape(texto);
}
put(texto);
getScripts(texto);
if(isIE){ getStyles(texto) }
window.status = '';
if(callback){ callback(texto); } //chamando a função de callback
}else{ //com erro
msg = "Falha no carregamento. " + httpStatus(ajax.status);
if(!hide_err){
if(html_loading){
put(msg);
}else{
window.status = msg;
}
}
if(callback){ callback(msg); } //chamando a função de callback
}
ajax = null; delete ajax; delete timeload;
delete self; return;
}else if(ajax.readyState==2 && typeof(ajax.status)!='unknown'){ //não tava pegando o erro 404 no readystate==4
if(ajax.status != 200){
clearInterval(timeload); //fim do contador
msg = "Falha no carregamento. " + httpStatus(ajax.status);
if(!hide_err){
if(html_loading){
put(msg);
}else{
window.status = msg;
}
}
if(callback){ callback(msg); } //chamando a função de callback
ajax = null; delete ajax; delete timeload;
delete self; return;
}else{
window.status = '';
}
}else{//para mudar o status de cada carregando
window.status = '';
}
}
function loadsAnim(){ //faz a animaçãozinha no array loads
if(html_loading.indexOf('loads.length - 1){ loadpos = 0; }
return loads[loadpos++] + ' ';
}else{ return '';}
}
function put(valor){ //coloca o valor no elemento de retorno, se houver este
if(elem_return){
if(elem_return.nodeName.toLowerCase()=="input"){
valor = escape(valor).replace(/\%0D\%0A/g, ""); //sumindo com o enter
elem_return.value = unescape(valor);
}else if(elem_return.nodeName.toLowerCase()=="select"){
//if no have options, put in option and strip other tags
if(valor.indexOf('' }
if(isIE){
select_innerHTML(elem_return, valor.replace(/ /g,' '));
}else{
select_innerHTML(elem_return, valor)
}
}else if(elem_return.nodeName){
elem_return.innerHTML = valor;
}
}
}
function periodic(){ //função executada periodicmente pra fazer animação e testar timeout
//mensagem indicando o carregamento
if(html_loading && elem_loading){
elem_loading.innerHTML = html_loading + loadsAnim()
}else if (html_loading){
put(html_loading + loadsAnim() )
}else if (elem_loading){
elem_loading.innerHTML = 'Carregando ' + loadsAnim();
}else{
window.status = 'Carregando ' + url_orig + loadsAnim();
}
//fazendo o contador
timecounter++; //contador que incrementa-se a cada 1/4 de segundo
if(timecounter/4 > timeout){ //estourou o timeout
clearInterval(timeload); //fim do contador
ajax.abort(); //também dispara a ajaxOnReady (no opera não dispara o ajaxonready())
if(ajax){ ajaxOnReady() } //se o ajaxOnReady não foi chamado no abort() acima, eu chamo na mão
}
}
function getAjax(){ //instancia um novo xmlhttprequest
//baseado na getXMLHttpObj que possui muitas cópias na net e eu nao sei quem é o autor original
if(typeof(XMLHttpRequest)!='undefined'){return new XMLHttpRequest();}
var axO=['Microsoft.XMLHTTP', 'Msxml2.XMLHTTP','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];
for(var i=0;i" }
//innerHTML = innerHTML.toLowerCase().replace(/