Webly: Ajax - Função Rápida E Simples: Agora Com Post - Webly

Ir para

Regras para postagem

É permitido postar livremente respostas com comentários, testes e avaliações dos scripts. Postagens contendo dúvidas sobre o script, deverão ser postadas no fórum principal de javascript/ECMAScript/AJAX.

IMPORTANTE: Todos os tutoriais postados neste fórum irão automaticamente para o portal Webly. Contribua você também e faça parte da equipe de colaboradores que fazem a evolução da web. Obrigado.
  • (7 Páginas)
  • +
  • 1
  • 2
  • 3
  • Último »

Ajax - Função Rápida E Simples: Agora Com Post Informe o ID do formulário e não se preocupe Avaliar tópico: ***** 1 Votos

#1 Membro offline   Klawdyo Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 59
  • Cadastrado: 20-outubro 07
  • Localização:Assu-RN

Postou 27 dezembro 2007 - 02:03


Aí, galerinha.
Eu sei que, assim como eu, bilhões e bilhões de pessoas estão usufruindo da função que o Micox fez pra usar ajax. Realmente ela é muito simples, e serve em quase todas as ocasiões. Infelizmente não conseguíamos usá-la com o método POST, mas a alteração é muito simples e nós mesmos podemos fazê-la sem a ajuda dos nossos pais. Então, sem enrolar muito, vamos às alterações.

Primeiramente eu criei uma função auxiliar chamada camposForm(nome_form). Essa função é chamada pela minha (ou nossa) função ajaxPost, que é a irmãzinha da ajaxGet, do Micox.

camposForm() recebe o nome de um formulário qualquer da página e retorna um valor assim var1=valor1&var2=valor2. O formato precisa ser assim, pois ajaxPost vai precisar dela.

function camposForm(nomeForm)
{
/**************************************************
* Autor: José Cláudio Medeiros de Lima
* Data: 17/12/2007
* Objetivos: Pega todos os campos de um formulário, seus valores 
	  e junta tudo em um formato de querystring, 
	  por exemplo: var1=valor1var2=valor2
* Parâmetros: nomeForm - O nome do formulário qualquer.
**************************************************/
 var buff = [];
 var contador = 0; //viabiliza a contagem de laços do for,  
	  //pois sem ele dá "undefined" nos checkboxes
	  //ou radiobuttons que não estão marcados

 for (i=0;i<nomeForm.length;i++) 
 {
  campo = nomeForm.elements[i];

  if(campo.type=="checkbox" || campo.type=="radio")
  {
   if(campo.checked)
   {
	buff[contador] = campo.name + "=" + campo.value;
	contador ++; //incrementa 1 ao contador
   }
  }
  else
  {
   buff[contador] = nomeForm.elements[i].name + "=" + nomeForm.elements[i].value;
   contador++;
  }
 }
 return buff.join("&");
}


Agora que já criamos essa função, vamos às alterações na função principal.

É bom deixar claro que a função é IDÊNTICA à original. Idêntica mesmo. Eu não retirei nada dela, nem as funções que não servem pra ela. Tá tudo lá. Eu só alterei algumas coisas pra funcionar com POST.
As alterações que fiz estão em vermelho

function ajaxPost(nome_form,elemento_retorno,exibe_carregando){
/******
* ajaxPost - Coloca o retorno de uma url em um elemento qualquer
* Use a vontade mas deixe os créditos. Dúvidas, me mande um email.
* Versão: 2.0 - 17/12/2007
* Autor: Micox - Náiron José C. Guimarães - micoxjcg@yahoo.com.br
*  Modificada por: José Cláudio Medeiros de Lima - klawdyo@gmail.com
* Parametros:
* nome_form: string; elemento_retorno: object||string; exibe_carregando:boolean
* - Informe o nome do formulário no primeiro parâmetro. A função chama a camposForm(), e pega todos os campos do formulário e os seus respectivos valores e envia tudo pelo método POST para o valor definido no "action" do formulário.
  
  Exemplo de uso:
   <form action="?teste" id="formulario" name="formulario" 
	onsubmit="ajaxPost(this,'nome_elemento_retorno',true ou false)">

* - 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){
		 var url = nome_form.action;
		 var parameters = camposForm(nome_form);
   
 
		 url = antiCacheRand(url);
		 ajax1.onreadystatechange = ajaxOnReady
		 ajax1.open("POST", url ,true);
		 ajax1.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		 ajax1.setRequestHeader("Content-Type", "text/html; charset=iso-8859-1");
		 ajax1.setRequestHeader("Cache-Control", "no-cache");
		 ajax1.setRequestHeader("Pragma", "no-cache");
		 if(exibe_carregando){ put("Carregando ...")	}
		 ajax1.send(parameters)
		 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);
				 extraiScript(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("Carregando ..." )
		 }
	 }
	 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 0: return "Erro desconhecido de javascript";
			 case 400: return "400: Solicita&ccedil;&atilde;o incompreensível"; break;
			 case 403: case 404: return "404: N&atilde;o foi encontrada a URL solicitada"; break;
			 case 405: return "405: O servidor n&atilde;o suporta o m&eacute;todo solicitado"; break;
			 case 500: return "500: Erro desconhecido de natureza do servidor"; break;
			 case 503: return "503: Capacidade m&aacute;xima do servidor alcançada"; break;
			 default: return "Erro " + stat + ". Mais informa&ccedil;&otilde;es em [url="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html";"]http://www.w3.org/Protocols/rfc2616/rfc261...c10.html";[/url] 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: [url="http://support.microsoft.com/default.aspx?...kb;en-us;276228"]http://support.microsoft.com/default.aspx?...kb;en-us;276228[/url]
* 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
}

function extraiScript(texto){
//Maravilhosa função feita pelo SkyWalker.TO do imasters/forum
//http://-- link para outro fórum não permitido --.com.br/index.php?showtopic=165277&
	 // inicializa o inicio ><
	 var ini = 0;
	 // loop enquanto achar um script
	 while (ini!=-1){
		 // procura uma tag de script
		 ini = texto.indexOf('<script', ini);
		 // se encontrar
		 if (ini >=0){
			 // define o inicio para depois do fechamento dessa tag
			 ini = texto.indexOf('>', ini) + 1;
			 // procura o final do script
			 var fim = texto.indexOf('</script>', ini);
			 // extrai apenas o script
			 codigo = texto.substring(ini,fim);
			 // executa o script
			 //eval(codigo);
			 /**********************
			 * Alterado por Micox - micoxjcg@yahoo.com.br
			 * Alterei pois com o eval não executava funções.
			 ***********************/
			 novo = document.createElement("script")
			 novo.text = codigo;
			 document.body.appendChild(novo);
		 }
	 }
}


O arquivo completo com essa função você encontra em http://www.esnips.com/web/Klawdyo


Té mais, galera e bom uso dela. Aqui não deu problema. Testado em ie6 e ff2.

Valeu

.
.
.
"Se não merece ser bem feito, não merece ser feito!!"
0

#2 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 27 dezembro 2007 - 03:21

Perfect eleven :clap:

Valeus pelo help, agora vai ter que responder dúvidas dos outros também :rindo:
hauehuae

Linkarei no blog. Parabéns cara. :joia:
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#3 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 27 dezembro 2007 - 03:41

Opa Cláudio, já que você fez a atualização do Post.
Bora finalizar logo a função completa, que tal?

1) Guentar get ou post
2) guentar nome ou referencia dos elementos (nome_form, elemento_retorno)
3) o exibe_carregando permitir html
4) uma função de callback (para ser chamada após o fim do carregamento)
5) A submissão de um form ser opcional.
6) Aplicar formatação CSS também (além do extraiScript)

Working...
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#4 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 27 dezembro 2007 - 04:54

Uma prévia ainda não testada e sem os créditos corretamente:

function ajaxVai(url_ou_form){
	//opcional: ajaxDo(url_ou_form,elemento_retorno,html_carregando,callback)
	var url,o_form,method,elemento_retorno, html_carregando,callback,parameters='';
	var loads = ['|','/','-','\\'],loadpos=0;
	
	//pegando se é url direta ou form
	if(typeof(url_ou_form)=='string'){
		if(url_ou_form.indexOf('http://')>=0){ //é url
			url = url_ou_form;
			method = 'GET';
		}else{
			o_form = document.getElementsById(url_ou_form);
			if(o_form){
				url = o_form.action;
				method = o_form.method;
			}else{ //form não existe
				alert('Reveja sua chamada ao ajaxVai. O form ' + url_ou_form + ' informado, não existe');
			}
		}
	}else if(typeof(url_ou_form.nodeType)!='undefined'){ //form passado como referencia ao objeto html
		o_form = url_ou_form;
		url = o_form.action;
	}else{
		alert('Reveja sua chamada ao ajaxVai. O primeiro parâmetro url_ou_form é obrigatório');
	}
	delete url_ou_form; //não precisamos mais dela
	
	//pegando os opcionais.
	if(arguments[1]){ //elemento_retorno ou pode ser a callback
		if(typeof(arguments[1].nodeType)!='undefined'){ //elemento_html passado como referencia ao objeto
			elemento_retorno = arguments[1];
			
		}else if(typeof(arguments[1])=='string'){ //passou só o id
			elemento_retorno = document.getElementById(arguments[1]);
			if(!elemento_retorno){
				alert('Reveja sua chamada ao ajaxVai. O elemento ' + arguments[1] + ' informado, não existe'); }
				
		}else if(typeof(arguments[1])=='function'){ //é a callback
			callback = arguments[1];
			
		}
		
		if(elemento_retorno){ //se há elemento retorno então pode haver html_carregando ou callback
			if(typeof(arguments[2])=='string'){ //html_carregando
				html_carregando = arguments[2];
			}else if(typeof(arguments[2])=='function'){ //callback
				callback = arguments[2];
			}
		}
	}

	
	
	var ajax1 = pegaAjax(); //capturando um objeto xmlHttpRequest

	if(ajax1){
	
		if(o_form){
			parameters = camposForm(nome_form);
		}
		
		url = antiCacheRand(url);
		ajax1.onreadystatechange = ajaxOnReady
		ajax1.open(method, url ,true);
		ajax1.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		ajax1.setRequestHeader("Content-Type", "text/html; charset=utf-8");
		ajax1.setRequestHeader("Cache-Control", "no-cache");
		ajax1.setRequestHeader("Pragma", "no-cache");
		if(html_carregando){ put(pegaloads() + html_carregando)	}
		ajax1.send(parameters)
		return true;
		
	}else{
		return false;
	}
	
	//funções extra
	
	function ajaxOnReady(){ //executada a cada alteração no status http
		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);
				extraiScript(texto);
				extraiStyle(texto);
				if(callback){ callback(texto); }
			}else{
				if(exibe_carregando){put("Falha no carregamento. " + httpStatus(ajax1.status));}
			}
			ajax1 = null
		}else if(html_carregando){//para mudar o status de cada carregando
			put(pegaloads() + html_carregando)
		}
	}
	function pegaloads(){
		if(loadpos>loads.length - 1){ loadpos = 0; }
		return loads[loadpos++] + ' ';
		
	}
	function put(valor){ //coloca o valor no elemento de retorno, se houver este
		if(elemento_retorno){
			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 0: return "Erro desconhecido de javascript";
			case 400: return "400: Solicita&ccedil;&atilde;o incompreensível"; break;
			case 403: case 404: return "404: N&atilde;o foi encontrada a URL solicitada"; break;
			case 405: return "405: O servidor n&atilde;o suporta o m&eacute;todo solicitado"; break;
			case 500: return "500: Erro desconhecido de natureza do servidor"; break;
			case 503: return "503: Capacidade m&aacute;xima do servidor alcançada"; break;
			default: return "Erro " + stat + ". Mais informa&ccedil;&otilde;es em 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 - corrige o bug do InnerHTML em selects no IE
* Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Versão: 2.1 - 04/09/2007
* Autor: Micox - Náiron José C. Guimarães - micoxjcg@yahoo.com.br
* @objeto(tipo HTMLobject): 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.toLowerCase().replace(/<option/g,"<span").replace(/<\/option/g,"</span")
	selTemp.innerHTML = innerHTML
	  
	
	for(var i=0;i<selTemp.childNodes.length;i++){
  var spantemp = selTemp.childNodes[i];
  
		if(spantemp.tagName){	 
			opt = document.createElement("OPTION")
	
   if(document.all){ //IE
	objeto.add(opt)
   }else{
	objeto.appendChild(opt)
   }	   
	
   //getting attributes
   for(var j=0; j<spantemp.attributes.length; j++){
	var attrName = spantemp.attributes[j].nodeName;
	var attrVal = spantemp.attributes[j].nodeValue;
	if(attrVal){
	 try{
	  opt.setAttribute(attrName,attrVal);
	  opt.setAttributeNode(spantemp.attributes[j].cloneNode(true));
	 }catch(e){}
	}
   }
   //getting styles
   if(spantemp.style){
	for(var y in spantemp.style){
	 try{opt.style[y] = spantemp.style[y];}catch(e){}
	}
   }
   //value and text
   opt.value = spantemp.getAttribute("value")
   opt.text = spantemp.innerHTML
   //IE
   opt.selected = spantemp.getAttribute('selected');
   opt.className = spantemp.className;
  } 
 }	
 document.body.removeChild(selTemp)
 selTemp = null
}

function extraiScript(texto){
//Maravilhosa função feita pelo SkyWalker.TO do imasters/forum
	var ini = 0;
	// loop enquanto achar um script
	while (ini!=-1){
		// procura uma tag de script
		ini = texto.indexOf('<script', ini);
		// se encontrar
		if (ini >=0){
			// define o inicio para depois do fechamento dessa tag
			ini = texto.indexOf('>', ini) + 1;
			// procura o final do script
			var fim = texto.indexOf('</script>', ini);
			// extrai apenas o script
			codigo = texto.substring(ini,fim);
			// executa o script
			/**********************
			* Alterado por Micox - micoxjcg@yahoo.com.br
			* Alterei pois com o eval não executava funções.
			***********************/
			novo = document.createElement("script")
			novo.text = codigo;
			document.body.appendChild(novo);
		}
	}
}
function extraiStyle(texto){
//baseada na função anterior
	var ini = 0;
	// loop enquanto achar um script
	while (ini!=-1){
		// procura uma tag de script
		ini = texto.indexOf('<style', ini);
		// se encontrar
		if (ini >=0){
			// define o inicio para depois do fechamento dessa tag
			ini = texto.indexOf('>', ini) + 1;
			// procura o final do script
			var fim = texto.indexOf('</style>', ini);
			// extrai apenas o script
			codigo = texto.substring(ini,fim);
			// executa o style
			novo = document.createElement("style")
			novo.text = codigo;
			document.body.appendChild(novo);
		}
	}
}


function camposForm(fform){
/**************************************************
* Autor: José Cláudio Medeiros de Lima
* Data: 17/12/2007
* Objetivos: Pega todos os campos de um formulário, seus valores 
	  e junta tudo em um formato de querystring, 
	  por exemplo: var1=valor1var2=valor2
* Parâmetros: nomeForm - O nome do formulário qualquer.
**************************************************/
	var buff = [];
	var contador = 0; //viabiliza a contagem de laços do for,  
	//pois sem ele dá "undefined" nos checkboxes
	//ou radiobuttons que não estão marcados
	
	for (i=0; i< fform.length;i++)  {
		var campo = fform.elements[i];
		
		if(campo.type=="checkbox" || campo.type=="radio"){
			if(campo.checked){
				buff[contador] = campo.name + "=" + campo.value;
				contador ++; //incrementa 1 ao contador
			}
		}else{
			buff[contador] = fform.elements[i].name + "=" + fform.elements[i].value;
			contador++;
		}
	}
	return buff.join("&");
}

valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#5 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 28 dezembro 2007 - 02:57

Ae Klaudio, fiz uma pequena alteração na sua função dos forms lá:
Dá uma bizuiada:

function camposForm(fform){
/**************************************************
* Autor: José Cláudio Medeiros de Lima (pequenas alterações by Micox - 28/12/07)
* url: http://forum.ievolutionweb.com/index.php?showtopic=18264
* Versão: 1.5 - 28/12/2007
* Objetivos: Pega todos os campos de um formulário, seus valores 
	  e junta tudo em um formato de querystring, 
	  por exemplo: var1=valor1var2=valor2
* Parâmetros: fform - a referencia a um objeto html-form.
**************************************************/
	var buff = [];
	for (i=0; i< fform.length;i++)  {
		var campo = fform.elements[i];
		
		if((campo.type=="checkbox" || campo.type=="radio")){
			if(campo.checked==true && campo.name){ 
				buff.push(campo.name + "=" + encodeURI(campo.value));
			}
		}else if(campo.name){ //campos que não tenham name não vão.
			buff.push(campo.name + "=" + encodeURI(campo.value));
		}
	}
	return buff.join("&");
}

1) Encodei as variáveis
2) simplifiquei o esquema do buffer + contador
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#6 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 28 dezembro 2007 - 03:42

Caceta. Agora tá completa.

Ficou muuuito grande mas tá completa.
Em breve eu blogo explicando como usar.

ajaxVai(url_ou_form[,elemento_retorno[,html_carregando]][,timeout][,callback])

<script type='text/javascript'>
// <![CDATA[
// <!--
function ajaxVai(url_ou_form){
/******
* ajaxVai - envia uma solicitação ajax simples ou submete um formulário via ajax
* sintaxe: ajaxVai(url_ou_form[,elemento_retorno[,html_carregando]][,timeout][,callback])
* Versão: 1.0 - 28/12/2007
* Autor: Micox - www.elmicox.com - elmicox.blogspot.com
*******/
	var url,o_form,method='GET',elemento_retorno, html_carregando,callback,params='',concat,url_orig;
	var loads = ['&nbsp;&nbsp;&nbsp;','.&nbsp;&nbsp;','..&nbsp;','...'],loadpos=0,timeload;
	var timeout, timecounter=0, msg;
	var isIE = /*@cc_on!@*/false; //vendo se é o IE
	var self = this, args = $A(arguments); //transformando os argumentos em array
	
	//pegando se é url direta ou form
	if(typeof(url_ou_form)=='string'){
		if(url_ou_form.indexOf('http://')>=0){ //é url
			url = url_ou_form;
		}else{
			o_form = document.getElementsById(url_ou_form);
			if(o_form && o_form.nodeName.toLowerCase()=='form'){
				url = o_form.action;
				method = o_form.method.toUpperCase();
			}else{ //form não existe
				alert('Programador, reveja sua chamada ao ajaxVai.\r\nO form "' + url_ou_form + '" informado, não existe');
				return false;
			}
		}
	}else if(typeof(url_ou_form.nodeType)!='undefined' && url_ou_form.nodeName.toLowerCase()=='form'){ //form passado como referencia ao objeto html
		o_form = url_ou_form;
		url = o_form.action;
		method = o_form.method.toUpperCase();
	}else{
		alert('Programador, reveja sua chamada ao ajaxVai.\r\nO primeiro parâmetro url_ou_form é obrigatório');
		return false;
	}
	delete url_ou_form; //não precisamos mais dela
	
	//pegando os opcionais.
	for(var i=1; i<args.length; i++){ //começando no segundo pois o 1o já foi pegado
		
		if(args[i]==null){ continue;} //argumento vazio ou nulo, roda pro próximo
		
		if(typeof(args[i])=='function'){ //é a callback
			callback = args[i];
			
		}else if(typeof(args[i])=='number'){ //é o timeout
			timeout = args[i];
			
		}else if(typeof(args[i].nodeType) !='undefined'){ //há nodeType então é o elemento_retorno
			elemento_retorno = args[i];
			
		}else if(typeof(args[i])=='string'){ //id do elem_retorno ou o html_carregando
		
			//se ainda não existir elem_retorno, então é o próprio, se já existir então é o html_carregando
			if(!elemento_retorno){
				elemento_retorno = document.getElementById(args[i]);
				if(!elemento_retorno){
					alert('Programador, reveja sua chamada ao ajaxVai.\r\nO elemento_retorno "' + arguments[1] + '" informado, não existe'); 
					return false;}
			}else{
				//obs.: o html_carregando só existe se tiver elemento_retorno. caso contrário, onde seria exibido o carregando? sacou?
				html_carregando = args[i];
			}
		}
	}
	
	var ajax1 = pegaAjax(); //capturando um NOVO objeto xmlHttpRequest

	if(ajax1){
	
		if(o_form){
			params = camposForm(o_form);
		}
		
		//montando a URL
		url_orig = url;
		concat = (url.indexOf('?')>=0) ? "&" : '?'; 
		//antiga antiCacheRand. Para o problema de cache com ajax do IE
		if(isIE){ 
			var dt = new Date();
			url += concat + encodeURI(dt.getTime())
			concat = '&';}
		
		ajax1.onreadystatechange = ajaxOnReady
		
		if(method=='GET'){
			ajax1.open(method, url + concat + params ,true);
			ajax1.setRequestHeader("Content-Type", "text/html; charset=utf-8");
			params='';
		}else{ //POST
			ajax1.open(method, url ,true);
			ajax1.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			
		}		
		ajax1.setRequestHeader('X-Requested-With', 'ajax'); //dizendo ao servidor que foi pedido via ajax. Recupera-se com $_SERVER['X-Requested-With'] (no php)
		ajax1.setRequestHeader("Cache-Control", "no-cache");
		ajax1.setRequestHeader("Pragma", "no-cache");
		ajax1.send(params)
		
		//função periódica que verifica o timeout e gera animação
		timeload = setInterval(periodica,250); 
		
		return true;
		
	}else{
		return false;
	}
	
	//funções extra
	
	function ajaxOnReady(){ //executada a cada alteração no status http
	
		if(timecounter/4 > timeout){ //estourou o timeout. O abort foi feito na funcao periodica()
			
			clearInterval(timeload); //fim do contador
			msg = "Falha no carregamento. Tempo limite excedido: " + timeout + ' segs.';
			put(msg);
			window.status = '';
						
			if(callback){ callback(msg); } //chamando a função de callback

			ajax1 = null; delete ajax1;
			delete self;
			return false;
			
		}else if (ajax1.readyState==4){ //carregamento (ou não carregamento) completo
		
			clearInterval(timeload); //fim do contador
					
			if(ajax1.status == 200){ //com sucesso
				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);
				extraiScript(texto);
				window.status = '';
				if(callback){ callback(texto); } //chamando a função de callback
				
			}else{ //com erro			
				msg = "Falha no carregamento. " + httpStatus(ajax1.status);
				if(html_carregando){					
					put(msg);
				}else{
					window.status = msg;
				}
				if(callback){ callback(msg); } //chamando a função de callback
			}
			
			ajax1 = null; delete ajax1;
			delete self;
			return true;
			
		}else if(html_carregando){//para mudar o status de cada carregando
			put(html_carregando + pegaloads())
		}
	}
	function pegaloads(){
		if(loadpos>loads.length - 1){ loadpos = 0; }
		return loads[loadpos++] + ' ';
		
	}
	function put(valor){ //coloca o valor no elemento de retorno, se houver este
		if(elemento_retorno){
			if(elemento_retorno.nodeName.toLowerCase()=="input"){
				valor = escape(valor).replace(/\%0D\%0A/g,"")
				elemento_retorno.value = unescape(valor);
			}else if(elemento_retorno.nodeName.toLowerCase()=="select"){		
				select_innerHTML(elemento_retorno,valor)
			}else if(elemento_retorno.nodeName){
				elemento_retorno.innerHTML = valor;
			}   
		}
	}
	function periodica() {
		//mensagem indicando o carregamento
		if(html_carregando){
			put(html_carregando + pegaloads() )
		}else{
			window.status = 'Carregando ' + url_orig + ' ...';
		}
		
		//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

			ajax1.abort(); //também dispara a ajaxOnReady
			ajax1 = null; delete ajax1;
		}

	}
	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 0: return "Erro desconhecido de javascript. " + ajax1.statusText;
			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 HTTP " + stat + ': ' + ajax1.statusText + ". Informações em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"; break;
		}
	}
}


function select_innerHTML(objeto,innerHTML){
/******
* select_innerHTML - corrige o bug do InnerHTML em selects no IE
* Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Versão: 2.1 - 04/09/2007
*******/
	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.toLowerCase().replace(/<option/g,"<span").replace(/<\/option/g,"</span")
	selTemp.innerHTML = innerHTML
	  
	
	for(var i=0;i<selTemp.childNodes.length;i++){
  var spantemp = selTemp.childNodes[i];
  
		if(spantemp.tagName){	 
			opt = document.createElement("OPTION")
	
   if(document.all){ //IE
	objeto.add(opt)
   }else{
	objeto.appendChild(opt)
   }	   
	
   //getting attributes
   for(var j=0; j<spantemp.attributes.length; j++){
	var attrName = spantemp.attributes[j].nodeName;
	var attrVal = spantemp.attributes[j].nodeValue;
	if(attrVal){
	 try{
	  opt.setAttribute(attrName,attrVal);
	  opt.setAttributeNode(spantemp.attributes[j].cloneNode(true));
	 }catch(e){}
	}
   }
   //getting styles
   if(spantemp.style){
	for(var y in spantemp.style){
	 try{opt.style[y] = spantemp.style[y];}catch(e){}
	}
   }
   //value and text
   opt.value = spantemp.getAttribute("value")
   opt.text = spantemp.innerHTML
   //IE
   opt.selected = spantemp.getAttribute('selected');
   opt.className = spantemp.className;
  } 
 }	
 document.body.removeChild(selTemp)
 selTemp = null
}

function extraiScript(texto){
//Maravilhosa função feita pelo SkyWalker.TO do imasters/forum
	var ini = 0;
	// loop enquanto achar um script
	while (ini!=-1){
		// procura uma tag de script
		ini = texto.indexOf('<script', ini);
		// se encontrar
		if (ini >=0){
			// define o inicio para depois do fechamento dessa tag
			ini = texto.indexOf('>', ini) + 1;
			// procura o final do script
			var fim = texto.indexOf("<\/script>", ini);
			// extrai apenas o script
			codigo = texto.substring(ini,fim);
			// executa o script
			/**********************
			* Alterado por Micox - www.elmicox.com
			***********************/
			novo = document.createElement("script")
			novo.text = codigo;
			document.body.appendChild(novo);
		}
	}
}


function camposForm(fform){
/**************************************************
* Autor: José Cláudio Medeiros de Lima (pequenas alterações by Micox - 28/12/07)
* url: http://forum.ievolutionweb.com/index.php?showtopic=18264
* Versão: 1.5 - 28/12/2007
* Objetivos: Pega todos os campos de um formulário, seus valores 
	  e junta tudo em um formato de querystring, 
	  por exemplo: var1=valor1var2=valor2
* Parâmetros: fform - a referencia a um objeto html-form.
**************************************************/
	var buff = [];
	for (i=0; i< fform.length;i++)  {
		var campo = fform.elements[i];
		
		if((campo.type=="checkbox" || campo.type=="radio")){
			if(campo.checked==true && campo.name){ 
				buff.push(campo.name + "=" + encodeURI(campo.value));
			}
		}else if(campo.name){ //campos que não tenham name não vão.
			buff.push(campo.name + "=" + encodeURI(campo.value));
		}
	}
	return buff.join("&");
}

//transforma uma variável do tipo 'arguments' para array
function $A(object) {
	var array = [];
	for(var i = 0; i < object.length; i++)
		array[i] = object[i];
	return array;
}
// -->
// ]]>
</script>


Exemplo de uso:
<fieldset>
<legend>Teste sem form, com elemento retorno, com html carregando, com callback</legend>
<a href='ajaxTrata.php?&ha=hou' onclick='ajaxVai(this.href,document.getElementById("recebe12"),20,function(data){alert(data)}); return false;'>manda</a>
<div id='recebe1'>recebe1</div>
</fieldset>

<fieldset>
<legend>Teste com form GET</legend>
<form action='ajaxTrata.php' method='get'  '>
<input type='text' name='texto' />
<input type='checkbox' name='ck' value='chk' />check1
<input type='checkbox' name='ck2' value='chk2' />check2
<input type='radio' name='ra1' value='rada' />raa
<input type='radio' name='ra1' value='radb' />rab
<input type='radio' name='ra2' value='rad2' />rdad2
<textarea name='tarea'>opa opa</textarea>
<button type='submit' name='subm' value='manda'>manda</button>
<button type='button' name='ajax' value='ajax' onclick='ajaxVai(this.form,"recebe2");'>ajax</button>
</form>
<div id='recebe2'>recebe2</div>
</fieldset>

valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#7 Membro offline   Klawdyo Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 59
  • Cadastrado: 20-outubro 07
  • Localização:Assu-RN

Postou 29 dezembro 2007 - 11:14

Micox , você é o cara mesmo
eu deixo você sozinho por 2 dias e lá vem você revolucionando tudo de novo.. huahuahuahauha

Agora eu tenho uma bronca pra você resolver
Assim funciona
<a href="ajaxTrata.php?&requisição=simples"
onclick='ajaxVai(this.href,document.getElementById("select1"),20); return false;'>requisição this.href</a>

Assim NÃO funciona
<a href="ajaxTrata.php?&requisição=simples"
onclick='ajaxVai("ajaxTrata.php",document.getElementById("select1"),20); return false;'>requisição simples</a>

Já tentei de todo jeito.
.
.
.
"Se não merece ser bem feito, não merece ser feito!!"
0

#8 Membro offline   Klawdyo Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 59
  • Cadastrado: 20-outubro 07
  • Localização:Assu-RN

Postou 29 dezembro 2007 - 11:24

Ah, agora achei o problema
Do jeito que a função está atualmente, só funciona corretamente se você especificar o endereço completo do arquivo, como http://localhost/ajaxTrata.php

A questão está na linha 16 da função ajaxVai, onde tem

Quote

if(url_ou_form.indexOf('http://')>=0){ //é url
url = url_ou_form;

Ele verifica em que posição está o http://, se não achar, cairá no ELSE, ou seja, será tratado como ACTION do form, então dá o erro "O objeto não dá suporte a essa propriedade ou método".
Tô tentando resolver, mas é complicado.. eu não gosto de mexer em funções complexas como essa..uma alteração que eu fizer pode danificar alguma verificação lá no final ou coisa do tipo.. mas se eu conseguir eu posto aqui.

Valeu
.
.
.
"Se não merece ser bem feito, não merece ser feito!!"
0

#9 Membro offline   Klawdyo Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 59
  • Cadastrado: 20-outubro 07
  • Localização:Assu-RN

Postou 29 dezembro 2007 - 11:44

Aí, cara. É o seguinte
Eu não entendi porque você colocou a verificação com o indexOf, procurando por http://, já que nunca caia no else dela.
Se eu chamasse this.href caía no if, se eu chamasse por this.form caía lá no outro else if. Se eu chamasse pelo nome do formulário, por exemplo "form_1", também caía no else if .. ou seja, eu não vi nenhuma situação que caísse nesse else aí, exceto quando o primeiro if retornava false porque não achava o http://.

Quote

if(typeof(url_ou_form)=='string'){
if(url_ou_form.indexOf('http://')>=0){ //é url completa
url = url_ou_form;
}else{
o_form = document.getElementsById(url_ou_form);
if(o_form && o_form.nodeName.toLowerCase()=='form'){
url = o_form.action;
method = o_form.method.toUpperCase();
}else{ //form não existe
alert('Programador, reveja sua chamada ao ajaxVai.\r\nO form "' + url_ou_form + '" informado, não existe');
return false;
}
}
else if..................................


Sendo assim, eu retirei tudo, deixei assim:

Quote

if(typeof(url_ou_form)=='string'){
url = url_ou_form;
}
else if.................................


Agora vamos esperar a resposta do mestre. Essa minha foi só uma gambiarra

Valeu

p.s.: Depois eu vou colocar aqui uma listagem mais aprofundada com exemplos de uso, explicação dos parâmetros da função, etc. Mas vamos primeiramente resolver essa questão.
.
.
.
"Se não merece ser bem feito, não merece ser feito!!"
0

#10 Membro offline   Bermonruf Ícone

  • Bernardo Rufino
  • Ícone
  • Grupo: Moderadores
  • Posts: 762
  • Cadastrado: 04-outubro 06
  • Localização:Rio de Janeiro, RJ
  • Interesses:Ruby On Rails, PHP, Javascript, Ajax, CSS, XHTML, DOM, XML

Postou 30 dezembro 2007 - 12:27

Galera, parabéns, tá completa mesmo. Só uma dica, quando o número de argumentos cresce assim, prefira usar um JSON como último argumento, é mais claro e ainda se livra daquele for POGuístico.

// Complicado e ilegível
ajaxVai("http://www.site.com", document.getElementById("elemento"), "Carregando...", 500, function(data){alert(data);});

// Claro, limpo e legível
ajaxVai("http://www.site.com", document.getElementById("elemento"), {
	wait: "Carregando...",
	timeout: 500,
	callback: function(data){alert(data);}
});

Mais fácil pra vocês e pra quem usa.
Blog: http://bermonruf.wordpress.com
0

#11 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 31 dezembro 2007 - 07:49

Quote

Ah, agora achei o problema
Do jeito que a função está atualmente, só funciona corretamente se você especificar o endereço completo do arquivo, como http://localhost/ajaxTrata.php

A questão está na linha 16 da função ajaxVai, onde tem
ooou fóquin shit!!!!! Ainda bem que tem uns brodi que ajuda que nem vc huaheuaheu


Quote

Galera, parabéns, tá completa mesmo. Só uma dica, quando o número de argumentos cresce assim, prefira usar um JSON como último argumento, é mais claro e ainda se livra daquele for POGuístico.
Pensei nisso aí e fiquei realmente em dúvida.
A questã é que as novataiada que também gostam de usar estes códigos aí vão ter dificuldade.
Mas acho que é a melhor saída mesmo após este problema que o Cláudio falou.
Json vai ficar mais organizado.

Valeus people. Por isso que é bom ter brodis heheh.
Em breve blogarei (se não acharem mais nenhum outro defeito hehehae)
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#12 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 02 janeiro 2008 - 01:31

Hou, tá saindo uma nova aqui.

var isIE = /*@cc_on!@*/false; //vendo se é o IE

function ajaxGo(param){
/**
* ajaxGo - envia uma solicitação ajax simples ou submete um formulário via ajax
* sintaxe: ajaxGo({})
* Versão: 1.0 - 28/12/2007
* Autor: Micox - www.elmicox.com - elmicox.blogspot.com
* Licença: Creative Commons - http://creativecommons.org/licenses/by/2.5/br/
* Some Rights Reserved - http://creativecommons.org/licenses/by/2.5/
**/

	/******** declaracao de variaveis ********/	
	var url, the_form, callback, timeout, html_loading, elem_return, unescape_, hide_err; //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 = ['&nbsp;&nbsp;&nbsp;','.&nbsp;&nbsp;','..&nbsp;','...']; //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=='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; }
			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.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] + '" informado, nao existe'); 
			return false;
		}
	}
	
	/******** começando o ajax ********/	
	ajax = getAjax(); //capturando um NOVO objeto xmlHttpRequest

	if(ajax){	
		if(the_form){	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;
	
		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);
		
		//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(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;
			
		}else 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);
				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 self;
			return true;
			
		}else{//para mudar o status de cada carregando
			put('')
			window.status = '';
		}
	}
	function loadsAnim(){ //faz a animaçãozinha no array loads
		if(loading.indexOf('<img')<0){ // 3 dots just if no image
			if(loadpos>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, "");
				elem_return.value = unescape(valor);
			}else if(elem_return.nodeName.toLowerCase()=="select"){		
				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){
			put(html_loading + loadsAnim() )
		}else{
			window.status = 'Carregando ' + url_orig + loadsAnim().replace(/&nbsp;/g,'');
		}
		
		//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
		}

	}
	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<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 0: return "Erro desconhecido de javascript. " + ajax.statusText;
			case 400: return "400: Solicitacao incompreensivel"; 
			case 403: case 404: return "404: Nao foi encontrada a URL solicitada";
			case 405: return "405: O servidor nao suporta o metodo solicitado"; 
			case 500: return "500: Erro desconhecido do servidor";
			case 503: return "503: Capacidade maxima do servidor alcancada"; 
			default: return "Erro HTTP " + stat + ': ' + ajax.statusText + ". Informacoes em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html";
		}
	}
	
}

function select_innerHTML(objeto,innerHTML){
/******
* select_innerHTML - corrige o bug do InnerHTML em selects no IE
* Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Versão: 2.1 - 04/09/2007
*******/
	var opt, selTemp = document.createElement("micoxselect");	
	objeto.innerHTML = ""; 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.toLowerCase().replace(/<option/g,"<span").replace(/<\/option/g,"</span");
	selTemp.innerHTML = innerHTML;
	
	for(var i=0;i<selTemp.childNodes.length;i++){
		var spantemp = selTemp.childNodes[i];
		
		if(spantemp.tagName){	 
			opt = document.createElement("OPTION");			
			if(isIE){ objeto.add(opt); }else{ objeto.appendChild(opt);  }	   
			
			//getting attributes
			for(var j=0; j<spantemp.attributes.length; j++){
				var attrName = spantemp.attributes[j].nodeName;
				var attrVal = spantemp.attributes[j].nodeValue;
				if(attrVal){ try{
						opt.setAttribute(attrName,attrVal);
						opt.setAttributeNode(spantemp.attributes[j].cloneNode(true));
					}catch(e){}
				}
			}
			//getting styles
			if(spantemp.style){ for(var y in spantemp.style){
					try{opt.style[y] = spantemp.style[y];} catch(e) {}
			} }
			
			//value and text
			opt.value = spantemp.getAttribute("value");
			opt.text = spantemp.innerHTML;
			opt.selected = spantemp.getAttribute('selected'); //IE
			opt.className = spantemp.className; //IE
		} 
	}	
	document.body.removeChild(selTemp); selTemp = null;
}

function getScripts(texto){ //extrai javascripts do texto e executa no documento
//Author: SkyWalker.TO do imasters/forum (pequenas alterações by Micox)
	var ini = 0;
	// loop enquanto achar um script
	while (ini!=-1){
		// procura uma tag de script
		ini = texto.indexOf('<script', ini);
		if (ini >=0){
			ini = texto.indexOf('>', ini) + 1;
			// procura o final do script
			var fim = texto.indexOf("<\/script>", ini);
			codigo = texto.substring(ini,fim);
			// executa o script - alterado by Micox.
			var novo = document.createElement("script")
			novo.text = codigo;
			document.body.appendChild(novo);
		}
	}
}

function getFieldsForm(fform){ //pega campos do formulário e retorna a querystring correspondente
/**************************************************
* Autor: José Cláudio Medeiros de Lima (pequenas alterações by Micox - 28/12/07)
* url: http://forum.ievolutionweb.com/index.php?showtopic=18264
* Versão: 1.5 - 28/12/2007 - Creative Commons
**************************************************/
	var buff = [];
	for (var i=0; i< fform.length;i++)  {
		var campo = fform.elements[i];
		
		if((campo.type=="checkbox" || campo.type=="radio")){
			if(campo.checked==true && campo.name){ 
				buff.push(campo.name + "=" + encodeURI(campo.value));
			}
		}else if(campo.name){ //campos que não tenham name não vão.
			buff.push(campo.name + "=" + encodeURI(campo.value));
		}
	}
	return buff.join("&");
}

valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#13 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 02 janeiro 2008 - 01:48

*************************

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: '<strong>Loading</strong>', /* 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:'<b>Carregando</b>' });
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 } });


Pra quem não sabe o objetivo daquele abre-fecha de chaves nos parametros, é que aquilo é JSON. http://json.org
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#14 Membro offline   Klawdyo Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 59
  • Cadastrado: 20-outubro 07
  • Localização:Assu-RN

Postou 04 janeiro 2008 - 06:24

E aí, cara.. Depois de uma viajada, e mais 3 dias com minha internet de pau, troquei de provedor e vortei.. bueno..
num testei ainda a funçção acima não, mas estou muito triste, porque esses 3 dias sem internet eu passei atualizando minhas funções pra usar o ajaxVai (parece o nome daquele político: Jacques Vagner).. snif...
é freud.. huhauahuah

sim, como eu tava dizendo, eu não testei ainda, mas a função ajaxVai, quando eu chamava ela mandando retornar em um elemento qualquer, ela exibia o texto "carregando" seguidos de 3 pontinhos que ficam apagando e aparecendo, correto?

Acontece que quando eu exibia dentro de um select, ele aparecia assim

Quote

carregando&nbsp;&nbsp;&nbsp;

depois

carregando.&nbsp;&nbsp;


e por aí vai.. ele exibia os &nbsp; literais dentro da bicha lá.. alguém mais detectou isso?
talvez aconteça também dentro dos inputs, textareas.. não testei...
.
.
.
"Se não merece ser bem feito, não merece ser feito!!"
0

#15 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5511
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 05 janeiro 2008 - 08:45

Ou shit, como soy burro.
Esqueci isso ahuehaue
vou arrumar hehea, pere
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

  • (7 Páginas)
  • +
  • 1
  • 2
  • 3
  • Último »


Resposta rápida

  

1 usuário(s) está(ão) lendo este tópico
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)