Escrito por Mauro Rondinelli el Viernes 01 de Junio de 2001 a las 00:00hs
Hoy trataremos un problema que varias veces se nos presenta, las famosas listas dependientes, ¿que es esto?, tenemos dos listas, una lista con varios items y la otra con los items que corresponden al item seleccionado en la primer lista. ¿Que Lio?...Bueno para hacerlo mas grafico veamos primero el resultado y luego explicare como llegamos a esto.
Fijate que si seleccionas un trimestre, la lista de meses se modifica mostrando los meses que corresponden al trimestre seleccionado.
Lo primero que hacemos es construir las dos listas con los elementos correspondientes, la lista de los meses la llenamos con la primer opcion que es la del primero trimestre dado que cuando carge la pagina esta opcion esta seleccionada por defecto.
<form name="formulario" method="post" action="">
<div align="center">Trimestre
<select name="trimestres" OnChange="cambiar()">
<option value="1er. Trimestre" selected>1er. Trimestre</option>
<option value="2do. Trimestre">2er. Trimestre</option>
<option value="3er. Trimestre">3er. Trimestre</option>
<option value="4to. Trimestre">4to. Trimestre</option>
</select>
Meses
<select name="meses">
<option value="Enero" selected>Enero</option>
<option value="Febrero">Febrero</option>
<option value="Marzo">Marzo</option>
</select>
</div>
</form>
Cabe destacar de este codigo que debemos respetar los nombres de los objetos dado que sino el JavaScript no funcionara, otra cosa a destacar es la declaracion del evento 'OnChange' de la lista de trimestres, esta declaracion hace que cada ves que cambie el elemento seleccionado se ejecute la funcion de JavaScript llamada 'cambiar()', veamos ahora que contiene esta funcion...
function cambiar()
{
var index=document.forms.formulario.trimestres.selectedIndex;
formulario.meses.length=0;
if(index==0) trimestre1();
if(index==1) trimestre2();
if(index==2) trimestre3();
if(index==3) trimestre4();
}
Esta y las demas funciones JavaScript van entre las etiquetas llamadas 'script' y las podemos ubicar en cualquier sector de la pagina, pero lo mas apropiado es ponerlas dentro de las etiquetas 'head'.
<script language="JavaScript">
function cambiar()
.
.
.
</script>
Bueno, ahora si comentemos el codigo anterior, la primr linea de codigo declara la variable llamada 'index' y a su ves le asigna el valor del elemento seleccionado en la lista trimestres, el valor 0 corresponde al primer trimestre, el 1 al segundo y asi hasta el 3 que corresponde al ultimo trimestre es decir el cuarto. Despues la segunda linea de codigo asigna 0 al la propiedad length de la lista meses, esta propiedad maneja el numero de elementos que tiene esa lista, a ponerla a cero se borran todos los elementos de la lista meses. Luego siguen un grupo de if que evaluan la variable 'index', si esta es igual a cero va a la funcion 'trimestre1()', si es 1 va a la funcion 'trimestre2()' y si sucesivamente, ahora ¿que hacen esta funciones? simple, llenan la lista de meses por ejemplo 'trimestre1()' llena la lista meses con los primeros tres meses del año, veamos como...
function trimestre1(){
opcion0=new Option("Enero","Enero","defauldSelected");
opcion1=new Option("Febrero","Febrero");
opcion2=new Option("Marzo","Marzo");
document.forms.formulario.meses.options[0]=opcion0;
document.forms.formulario.meses.options[1]=opcion1;
document.forms.formulario.meses.options[2]=opcion2;
}
Aqui creamos 3 variables a las cuales les asignamos el objeto 'Option' creado mediante la palabra clave 'new', para crear un objeto del tipo 'Option' debemos especificar como minimo 2 parametros, el primero es el texto que aparecera en la lista y el segundo es el 'listvalue' que tendra dicho elemento. Tambie existe un tercer parametro opcional que sirve para especificar si el elemento esta seleccionado,si queremos que esto sea asi debemos poner el tercer parametro con el valor 'defauldSelected'.
Despues de crear los objetos 'Option' debemos asignarselos a la lista de los meses. Las demas funciones son iguales a esta lo unico que cambia son los valores de los meses, igual aca va el codigo de las otras funciones...
function trimestre2(){
opcion0=new Option("Abril","Abril","defauldSelected");
opcion1=new Option("Mayo","Mayo");
opcion2=new Option("Junio","Junio");
document.forms.formulario.meses.options[0]=opcion0;
document.forms.formulario.meses.options[1]=opcion1;
document.forms.formulario.meses.options[2]=opcion2;
}
function trimestre3(){
opcion0=new Option("Julio","Julio","defauldSelected");
opcion1=new Option("Agosto","Agosto");
opcion2=new Option("Septiembre","Septiembre");
document.forms.formulario.meses.options[0]=opcion0;
document.forms.formulario.meses.options[1]=opcion1;
document.forms.formulario.meses.options[2]=opcion2;
}
function trimestre4(){
opcion0=new Option("Octubre","Octubre","defauldSelected");
opcion1=new Option("Noviembre","Noviembre");
opcion2=new Option("Diciembre","Diciembre");
document.forms.formulario.meses.options[0]=opcion0;
document.forms.formulario.meses.options[1]=opcion1;
document.forms.formulario.meses.options[2]=opcion2;
}
Bueno espero que les sea util.
El tema es que no funciona en Mozilla Firefox
si, cierto, en el firefox no funciona, no reconoce el nombre del formulario
les encvontre la solucion para que funcione en mozilla y en IE y en los demas, ya que en el trabajo intetnte usarlo y con sacar la linea "formulario.meses.length=0;" andaba en ambos pero cuando elegias un "mes" con mas items que los demas cuando volvias a uno con menos dejaba opciones del anterior.
la solucion es agregarle a esa linea "forms.", de esta forma no tira el error de que no esta definido... la linea quedaria "forms.formulario.meses.length=0;"
Espero que les sirva... Exitos!
perdon... tambien le falta el "document.", osea, para que funcione de verdad tiene que quedar "document.forms.formulario.meses.length=0;"
exitos!
Pero si le deseo poner algun enlace a los resultados de la segunda casilla, como podria hacer?, el codigo puede ser reproducido en firefox solamente cambiando // "formulario.meses.length=0;" // por // "forms.formulario.meses.length=0;" // weno a mi me funciono al probarlo asi, el numero de opciones agradablemente no tiene restricciones; solo me encontre con esta duda, encontre una posible soluciòn pero no quiero cambiar este codigo por otro...
Muchas gracias por el mini tutorial. Está perfectamente explicado.
Y para que funcione en Firefox, como dice fedex tan solo hay que cambiar la instrucción...
formulario.meses.length=0;
que hay dentro de la funcion cambiar() por esta otra...
document.forms.formulario.meses.length=0;"
Saludos !!
Hola me gusta ese codigo pero yo necesito uno mismo pero en php para que pueda guardarlo en mi base de datos, estaria padre en php.