Elementos de formulário select associados

Como fazer com Javascript que um elemento de formulário select mude suas opções quando mude outro elemento select da página. De modo que cada opção de um select tenha um grupo de opções possíveis para o outro select.

Por Miguel Angel Alvarez - Tradução de JML


Publicado em: 21/8/05
Valorize este artigo:
Vamos conhecer um dos truques mais solicitados de Javascript, que tem muita relação com o tema de formulários e onde se utiliza o evento onchange de Javascript. É um exemplo sobre como realizar uma página com dois selects onde, segundo o valor escolhido em um deles, mudem as opções possíveis do outro select.

O melhor para ver o que vamos fazer é ver uma página web onde se mostra em funcionamento o script. Para ver seu funcionamento, devemos mudar a seleção do primeiro select e comprovaremos como as opções do segundo select mudam automaticamente.

O exemplo que ilustramos utiliza estados e países. Ao escolher no primeiro select um país, no segundo deve nos mostrar os estados desse país para que possamos escolher um estado, mas somente um que esteja no país selecionado no primeiro término.

Conhecer o objeto select e os option

É importante conhecer os objetos de formulário select e os option. Os select correspondem com as caixas de seleção desdobráveis e os option com cada uma das opções da caixa desdobrável. Podemos ver um artigo que fala sobre isso.

Teoricamente nos interessa fazer várias coisas que têm a ver com extrair o valor de um select em qualquer momento, observar seu número de opções e, para cada opção, colocar seu valor e seu texto associado. Tudo isto aprenderemos a fazer neste exemplo.

Referência: Para conhecer o trabalho e a hierarquia de objetos javascript (Tudo isso é a base do trabalho com os elementos das páginas em Javascript) devemos ler o manual de Javascript II.

Modo de solucionar o problema

Para começar, vamos utilizar um formulário com dois selects, um para o país e outro para o estado.

<form name="f1">
<select name=pais onchange="muda_estado()">
<option value="0" selected>Selecione...
<option value="1">Espanha
<option value="2">Brasil
<option value="3">Portugal
<option value="4">França
</select>

<select name=estado>
<option value="-">-
</select>
</form>


Observamos no select associado ao país deste formulário que, quando se muda a opção de país, deve-se chamar a função muda_estado(). Veremos mais adiante esta função, agora é importante observar que está associada ao evento onchange que se ativa quando muda a opção no select.

Todo o resto será código Javascript. Começamos definindo um montão de de arrays com os estados de cada país. Neste caso temos só 4 países, então necessitaremos 4 arrays. Em cada array tenho uma lista de estados de cada país, colocados em cada um dos elementos do array. Ademais, deixaremos o primeiro campo com um valor "-" que indica que não foi selecionado nenhum estado.

var estados_1=new Array("-","Andalucía","Asturias","Baleares","Canarias","Castilla y León","Castilla-La Mancha","...")
var estados_2=new Array("-","Rio de Janeiro","Bahia","São Paulo","Santa Catarina","Minas Gerais","...")
var estados_3=new Array("-","Algarve","Alentejo","Norte","Vale do Tejo","...")
var estados_4=new Array("-","Aisne","Creuse","Dordogne","Essonne","Gironde ","...")


Observemos que os índices do array de cada país se correspondem com os do select do país. Por exemplo, a opção Espanha, tem o valor associado 1 e o array com os estados de Espanha se chama estados_1.

O script se completa com uma função que realiza o carregamento dos estados no segundo select. O mecanismo realiza basicamente estas ações:
  • Detecto o país que foi selecionado
  • Se o valor do país não for 0 (o valor 0 é quando não foi selecionado nenhum país)
    • Tomo o array de estados adequado, utilizando o índice do país.
    • Marco o número de opções que deve ter o select de estados
    • Para cada opção do select, coloco seu valor e texto associado, que faz corresponder com o indicado no array de estados.
  • SE NÃO (O valor de país é 0, não foi selecionado país)
    • Coloco no select de estado um único option com o valor "-", que significava que não havia estado.
  • Coloco a opção primeira do select de estado como o selecionado.
A função tem o seguinte código. Está comentado para que se entenda melhor.

function muda_estado(){
    //tomo o valor do select do pais escolhido
    var pais
    pais = document.f1.pais[document.f1.pais.selectedIndex].value
    /vejo se o pais está definido
    if (pais != 0) {
       //se estava definido, entao coloco as opcoes do estado correspondente.
       //seleciono o array de estado adequado
       meus_estados=eval("estados_" + pais)
       //calculo o numero de estados
       num_estados = meus_estados.length
       //marco o número de estados no select
       document.f1.estado.length = num_estados
       //para cada estado do array, o introduzo no select
       for(i=0;i<num_estados;i++){
          document.f1.estado.options[i].value=meus_estados[i]
          document.f1.provincia.options[i].text=meus_estados[i]
       }
    }else{
       //se não havia estado selecionado, elimino os estados do select
       document.f1.estado.length = 1
       //coloco um traço na única opção que deixei
       document.f1.estado.options[0].value = "-"
       document.f1.estado.options[0].text = "-"
    }
    //marco como selecionada a opção primeira de estado
    document.f1.estado.options[0].selected = true
}


Podemos ver uma página com o exemplo em funcionamento.





Comentários do artigo
Foram enviados 7 comentários ao artigo
4 comentários não revisados
3 comentários revisados:
Por: Ronaldo
09/11/06
Muito bom!
Elementos de formulários de Select
Por: casel
14/6/11
Gostei muito do artigo, mas existe alguma solução para que após sair desta página e ao voltar para a mesma, o campo do segundo select apresente as opções relacionadas ao primeiro select?
Como usar esse "combobox"?
Por: claisen
13/10/13
Gostei muito do artigo e dos comentários, porém, gostaria muito de saber como posso utilizar o resultado (estado) para "carregar" um mecanismo de busca com pontos turísticos deste estado do Banco de Dados Mysql?

Obrigado.

Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato