Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Geelherme

.load() só funciona bem depois de refresh

Recommended Posts

Amigos, venho utilizando Jquery constantemente no ultimo projeto que estou envolvido e tenho usufruido muito dos recursos e plugins desse framework. Estive a fazer um formulário de login utilizando o ajax do JQuery, mas estou tendo alguns problemas:

 

  • O script sempre retorna a mensagem "Você foi logado com sucesso" mesmo em caso de falha.
  • Ao executar a f unção .load(), a página carregada não executa os seus respectivos javascripts
  • Alguns caracteres são passados como se a codificação estivesse errada (mas não tenho certeza se é isso)

Vou postar o meu código para que algum colega possa dar uma olhada e quem sabe até me ajudar, pois já bati muita cabeça e não consegui resolver hehe. Em alguns fóruns vi pessoas com problemas parecidos (exceto o item 1) e que resolveram trocando o .load() por .delegate() ou .live(), mas eu não sei utilizar nenhuma dessas duas funções, muito menos para substituir o .load() hehehe

 

Código:

$(".bt_loga").click(function() {
		  contentType: 'application/x-www-form-urlencoded; charset=iso-8859-2';		  
	
		   var name  = $("input#login").val();
		   var senha = $("input#senha").val();	 
		
		  var dataString = 'login='+ name + '&senha=' + senha;
		  //alert (dataString);return false;
		   $.ajax({
			type: "POST",
			url: "inc/act/loga.php",
			cache: false,
			data: dataString,
			success: function() {
			  alert('Você foi logado com sucesso!');
			  $("#lado_esquerdo").fadeOut("fast").load('login.php').fadeIn("slow");
			}
		  });
		  return false
	  
	  });

Compartilhar este post


Link para o post
Compartilhar em outros sites

vamos aos poucos..

 

oque o script de login te retorna?

inc/act/loga.php
??

oq ele faz?

 

teste o retorno aqui:

success: function( data ) {
   if( data==true ) alert('pode logar');
   else alert('algo errado');

não carregar javascripts trazidos por ajax, é um problemas dos antigos.. e que eu pessoalmente, não conheço fórmula mágica para resolver.

 

o ajax do jQuery, trabalha sempre com UTF8.. atente a isso.. usar ISO num lugar, e UTF em outro vai gerar problemas mesmo..

php tem os __encode.. e os __decode.. que podem te ajudar

 

mas agora 8859-2 ?? 2 ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, vamos lá. Esse é o código do arquivo loga.php:

 

 

<?php
    include ('../qry/conecta.php');
    include ('../fnc/fnc_sql.php');

     $crm   = anti_sql_injection($_POST['login']);
     $senha = md5(anti_sql_injection($_POST['senha']));
     
    include ('../qry/select_login.php');
    $qry = mysql_query($sql);
    $row = mysql_fetch_array($qry);
	
    session_start();
    $_SESSION['NM_USUARIO'] = $row['NM_USUARIO'];
    $_SESSION['ID_USUARIO'] = $row['ID_USUARIO'];	
?>
onde:

- fnc_sql.php possui algumas rotinas para prevenir sql injection como real_scape, verificação da tipagem, etc.

- arquivos da pasta "qry" possuem apenas uma variável do tipo string com a minha instrução SQL

 

 

Pela sua pergunta já vi que o meu aruqivo php está incompleto. Achei que o jquery já identificasse se houve sucesso ou não na execução do php. O ideal seria um if (isset($_SESSION['NM_USUARIO'])) return true; else return false; no final do código? Se não souber eu pergunto no fórum de php mesmo, mas já agradeço desde já.

O ajax do Jquery sempre trabalha com UTF8? Dessa eu não sabia. vou tentar gerar o html em UTF8 para ver se fica OK então.

Sobe o ISO, sim, eu venho utilizando o ISO 8859 2 em vez do 1, mas não há nenhuma razão específica para isso. Independente de ser 1 ou 2 ali, o problema continua igual.

 

Mais alguma informação que você precise?

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza..

 

<?php
    session_start(); //melhor prática deixar isso bem no começo

    include ('../qry/conecta.php');
    include ('../fnc/fnc_sql.php');

     $crm   = anti_sql_injection($_POST['login']);
     $senha = md5(anti_sql_injection($_POST['senha']));
     
    include ('../qry/select_login.php');
    $qry = mysql_query($sql);
    
    if( mysql_num_rows( $qry ) )
    {
       $row = mysql_fetch_assoc($qry);
        
       $_SESSION['NM_USUARIO'] = $row['NM_USUARIO'];
       $_SESSION['ID_USUARIO'] = $row['ID_USUARIO'];

       echo '1';
    }
    else
       echo '0';
pronto, agora você tem um retorno booleano, para testar lá no retorno do javascript..

 

cara.. veja o seguinte:

ajax sempre vai retornar texto.. só isso.. simplesmente isso..

texto puro, texto formatado... seja html, json, xml.. não passa de 'texto'..

 

não existe 'mágica' pra saber se deu certo ou não ^_^

você entendeu bem, tava incompleto mesmo o teu arquivo php.

 

 

não conhecia o .delegate(), mas ele faz o mesmo que o .live()... dependendo do teu caso, nenhum dos 2 vai te ajudar a executar javascripts trazidos com ajax.

dica:

-> Não deixe nenhum <script></script> nas paginas que vierem por ajax, já coloca tudo na index, q tá chamando todas as outras

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu caro, aqui ficou o código do arquivo loga.php funcionando perfeitamente agora:

 

<?php
	session_start();
    
	include ('../qry/conecta.php');
    include ('../fnc/fnc_sql.php');

    $crm   = anti_sql_injection($_POST['login']);
    $senha = md5(anti_sql_injection($_POST['senha']));
     
    include ('../qry/select_login.php');
    $qry = mysql_query($sql);
    
	if(mysql_num_rows($qry)) {	
	  $row = mysql_fetch_array($qry);
	  
	  if ($row['SENHA'] == $senha){
					
		$_SESSION['LOGADO'] 	= 'OK';
		$_SESSION['NM_USUARIO'] = $row['NM_USUARIO'];
		$_SESSION['ID_USUARIO'] = $row['ID_USUARIO'];	
		
		echo '1';	  
	  }
	  else
		echo '0';
	}
	else
	  echo '0';
?>

Vou aguardar agora alguém que possa ajudar com os outros dois itens

 

-Ao executar a f unção .load(), a página carregada não executa os seus respectivos javascripts

-Alguns caracteres são passados como se a codificação estivesse errada (mas não tenho certeza se é isso)

 

Eu já vi que existe uma maneira de substituir o .load() usando o delegate e então carregando seus javascripts, mas agora que reparei o meu problema nem está no javascript de fato. Acontece que, após usar o .load(), se eu resolver clicar em "Deslogar", da primeira vez ele atualiza (ainda não sei dizer se a página ou o somente a div) corrigindo então os carcteres estranhos e me forçando a clicar em Sair para que ele de fato execute a função (que é chamada em js incluido na pagina index mesmo, no mesmo local onde fica o js que chama o logar).

 

OBS: Acabei de perceber que no IE, a função sempre me retorna "algo errado". Veja o código como está:

 

	  $(".bt_loga").click(function() {
		  contentType: 'application/x-www-form-urlencoded; charset=iso-8859-2';		  
		  // validate and process form here
	
		   var name  = $("input#login").val();
		   var senha = $("input#senha").val();	 
		
		  var dataString = 'login='+ name + '&senha=' + senha;
		  //alert (dataString);return false;
		   $.ajax({
			type: "POST",
			url: "inc/act/loga.php",
			cache: false,
			data: dataString,
			success: function( data ) {
			   if( data==true ){
				  alert('Você foi logado com sucesso!');
				  $("#lado_esquerdo").fadeOut("fast").load('login.php').fadeIn("slow");				   
			   }
			   else alert('algo errado')			
			}
		  });
		  return false
	  
	  });

Compartilhar este post


Link para o post
Compartilhar em outros sites

tá voltando uma string 1.. tenta fazer melhor o casting de tipos..

 

success: function( data ) {
                              alert( data );
                           if( data==true ){
if( data ), if( data=='1' )... vai tentando ai ^_^

 

mas cara, o .delegate() age igual o .live()...

o .load() age igual o $.ajax().. não me parece ter como trocar .load() por .delegate() .. até pq, o problema está em: trazer javascript com ajax, e não 'na forma que trás'..

 

o 'trazer em si' é o problema

veja alguns:

http://forum.imasters.com.br/index.php?/topic/264642-executar-funcoes-js-em-paginas-carregadas-com-ajax/

 

acentos:

http://forum.imasters.com.br/index.php?/topic/173603-resolvido%26nbsp;dica-solucao-final-para-acentuacao-no-ajax/

Compartilhar este post


Link para o post
Compartilhar em outros sites

ele tá sempre retornando 0, mas só no IE... ô navegador chato... não faço idéia ainda de como resolver.

 

Os acentos ficaram OK =D

Show de bola.. porém, por ser uma página carregada através de include, recebi o erro de "Headers already sent", mas contornei usando ob_start(), assumindo então uma péssima prática de programação rs. Mas foi a única maneira que consegui.

 

Vou dar uma olhada nesse link agora de como fazer o javascript funcionar corretamente.. Penso eu que se fosse possível dar um refresh na div (e não um load) ou uma "esvaziada" e depois carrega-la com load novamente, ambos os problemas estariam resolvidos, mas Ok.. enquanto ainda não sei como fazer isso, vou manter dessa forma mesmo.

 

Atualização:

 

Os acentos continuavam com problema nas mensagens do tipo alert(), mas resolvi utilizando unescape(). Ex:

unescape(alert());

 

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

ele tá sempre retornando 0, mas só no IE... ô navegador chato... não faço idéia ainda de como resolver.

 

hum.. o alert() tá voltando 0, sempre ?

 

você tá usando DOCTYPE na página?

 

Os acentos ficaram OK =D

Show de bola.. porém, por ser uma página carregada através de include, recebi o erro de "Headers already sent", mas contornei usando ob_start(), assumindo então uma péssima prática de programação rs. Mas foi a única maneira que consegui.

huahauhau

você é mais corajoso que eu... única vez que fui forçado a fazer carregamento de páginas com ajax (tinha uma transmissão de streaming na página), eu converti os acentos, para o entitie deles..

Ç == Ç

 

Vou dar uma olhada nesse link agora de como fazer o javascript funcionar corretamente.. Penso eu que se fosse possível dar um refresh na div (e não um load) ou uma "esvaziada" e depois carrega-la com load novamente, ambos os problemas estariam resolvidos, mas Ok.. enquanto ainda não sei como fazer isso, vou manter dessa forma mesmo.

 

hum... não consegui pensar em nada

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum.. o alert() tá voltando 0, sempre ?

 

você tá usando DOCTYPE na página?

 

Não estou utilizando doctype não. Comecei a fazer o projeto todo no PHP Editor e ele por padrão inclui apenas algumas tags no documento novo. Acabei deixando como veio. No dreamweaver ele me cria automaticamente o seguinte código:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Seria isso que você se refere? Eu particularmente não sabia que o doctype interfereria assim num documento. Eu até tentei colocar ese código no html e no php incluído, mas em nenhum dos dois mudou o funcionamento. Sempre volta 0.. Mas lembrando, isso é somente no IE.

 

huahauhau

você é mais corajoso que eu... única vez que fui forçado a fazer carregamento de páginas com ajax (tinha uma transmissão de streaming na página), eu converti os acentos, para o entitie deles..

Ç == Ç

Hehehe, o meu problema em colocar o entitie é pq tenho muita informação oriunda de um banco MYSQL.. e melhor que ter que ficar decodificando toda string, seria já salvar e consultar o texto como ele é.

 

hum... não consegui pensar em nada

 

Nem eu, por enquanto... continuo pesquisando, se achar algo posto aqui. Mas primeiro, tenho que resolver o problema do IE que sempre retorna 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.