Ir para conteúdo

Arquivado

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

Floozie

[Resolvido] [Ajax] Bug com .post

Recommended Posts

Possuo o seguinte código jQuery:

function AjaxCidade(){

var $$ = jQuery;
var estado = $$("#estado").val();

$$.post('./admin/scripts/cidades.php?estado='+estado,{estado:$$("#estado").val()},function(data){

	if(data!="")

	{
		$$("#cidade").attr({disabled:''});
		$$("#cidade").html(data);

		AjaxBairro();
	}
	else
	{
		$$("#cidade").html("");
		alert('Nenhuma cidade foi cadastrada para o '+estado+'.');
	}

});

}

function AjaxBairro(){

var $$ = jQuery;
var cidade = $$("#cidade").val();

$$.post('./admin/scripts/cidades.php?cidade='+cidade,{cidade:$$("#cidade").val()},function(data){

	if(data!=""){
		$$("#bairro").attr({disabled:''});
		$$("#bairro").html(data);
	}
	else
	{
		$$("#bairro").html("");
		alert('Nenhumo bairro foi cadastrado para essa cidade.');
	}

});

}

 

Encontrei um bug bem tosco e gostaria de saber como resolver.

 

Dentro dos selects há um OnChange="AjaxCidade()" e OnChange="AjaxBairro()"

 

Quando na barra de endereço está: http://dominio.com.br/ a função simplesmente não funciona. Mas quando eu clico em "Página Inicial", no menu ou em qualquer um dos links, o endereço está como: http://dominio.com.br/index.php a função funciona normalmente. O que poderia ser feito para resolver este problema ? Preciso de uma solução com um pouco de urgência, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui contém um erro arrume e teste...

 

$$.post('./admin/scripts/cidades.php?cidade='+cidade,{cidade:$$("#cidade").val()},function(data){

 

Verifica que desta forma ele passa o valor "cidade" tanto em querystring "?cidade='+cidade" quanto em form "cidade:$$("#cidade").val()" eu sugeriria a segunda opção, dai no code cidades.php você recupera o valor por request form, ficaria assim...

 

$$.post('./admin/scripts/cidades.php',{cidade:$$("#cidade").val()},function(data){

 

* a mesma coisa acontece no estado, talvez esteja ai o erro, repare essa duplicação erronea e poste o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, creio que este não seja o problema... Porém, utilizando a forma request não funciona.

 

$cidade = $_POST['cidade'];

$cidade = $_REQUEST['cidade'];

 

Ambas não funcionam. Por isso optei pelo método get. Gostaria de saber se existe alguma outra forma de fazer esta mesma função do .post, vi que podia usar o .load ou o .getJSON, mas não sei usá-los para esse exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Velho... suspeitava disso... seu code não faz sentido, ta muito bagunçado e sem lógica.

 

Primeiro... você utiliza duas ações... request querystring e request form... o OnChange poderia ser feito diretamente no jquery...

 

Outra coisa é a estratégica... em um combo como este... o primeiro select que no caso é estados deve ser montado cru... no html da requisição... e não trazer o resultado via post, ajax... não faz sentido, monte o select no index, isso irá evitar por exemplo requisição extra no bd... e consequentemente ira carregar mais rápido.

 

Outra coisa é a organização do seu code... ta muito feio.

 

Criei um exemplo simples... mais que dara para você ter uma idéia...

 

Crie um arquivo chamado "cidade.php" coloque o seguinte code...

 

<option value="0">Selecione a Cidade</option>
<option value="1">Cidade 1</option>
<option value="2">Cidade 2</option>
<option value="3">Cidade 3</option>
<option value="4">Cidade 4</option>
<option value="5">Cidade 5</option>

 

Agora crie um arquivo chamado "bairros.php" coloque o seguinte code...

 

<option value="0">Selecione o Bairro</option>
<option value="1">Bairro 1</option>
<option value="2">Bairro 2</option>
<option value="3">Bairro 3</option>
<option value="4">Bairro 4</option>
<option value="5">Bairro 5</option>

 

Agora crie um arquivo chamado "index.php" e coloque o seguinte code...

 

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){

  $("#cidade").attr("disabled","disabled");
  $("#bairro").attr("disabled","disabled");

  $("#estado").change(function() {

     var estado = $(this).val();

     $.post('cidades.php',{estado:estado},function(data){

        if(data!="") {

           $("#estado").attr("disabled","disabled");
           $("#cidade").attr("disabled","");
           $("#cidade").html(data);

           $("#cidade").change(function() {

              var cidade = $(this).val();

              $.post('bairros.php',{cidade:cidade},function(data){
                 if(data!="") {
                    $("#cidade").attr("disabled","disabled");
                    $("#bairro").attr("disabled","");
                    $("#bairro").html(data);
                    $("#bairro").change(function() {
                       var bairro = $(this).val();
                       alert('Estado: '+ estado +' | Cidade: '+ cidade +' | Bairro: '+ bairro);
                    });
                 } else {
                    alert('Nenhum bairro cadastrado na cidade: '+cidade);
                 }
              });

           });

        } else {
           alert('Nenhuma cidade foi cadastrada para o estado: '+estado+'.');
        }
     });

  });
});
</script>
</head>
<body>
<div>
  <select id="estado">
     <option value="0">Selecione o Estado</option>
     <option value="1">Estado 1</option>
     <option value="2">Estado 2</option>
     <option value="3">Estado 3</option>
     <option value="4">Estado 4</option>
     <option value="5">Estado 4</option>
  </select>
  <select id="cidade">
     <option value="0">Cidade</option>
  </select>
  <select id="bairro">
     <option value="0">Bairro</option>
  </select>
</div>
</body>
</html>

 

Veja... como é o funcionamento... depure este exemplo... melhore ele a sua necessidade... depois basta fazer o que esta fazendo... porém recuperando via request.form o valor... e montando os selects no cidades.php e bairros.php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz do jeito que você pediu ae mas não funcionou. Depois refiz a forma que tinha feito antes. Ta muito estranho isso... Quando o endereço http://dominio.com/ ele simplesmente acusa, por exemplo, "Nenhuma cidade foi cadastrada para o Ceará" sendo que tem. Mas quando no endereço eu acesso como http://dominio.com/index.php, ele funciona normalmente... não sei se é permitido colocar o endereço do site aqui, então não colocarei por enquanto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz o teste aqui e foi de boa, você fez o teste da maneira que passei? apenas javascript e html? assim iremos sanar algumas dúvidas... inclusive poderá apontar se o erro é no javascript ou no php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas assim, se não estivesse funcionando nas duas formas, ae seria um problema. Porém.. ele só funciona quando há um arquivo "aberto", digamos assim. Tanto http://dominio.com/index.php'>http://dominio.com/index.php quanto http://dominio.com/servicos.php'>http://dominio.com/servicos.php funcionaria. O problema é quando eu acesso o site normalmente, digito seu endereço http://dominio.com/ a função não funciona... O que eu acho é que o jquery não reconhece a "pasta" atual que se encontra, e logo depois que acessamos o index.php, por exemplo, ela já localiza.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vai nessa pagina aonde não funciona... e clique com o botão direito... selecione exibir codigo fonte... selecione e poste aqui para eu analisar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, simplesmente não há nenhuma diferença. Pois se trata do mesmo index.php, o normal de um site não é executar o index.php logo de início ?! Então.. Ele executa, só que não funciona, mas se por exemplo eu clico em "página inicial"

que possui o link para http://dominio.com/index.php, a função jQuery funciona corretamente. Vou postar aqui os dois códigos

 

cidades.php

<?
include("config.php");

$estado = $_GET['estado'];
$cidade = $_GET['cidade'];

if($estado!=''){
	$procura = mysql_query('SELECT * FROM cidades WHERE estado = "'.$estado.'" ORDER BY cidade ASC');
	while($acha = mysql_fetch_array($procura)){
		echo '<option value="'.$acha['cidade'].'">'.$acha['cidade'].'</option>';
	}
}

if($cidade!=''){
	$procura = mysql_query('SELECT * FROM bairros WHERE cidade = "'.$cidade.'" ORDER BY bairro ASC');
	while($acha = mysql_fetch_array($procura)){
		echo '<option value="'.$acha['bairro'].'">'.$acha['bairro'].'</option>';
	}
}
?>

 

funcs.js

function AjaxCidade(){

var $$ = jQuery;
var estado = $$("#estado").val();

$$.post('cidades.php?estado='+estado,{},function(data){

	if(data!="")

	{
		$$("#cidade").attr({disabled:''});
		$$("#cidade").html(data);

		AjaxBairro();
	}
	else
	{
		$$("#cidade").html("");
		alert('Nenhuma cidade foi cadastrada para o '+estado+'.');
	}

});

}

function AjaxBairro(){

var $$ = jQuery;
var cidade = $$("#cidade").val();

$$.post('cidades.php?cidade='+cidade,{},function(data){

	if(data!=""){
		$$("#bairro").attr({disabled:''});
		$$("#bairro").html(data);
	}
	else
	{
		$$("#bairro").html("");
		alert('Nenhumo bairro foi cadastrado para essa cidade.');
	}

});

}

 

Voltando a dizer, apenas o método GET está funcionando. E pelo que eu saiba não teria nenhuma diferença em estar no "/" ou no "/index.php". Ta muito estranho isso, nunca vi nada igual oO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensei em algo.. Teria como acrescentar o index.php automaticamente no endereço ? sem que fique fazendo um loop infinito. Para que esse problema fosse resolvido. Deve ter algum <meta> ou alguma configuração no host para isso, certo ?

 

@edit

desculpa o double post, mas fiz apenas para dar o up

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meio complicado isso cara, não notei nada que pudesse causar esse problema.

 

Aperte Ctrl+Shif+J no Firefox, e verifique se há algum erro no depurador.

Ainda assim, essa forma com que você faz o ajax, eu não recomendo, por isso postei um link mostrando como fazer com jSON.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@William Bruno

Pois é, não apresentou nenhum erro no Ctrl+Shift+J. Irei tentar fazer da forma com o getJSON, que ainda não testei.

 

@0cool

Então cara... eu fiz da sua forma, mas quando eu mudava o estado, nada acontecia =/

 

------------------------

 

Bom... vou colocar o endereço do site, é o jeito...

http://saladocorretor.com/portaldevendas/

http://saladocorretor.com/portaldevendas/index.php

 

Vejam que no primeiro não funciona e no segundo sim, sendo que não há nenhuma diferença, nada mesmo.

Se houver uma forma de acrescentar esse index.php logo de inicio seria ótimo.

Ou então terei que transformar o index.php em index2.php e fazer o index.php redirecionar para o index2.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, estranho isso.. apaguei o cache do navegador 3 vezes... Cliquei pelo link, funcionou... Mas se eu for na barra de endereço e digitar o primeiro.. não funciona :S, que confusão essa em..

 

@edit

Outra coisa que percebi... Quando tentei acessar pelo IE digitando na barra de endereço foi de boa, mas quando fiz isso no firefox não deu certo... Eu já utilizei o CCleaner e nada... =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui ta indo de boa, tenho quase certeza que não é no navegador, mais nunca se sabe... estou utilizando o chrome e tu? qual ta utilizando e qual versão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou baixar aqui a versão 4.0.1 e ver se é de cache ou não, pois até agora so testei aquela sua url no chrome. já já edito o post e coloco o resultado.

 

EDITADO

 

É verdade... aqui tanto a url "/" quanto "/index.php" ta dando o mesmo problema... quando eu seleciono o estado... simplesmente cai no alert, o problema é incompatibilidade de browser e não cache como suspeitado.

 

Já o exemplo que eu fiz pra tu, ta funcionando.

 

So pra desencargo de consciência utilize o no conflict do jquery.

 

<script type="text/javascript">
 $.noConflict();
</script>

 

No seu caso $$ ao invés de $, coloque abaixo do script jquery.js

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho este seu problema, no chrome a url requisitada é:

http://saladocorretor.com/portaldevendas/cidades.php?estado=Cear%E1

 

Porém no Firefox é:

http://saladocorretor.com/portaldevendas/cidades.php?estado=Cear%C3%A1

 

EDIT:

 

Hum, o do firefox me parece ser o correto, pois o serialize do jquery retorna Cear%C3%A1.

 

Faça isto, troque:

$$.post('cidades.php?estado='+estado,{},function(data)

por

$$.post('cidades.php?'+$$('#estado').serialize(),{},function(data)

 

E no arquivo cidades.php dê um var_dump($_GET['estado']); para ver o que retorna.

 

Gostaria de lembrar que, se não me falta a memória, requisições ajax são feitas sempre usando UTF-8, e pelo que vejo você está usando ISO.

 

Veja: http://www.utf8-chartable.de/

Procure por U+00E1 e veja como o valor de á realmente é c3 a1.

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.