Ver Mensaje Individual
  #2 (permalink)  
Antiguo 11/08/2014, 10:56
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 9 meses
Puntos: 977
Respuesta: tercer Element

Te propongo otra manera:

Código Javascript:
Ver original
  1. var comboCont = document.getElementById("continente"),
  2.     comboPais = document.getElementById("pais"),
  3.     comboCiud = document.getElementById("ciudad"),
  4.     continentes = {
  5.         America: {
  6.             USA: ["San Francisco", "Seattle", "San Antonio"],
  7.             Perú: ["Lima", "Tacna", "Cusco"],
  8.             México: ["México D.F.", "Tijuana", "Guadalajara"]
  9.         },
  10.         Europa: {
  11.             España: ["Barcelona", "Valencia", "Madrid"],
  12.             Italia: ["Roma", "Venecia", "Milano"]
  13.         }
  14.     },
  15.     cambiaCiudad = function(contVal, paisVal){
  16.         var pais = continentes[contVal][paisVal];
  17.  
  18.         comboCiud.innerHTML = null;
  19.  
  20.         for (var j in pais){
  21.             var opt = document.createElement("option");
  22.             opt.value = pais[j];
  23.             opt.innerHTML = pais[j];
  24.             comboCiud.appendChild(opt);
  25.         }
  26.     },
  27.     cambiaPais = function(contVal){
  28.         var cont = continentes[contVal];
  29.  
  30.         comboPais.innerHTML = null;
  31.  
  32.         for (var i in cont){
  33.             var opt = document.createElement("option");
  34.             opt.value = i;
  35.             opt.innerHTML = i;
  36.             comboPais.appendChild(opt);
  37.         }
  38.      
  39.         cambiaCiudad(contVal, comboPais.value);
  40.     };
  41.  
  42. comboCont.addEventListener("change", function(){
  43.     cambiaPais(this.value);
  44. }, false);
  45. comboPais.addEventListener("change", function(){
  46.     cambiaCiudad(comboCont.value, this.value);
  47. }, false);
  48.  
  49. cambiaPais(comboCont.value);

Ahora, la explicación. Primero, tomo a los tres combos que debo de tener en el documento, siendo cada uno en donde irán los continentes, países y ciudades, respectivamente. Luego, creo un objeto literal en donde irán los continentes, teniendo cada uno de ellos un objeto literal con los países respectivos y estos, un array con las ciudades que les correspondan. Cuando elijamos una opción del combo de los continentes, ejecutaremos la función cambiaPais, a la cual le pasaremos como argumento el valor del combo de los continentes. En dicha función, tomamos al continente equivalente al valor seleccionado en el combo de los continentes, dejamos en blanco al combo de los países (por si hubieron valores previamente) y lo llenamos con los países que posee el continente equivalente a la opción seleccionada en el combo de los continentes. Enseguida, ejecutamos la función cambiaCiudad, a la cual le pasamos el valor seleccionado en el combo de los continentes y el valor actual del combo de los países, que como acaba de ser cargado, será el primero de la lista.

En dicha función, tomamos al país equivalente a la opción seleccionada en el combo de los países (que al haber cargado recientemente, será el primero de la lista), dejo en blanco al combo de las ciudades (por si hubieron valores previamente) y procedo a llenarlo con las ciudades albergadas en el array del país equivalente a la opción seleccionada (o por defecto) del combo de los países.

Para que desde el inicio se realice el llenado de los combos de los países y ciudades, ejecutamos a la función cambiaPais que es la que desencadenará el resto de acciones.



No olvides colocar este código justo antes de la etiqueta </body> para que todo surta efecto, pues si lo colocaras en la cabecera (<head>), primero cargaría el código JS y luego los elementos del DOM, con lo cual estos últimos nunca se verían afectados.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand