Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola gente. Bem estou utilizando as funções no meu site
AJAX para páginas do MICOX: http://forum.imasters.com.br/index.php?showtopic=172859
AJAX para formulários do PITA: http://forum.imasters.com.br/index.php?showtopic=174729
É que meu site está funcionando da seguinte maneira. Quando eu clico em alguma notícia, eu atulizo o conteído da DIV utilizando a função do MICOX fazendo com que na DIV abra outra pagina onde aparece toda a notícias e os comentários.
Em baixo dos comentários estou utilizando a função do PITA, para atulizar a div onde aparece os comentários.
As funções funcionam mas se eu clicar em enviar na função do PITA, uma vez. Ele envia. Mas se após eu tentar submeter outra vez o formulário ela já não funciona.
Fica carregando eternamente.
meu fonte ajax.js
var ifila = 0var fila = new Array();//fila[X][0] - Div onde sera carregada a pagina//fila[X][1] - Pagina que sera chamada//fila[X][2] - Metodo de envio//fila[X][3] - Campos do form concatenados no padrao para serem enviados. Null caso seja um link//INICIALIZA O OBJETO QUE IRA FAZER AS SOLICITACOEStry{ xmlhttp = new XMLHttpRequest();// Mozilla, Safari, Firefox, etc... try { if (xmlhttp.overrideMimeType) { //Se possível, ignora cabecalho usado pelo servidor e forca o padrao "text/xml". Alguns navegadores exigem esse padrao e pode dar erro se o servidor nao utilizar ele xmlhttp.overrideMimeType('text/xml'); } } catch (e1) { }}catch(e2){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");// Internet Explorer }catch(e3){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");// Internet Explorer }catch(e4){ //tratamento para alguma outra forma de implementar XMLHTTP xmlhttp = false; } }}if (!xmlhttp){ //Nao conseguiu instanciar o objeto xmlhttp para fazer as solicitacoes alert("AJAX error. Your browser must support XMLHttpRequest object or enable use of scripting.");}//GUARDA NA FILA O ID DO OBJETO E O FORM QUE SERAO CARREGADOS PELO LINK CLICADOfunction ajaxForm(id_target,id_form){ //Pega a pagina que sera chamada pelo form var url = document.getElementById(id_form).action; //Busca metodo de envio definido no form var metodoEnvio = document.getElementById(id_form).method.toUpperCase(); //Busca os elementos do form que serao enviados para a pagina solicitada var elementos_form = BuscaElementosForm(id_form); //Exibe mensagem de que esta carregando a pagina no objeto de ID informado ajaxMensagemCarregando(id_target); //Adiciona a solicitacao na fila fila[fila.length]=[id_target,url,metodoEnvio,elementos_form]; //Se nao tem conexoes na fila, inicia a execucao if(fila.length==1){ ajaxRun(); } return;}function ajaxMensagemCarregando(id){ document.getElementById(id).innerHTML = "<br /><br /><br />Carregando...<br /><img src='im/load.gif'>";}function BuscaElementosForm(idForm) { var elementosFormulario = document.getElementById(idForm).elements; var qtdElementos = elementosFormulario.length; var queryString = ""; var elemento; //Cria uma funcao interna para concatenar os elementos do form this.ConcatenaElemento = function(nome,valor) { if (queryString.length>0) { queryString += "&"; } queryString += encodeURIComponent(nome) + "=" + encodeURIComponent(valor); }; //Loop para percorrer todos os elementos for (var i=0; i<qtdElementos; i++) { //Pega o elemento elemento = elementosFormulario[i]; if (!elemento.disabled) { //Trabalha com o elemento caso ele nao esteja desabilitado switch(elemento.type) { //Realiza a acao dependendo do tipo de elemento case 'text': case 'password': case 'hidden': case 'textarea': this.ConcatenaElemento(elemento.name,elemento.value); break; case 'select-one': if (elemento.selectedIndex>=0) { this.ConcatenaElemento(elemento.name,elemento.options[elemento.selectedIndex].value); } break; case 'select-multiple': for (var j=0; j<elemento.options.length; j++) { if (elemento.options[j].selected) { this.ConcatenaElemento(elemento.name,elemento.options[j].value); } } break; case 'checkbox': case 'radio': if (elemento.checked) { this.ConcatenaElemento(elemento.name,elemento.value); } break; } } } return queryString;}//EXECUTA A PROXIMA SOLICITACAO DA FILAfunction ajaxRun(){ var url = fila[ifila][1]; //Define o metodo de envio (GET ou POST) var metodoEnvio; if (fila[ifila][3]==null){ //Se for Link, utiliza GET metodoEnvio = "GET"; }else{ //Se for Form, define o metodo de envio e prepara a url metodoEnvio = fila[ifila][2]; if (metodoEnvio=="" || metodoEnvio==null){ //Se nao tiver definido nada, usa POST metodoEnvio = "POST"; } if (metodoEnvio=="GET"){ //Metodo GET passa as informacoes na linha da url url = url + "?" + fila[ifila][3]; } } //Abre a conexao xmlhttp.open(metodoEnvio,url,true); //Seta as funcoes que irao tratar a mudanca de estado do objeto XMLHTTP xmlhttp.onreadystatechange=ajaxXMLHTTP_StateChange; //Executa a solicitacao if (metodoEnvio=="POST"){ //Metodo POST precisa definir este RequestHeader xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); //Metodo POST passa as variaveis pelo metodo Send xmlhttp.send(fila[ifila][3]); }else{ xmlhttp.send(null); } return;}//FUNCAO EXECUTADA QUANDO ALTERAR O STATUS DA SOLICITACAO (readyState)function ajaxXMLHTTP_StateChange() { //0-Nao inicializado, 1-Carregando, 2-Carregado, 3-Interativo, 4-Completo if (xmlhttp.readyState==1){ ajaxXMLHTTP_StateChange_Carregando(fila[ifila][0]);//Quando iniciar a solicitacao }else{ if (xmlhttp.readyState==4){ ajaxXMLHTTP_StateChange_Completo(xmlhttp, fila[ifila][0]);//Quando estiver completa a solicitacao } }}//FUNCAO EXECUTADA QUANDO INICIAR A SOLICITACAO (readyState=1)function ajaxXMLHTTP_StateChange_Carregando(id){ //Exibe mensagem de que está carregando a página no objeto de ID que solicitacao esta sendo feita ajaxMensagemCarregando(id); return;}//FUNCAO EXECUTADA QUANDO A SOLICITACAO ESTIVER COMPLETA (readyState=4)function ajaxXMLHTTP_StateChange_Completo(xmlhttp, id){ var retorno; //Verifica o status da pagina de retorno if (xmlhttp.status == 200 || xmlhttp.status==0) { //Caso o status seja 200(Sucesso) ou nao utilize servidor(chamada local [C:\...]), trata o valor retornado retorno=unescape(xmlhttp.responseText.replace(/\+/g," ")); }else{ //Caso o status ainda nao foi tratado, chama a funcao de tratamento de pagina de erro retorno=ajaxPaginaErro(xmlhttp); } //Exibe o valor retornado no objeto de ID informado document.getElementById(id).innerHTML=retorno; // executa scripts ExtraiScript(retorno); //passa para a proxima posicao da fila ifila++; if(ifila<fila.length){ //Caso tenha mais solicitacoes na fila, executa a proxima setTimeout("ajaxRun()",20); }else{ //Caso nao tenha mais solicitacoes na fila, reinicia a fila fila = null; fila = new Array(); ifila = 0; } return;}//FUNCAO PARA RETORNAR A MENSAGEM DE ERRO QUANDO O SERVIDOR RETORNAR UMA PAGINA DE ERROfunction ajaxPaginaErro(xmlhttp){ var retorno; switch (xmlhttp.status) { case 404: return "Página não encontrada!!!"; break; case 500: return "Erro interno do servidor!!!"; break; default: return "Erro desconhecido!!!<br>" + xmlhttp.status + " - " + xmlhttp.statusText.replace(/\+/g," "); }}function ajaxGet(url,elemento_retorno,exibe_carregando,mm){/******* ajaxGet - Coloca o retorno de uma url em um elemento qualquer* Use a vontade mas coloque meu nome nos créditos. Dúvidas, me mande um email.* Versão: 1.1 - 10/04/2006* Autor: Micox - micoxjcg@yahoo.com.br* Parametros:* url: string; elemento_retorno: object||string; exibe_carregando:boolean* - Se elemento_retorno for um elemento html (inclusive inputs e selects),* exibe o retorno no innerHTML / value / options do elemento* - Se elemento_retorno for o nome de uma variavel* (o nome da variável deve ser declarado por string, pois será feito um eval)* a função irá atribuir o retorno à variável ao receber a url.*******/ var ajax1 = pegaAjax(); if(ajax1){ url = antiCacheRand(url) ajax1.onreadystatechange = ajaxOnReady ajax1.open("GET", url ,true); ajax1.setRequestHeader("Cache-Control", "no-cache"); ajax1.setRequestHeader("Pragma", "no-cache"); if(exibe_carregando){ put("<br /><br /><br />Carregando...<br /><img src='im/load.gif'>"); } ajax1.send(null) return true; }else{ return false; } function ajaxOnReady(){ if (ajax1.readyState==4){ if(ajax1.status == 200){ var texto=ajax1.responseText; if(texto.indexOf(" ")<0) texto=texto.replace(/\+/g," "); //texto=unescape(texto); //descomente esta linha se tiver usado o urlencode no php ou asp put(texto); }else{ if(exibe_carregando){put("Falha no carregamento. " + httpStatus(ajax1.status));} } ajax1 = null }else if(exibe_carregando){//para mudar o status de cada carregando put("<br /><br /><br />Carregando...<br /><img src='im/load.gif'>"); } } function put(valor){ //coloca o valor na variavel/elemento de retorno if((typeof(elemento_retorno)).toLowerCase()=="string"){ //se for o nome da string if(valor!="Falha no carregamento"){ eval(elemento_retorno + '= unescape("' + escape(valor) + '")') } }else if(elemento_retorno.tagName.toLowerCase()=="input"){ valor = escape(valor).replace(/\%0D\%0A/g,"") elemento_retorno.value = unescape(valor); }else if(elemento_retorno.tagName.toLowerCase()=="select"){ select_innerHTML(elemento_retorno,valor) }else if(elemento_retorno.tagName){ elemento_retorno.innerHTML = valor; //alert(elemento_retorno.innerHTML) } } function pegaAjax(){ //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<axO.length;i++){ try{ return new ActiveXObject(axO[i]);}catch(e){} } return null; } function httpStatus(stat){ //retorna o texto do erro http switch(stat){ case 400: return "400: Solicitação incompreensível"; break; case 403: case 404: return "404: Não foi encontrada a URL solicitada"; break; case 405: return "405: O servidor não suporta o método solicitado"; break; case 500: return "500: Erro desconhecido de natureza do servidor"; break; case 503: return "503: Capacidade máxima do servidor alcançada"; break; default: return "Erro " + stat + ". Mais informações em [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html";](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) break; } } function antiCacheRand(aurl){ var dt = new Date(); if(aurl.indexOf("?")>=0){// já tem parametros return aurl + "&" + encodeURI(Math.random() + "_" + dt.getTime()); }else{ return aurl + "?" + encodeURI(Math.random() + "_" + dt.getTime());} }}function select_innerHTML(objeto,innerHTML){/******* select_innerHTML - altera o innerHTML de um select independente se é FF ou IE* Corrige o problema de não ser possível usar o innerHTML no IE corretamente* Veja o problema em: [http://support.microsoft.com/default.aspx?scid=kb;en-us;276228*](http://support.microsoft.com/default.aspx?scid=kb;en-us;276228*) Use a vontade mas coloque meu nome nos créditos. Dúvidas, me mande um email.* Versão: 1.0 - 06/04/2006* Autor: Micox - Náiron José C. Guimarães - micoxjcg@yahoo.com.br* Parametros:* objeto(tipo object): o select a ser alterado* innerHTML(tipo string): o novo valor do innerHTML*******/ objeto.innerHTML = "" var selTemp = document.createElement("micoxselect") var opt; selTemp.id="micoxselect1" document.body.appendChild(selTemp) selTemp = document.getElementById("micoxselect1") selTemp.style.display="none" if(innerHTML.toLowerCase().indexOf("<option")<0){//se não é option eu converto innerHTML = "<option>" + innerHTML + "</option>" } innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span") selTemp.innerHTML = innerHTML for(var i=0;i<selTemp.childNodes.length;i++){ if(selTemp.childNodes[i].tagName){ opt = document.createElement("OPTION") for(var j=0;j<selTemp.childNodes[i].attributes.length;j++){ opt.setAttributeNode(selTemp.childNodes[i].attributes[j].cloneNode(true)) } opt.value = selTemp.childNodes[i].getAttribute("value") opt.text = selTemp.childNodes[i].innerHTML if(document.all){ //IEca objeto.add(opt) }else{ objeto.appendChild(opt) } } } document.body.removeChild(selTemp) selTemp = null}
Chamando a função do PITA : OBS estou usando o smarty
<div id="postarcomentario2"> <div id="postarcomentario"> <div class="titulo_form_comentario">{$geral_comentario.l_deixe_comentario}</div> <div id="postarcomentariof"> <form id="formulario" name="formulario" method="POST" action="posta_comentario.php" onSubmit='return false;' ><textarea name=texto rows="10" id="texto" cols="70" class="frm" onMouseOver="this.className='frm-on';" onMouseOut="this.className='frm';" onblur="java script:envia('verifica_string.php','POST',false);"></textarea><input type="hidden" name="id_a" id="id_a" value="{$noticia.id}"> <input type="hidden" name="nome_u" id="nome_u" value="RCLumbriga"><br /> <input type="submit" name="enviar" id="enviar" value="{$geral_comentario.l_enviar}" onClick='ajaxForm("postarcomentario2","formulario"); return false' class="frm" onMouseOver="this.className='frm-on';" onMouseOut="this.className='frm';"> </form> </div> </div></div>
Chamando o AJAX.js na pagina principal
<meta http-equiv="Content-Language" content="pt-br"><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><meta http-equiv="Content-Style-Type" content="text/css"><script src="ajax.js?12" type="text/javascript" language="javascript"></script>
Carregando comentários...