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(']+>/gi, '') + '' } 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(/