AJAX: testando XMLHttpRequest lendo arquivos locais

2 respostas
Luiz_Augusto_Prado

Olá pessoal!

Estou tentando meus fontes JavaScripts, mas estou tendo alguns problemas.

Problema 1:

tenho a seguinte linha (77):
if (result.readyState==4 && ( result.status==0 || result.status==200 ) )

deveria ser apenas
if (result.readyState==4 && result.status==200 )

Problema 2:
Em javascript não é possivel ler aquivos locais com o XMLHttpRequest. Seria uma falha de segurança. Sendo assim, como vcs testam os fontes sem precisar criar um servidor local? Quais as melhores formas para testes com arquivos locais?

No chrome temos que executa-lo dessa forma para que se permita os testes, mas isso impede que o result.status seja igual a 200:

este é meu fonte:

main.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>  
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
 	<script>
	var divModalEspera;  
	var Conexao;

	//==============================================================
	// Cria Modal Espera
	//==============================================================
	CriateModalEspera = function()
	{
		//======================================================
		var divModalEspera = document.createElement("div");
		divModalEspera.id		= "divModalEspera";
		divModalEspera.style.position	= "absolute";
		divModalEspera.style.bottom	= "0px";  
		divModalEspera.style.top	= "0px";  
		divModalEspera.style.right	= "0px"; 
		divModalEspera.style.left	= "0px";  
		divModalEspera.style.opacity = "0.5";
		divModalEspera.style.backgroundColor="#f3f3f3"; 
		divModalEspera.style.visibility	="hidden";
		divModalEspera.style.display = "none"; //this is needed mainly for Chrome
		divModalEspera.Close = function()
		{
			divModalEspera.style.visibility	="hidden";
			divModalEspera.style.display = "none"; //this is needed mainly for Chrome
		}
		divModalEspera.Show = function()
		{ 
			divModalEspera.style.visibility = "visible";
			divModalEspera.style.display = "block"; //this is needed mainly for Chrome
		} 	
		document.body.appendChild( divModalEspera );
		return divModalEspera;
	}


	// fonte base deste conhecimento: http://www.w3schools.com/dom/dom_httprequest.asp
	CreateLoader = function()
	{
		var result;

		try
		{
			// Firefox, Opera 8.0+, Safari
			result=new XMLHttpRequest();
		}
		catch (e)
		{
			// Internet Explorer
			try
			{
				result=new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try
				{
					result=new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e)
				{
					alert("Seu navegador não suporta AJAX!");
					return false;
				}
			}
		} 
		

		result.loadDadosAction = function(Metod, Path, action )
		{  
			result.onreadystatechange = function() 
			{ 
				if (result.readyState==4 && ( result.status==0 || result.status==200 )  ) // <=== deveria ser apenas if (result.readyState==4 && result.status==200 )  
				{ 
					action(result.responseText );
				}
			}
			result.open( Metod, Path, true ); 
			result.setRequestHeader('content-type','text/plain; charset=iso-8859-1');
			result.overrideMimeType('text/plain; charset=iso-8859-1');
			result.send();	
		}
		
		result.sendDados = function(stra, strb, strc, action )
		{ 
			result.onreadystatechange = function() 
			{ 
				if (result.readyState==4 && result.status==200  )
				{ 
					action(result.responseText );
				}
			}
			result.open( stra, strb, strc ); 
			result.overrideMimeType('text/plain; charset=iso-8859-1');
			result.send();
		}
 
		return result;
	}




	//==============================================================
	// Cria meus objetos principais
	//==============================================================
	loadPage = function()
	{
		divModalEspera = CriateModalEspera(); 
		Conexao = CreateLoader();
	}


	teste = function( ) 
	{ 
		divModalEspera.Show(); 
		CallBack = function (str)
		{  
			alert(str);
			divModalEspera.Close();
		} 
		Conexao.loadDadosAction("GET", "values.html", CallBack );
	}
	</script>
	</head>  


	<body onload="loadPage()"  >
	<button type="button" onclick="teste();">teste</button> 
	</body>
</html>

Este é o arquivo que gostaria de ler localmente:

values.html

este é o texto que quero imprimir. Apenas isso.

2 Respostas

wagnerfrancisco

Boa pergunta, eu sempre uso um servidor local. Se estiver trabalhando apenas com javascript, prefiro utilizar o node.js que é bem mais leve.

Luiz_Augusto_Prado

Estou fazendo um front end genérico baseado apenas no padrão w3c:
http://www.guj.com.br/java/301766-javascript-puro-formularios-genericos-e-geradores

É para CRUDs simples, ainda.
quando tiver como quero, algo em torno de 2000 linhas bem planejadas, isso tornará a criação de meus formulários e manutenção mais rápida.
A idéia é que não precise trabalhar com javascript e sim com um gerador de formularios:
http://www.guj.com.br/java/223655-extjs-popular-checkboxgroup-dinamicamente

Criado 9 de julho de 2013
Ultima resposta 9 de jul. de 2013
Respostas 2
Participantes 2