Ir para conteúdo
Fórum Script Brasil
  • 0

onchange não funciona


Leandro Pontes

Pergunta

Pessoal sou novo aki no fórum e a pouco tempo to programando em PHP.

Estou tentando atualizar uma combo dinamicamente. Através do valor da da primeira combo, a segunda combo só aparecer os valores referente a primeira.

Pesquisei em muitos sites mas ainda não consegui fazer funcionar, fiz o seguinte:

Na minha form principal, na primeira combo, na opção onchange, chamo uma função em java script para poder carregar uma pagina PHP onde vou trazer os valores que quero colocar na segunda combo. Mas parece que a opção onchange não está funcionado, pois não está chamando a função. Vou colocar parte do código que escrevi, por favor me ajudem.

FORM PRINCIPAL(onde estão os dois combos)

<html>
<head>
<title>Cadastro de Contratos</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript"> 
function busca_pacotes(plano){
// Aqui indica o arquivo carrega_pacotes.php 
// passando o id do plano selecionado
var url = "carrega_pacote.php?plano="+plano

// Aqui o objeto que receberá os options
// com os valores dos pacotes
var obj = document.getElementById("pacote"); 

//Aqui começa a mágica do ajax
var http_req = false;
try{
http_req = new XMLHttpRequest();
}catch(e){
try{
http_req = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
http_req = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
alert("Sem XMLHttpRequest disponível!");
}
}
}
var req = http_req;

req.open("get",url,false);
req.send(null);

// Se o ajax retornou valores
if(req.status==200){
try{
// joga os valores em result
var result = eval(req.responseText);

// Remove os options do select
var iSize = obj.length;
for(var i = 0; i<iSize; i++)
obj.remove(1);
// Aqui coloco obj.remove(1), porque não quero
// que seja removido o 1 option(- cidades -), se
// quisesse remover todos, colocaria obj.remove(0)

for(i=0;i<result.length;i++){
// criando o option
var opt = document.createElement("option");
opt.text = result[i].descricao;
opt.value = result[i].pacote;

// Atribuindo o option ao select cidades
try {
obj.add(opt,null);
}catch(ex){
obj.add(opt,obj.length);
}
}
}catch(e){};
}
}
//-->
</script>
</head>

<form name="form1" method="post" action="<?php print $_SERVER["PHP_SELF"]; ?>?acao=cadastrar&id_cliente=<? echo $array_cliente['id_cliente'];?>">
<p><font face="Geneva, Arial, Helvetica, sans-serif">Codigo do Cliente: 
<input name="id_cliente" type="text" disabled="disabled" id="id_cliente" value="<? echo $array_cliente['id_cliente'];?>">
</font>

</p>

<p><font face="Geneva, Arial, Helvetica, sans-serif">Plano: 
<select name="plano" onchange="busca_pacotes(this.options[this.options.selectedIndex].value)">
<option value=""><< Selecione o Plano >></option> 
<? while($array = mysql_fetch_array($sql_planos)) {
print "<option value=\"{$array["id_plano"]}\">{$array["descricao"]}</option>\n";
}
mysql_free_result($sql_planos);

?>
</select></font></font>
</p>
<p><font face="Geneva, Arial, Helvetica, sans-serif">Pacote: 
<select name="pacote">
<option><< Selecione o Pacote >></option>
</select>
</font></p>
Este trecho de código acima é o que contém as duas combos. O código abaixo é da pagina chamada pela função CARREGA_PACOTE
<?php
include "conecta.php"; //Conecta com o banco de dados MySQL
include "ver_sessao.php"; //Verifica se a sessão está ativa 

if($_REQUEST["plano"]){
if asda 
$sql_pcte = mysql_query("SELECT p.* FROM plano_pacote pp, pacotes p WHERE pp.id_plano = {$_REQUEST["plano"]} and pp.id_pacote = p.id_pacote") 
or die("ERRO no comando SQL:".mysql_error());
$cont = 0;
while($pcte = mysql_fetch_array($sql_pcte)) { 
## Aqui monta o resultado da busca no formado
## que o javascript entende para retornar ao ajax 
$pacotes .= ($cont==0? "" : ",").
"{'id_pacote':'".$pcte["id_pacote"]."','descricao':'".$pcte["descricao"]."'}";
$cont++;
}

mysql_free_result($sql_pcte);

## E aqui printa o resultado no documento
print "[$pacotes]";
}
mysql_close();

?>

Por favor me ajudem urgente.

Obrigado

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Amigo, eu vou te dar uma dica, não sei se já fez isso mas vou dizer mesmo assim.

Não vai codificando sem testar. Verifique passo a passo se o que está fazendo funciona perfeitamente, caso contrário, quando aparece um erro a dificuldade em encontrar a solução cresce a medida que vai codificando. Chega uma hora que o código está grande e não faz a menor idéia de onde está o erro.

Não dá pra eu olhar nesse código e saber exatamente onde está o erro, já que quem tem o bd é você. Não tem como eu colocar esse código e rodar. Nunca irá rodar. A não ser que eu crie um bd igual ao seu.

Então a minha sugestão é, redirecione o ajax para outra página de testes php, e apenas retorne o valor que mandou pelo ajax. Só para verificar se a função está funcionando como deveria.

Retire tudo da função busca_pacotes. Se ela busca pacotes, então ela só deve buscar os pacotes. Tire o ajax daí. Tente ser o mais semântico possível nos códigos, modularizando, particionando os códigos para quando der um erro ficar mais fácil de achá-lo.

Dando uma olhada por cima no seu código, tenho a impressão de que o problema é no ajax, já que não existe um onreadystatechange. Esse evento testa sempre que o valor da requisição do objeto ajax é alterado.

Então tenta o seguinte, ANTES do req.send(null):

req.onreadystatechange=function(){

    if(req.status==200){
        try{
        // joga os valores em result
        var result = eval(req.responseText);

        // Remove os options do select
        var iSize = obj.length;
        for(var i = 0; i<iSize; i++)
        obj.remove(1);
        // Aqui coloco obj.remove(1), porque não quero
        // que seja removido o 1 option(- cidades -), se
        // quisesse remover todos, colocaria obj.remove(0)

            for(i=0;i<result.length;i++){
            // criando o option
            var opt = document.createElement("option");
            opt.text = result[i].descricao;
            opt.value = result[i].pacote;

            // Atribuindo o option ao select cidades
                try {
                obj.add(opt,null);
                }catch(ex){
                obj.add(opt,obj.length);
                }

            }

        }
    catch(e){};
    }
}

Mas precisa organizar melhor esses códigos, senão sempre terá dor de cabeça. Quanto maior a organização, menores as chances de erros e menor ainda a dificuldade de encontrá-los quando existirem.

Akeleabraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...