Foros del Web » Programando para Internet » Javascript »

select asociados

Estas en el tema de select asociados en el foro de Javascript en Foros del Web. hola a todos, tengo un problema el cual espero su ayuda. Tengo un formulario en el cual e añadido tres select: Departamento, provincia y distrito ...
  #1 (permalink)  
Antiguo 07/06/2007, 16:49
Avatar de franklin85  
Fecha de Ingreso: octubre-2006
Mensajes: 103
Antigüedad: 18 años, 2 meses
Puntos: 0
select asociados

hola a todos, tengo un problema el cual espero su ayuda.
Tengo un formulario en el cual e añadido tres select:
Departamento, provincia y distrito
Lo que necesito es que al seleccionar un departamento se activen las provincias de dicho departamento, luego al estar activadas las provincias selecciono una y se activan sus distritos. Como lo puedo hacer
Ejemplo: En este caso seleccione el departamento de lima el cual me arrojo sus provincias que son: lima, callao, barranca; y al seleccionar la provincia de lima me aparecion sus distritos como breña, independencia, los olivos.
(dept) lima, arequipa, lambayeque
(prov) lima, callao, barranca
(dists) breña, independencia, los olivos

De antemano les agradesco de a todos por su ayuda.
  #2 (permalink)  
Antiguo 07/06/2007, 17:16
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: select asociados

De hecho yo hice esos tres selects dependientes entre sí, y además se puede seleccionar directamente (en tu caso) un distrito y se te autoseleccionan la provincia y el departamento. A ver si te convence. El código es largo, pero el script está muy comentado y probado.

SELECTS dependientes con inteligencia hacia atrás. La versión que funciona correctamente es la última.


Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 08/06/2007, 13:48
Avatar de franklin85  
Fecha de Ingreso: octubre-2006
Mensajes: 103
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: select asociados

hola derkenuke he probado tu ejemplo y si funciona todo ok, pero tengo una pequeña pregunta de que forma lo agrego a my formulario ya que tu creas los select en el javascripts, te paso el codg de my formulario para que veas de que forma lo estoy realizando, okis.
Otra cosa tambien cuando cargo el formulario de que forma hago para que el primer select aparesca en blanco o colocar un texto como "Seleccione su Departamento" (en el caso de los 3 select) y despues de eso ya colocar todas los departamento dados. Ojo que tiene que estar validado.

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head><title>Prueba de Formulario</title>
<
link rel="STYLESHEET" type="text/css" href="estilos.css">

<
SCRIPT language="javascript">
<!--

function 
CambiaPag(pagina)
{
        if ( 
pagina != "" )
        {       
window.top.location.href=pagina;
        }
}


function 
validar()
{

  if (
document.m.nombres.value=="")
    {
     
alert('Ingrese un nombre valido');
     
document.m.nombres.focus();
     return ;
    }
  else
    {
     if (!
isNaN(document.m.nombres.value))
      {
      
alert("Solo se admiten letras");
      
document.m.nombres.value="";
      
document.m.nombres.focus();
      return;
      }
    }

  if (
document.m.dni.value=="")
    {
     
alert('Ingrese su numero de documento correctamente');
     
document.m.dni.focus();
     return ;
    }
  else
    {
     if (
isNaN(document.m.dni.value))
      {
       
alert("Solo se admiten numeros");
       
document.m.dni.value="";
       
document.m.dni.focus();
       return;
      }
    }

  if (
document.m.domicilio.value=="")
    {
     
alert('Ingrese su domicilio correctamente');
     
document.m.domicilio.focus();
     return ;
    }

    
//Aqui agregar la validacion de los select (departamento, provincia, distrito)
    //obligar al usuario a seleccionar los 3 select

   
if (document.m.telefono.value=="")
       {
        
alert('Ingresar telefono');
        
document.m.telefono.focus();
        return ;
    }
   else
    {
     if (
isNaN(document.m.telefono.value))
      {
       
alert("Solo se admiten numeros");
       
document.m.telefono.value="";
       
document.m.telefono.focus();
       return;
      }
    }

   if (
document.m.email.value=="")
    {
     
alert("Ingrese su email correctamente");
     
document.m.email.focus();
     return;
    }
   else
    {
      if (
document.m.email.value.indexOf("@",0)==-1)
       {
        
alert("Email invalido falta @");
        
document.m.email.focus();
        return;
       }
      if (
document.m.email.value.indexOf(".",0)==-1)
       {
        
alert("Email invalido falta el punto");
        
document.m.email.focus();
        return;
       }
    }


      
document.m.submit();
 }
//-->
</script>

</head>
<body>
<center>

<form name="m" method="POST" action="procesa.php">

<table width="459" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="189"><font class="registro">Nombres</font></td>
<td width="270"><input type="text" name="nombres" value="" size="31"></td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Sexo</font></td>
<td width="270">
    <table width="270" cellspacing="0" cellpadding="0" border="0">
    <tr>
    <td width="54" align="right"><font class="registro">Masculino&nbsp;</font></td>
    <td width="53"><input type="RADIO" name="sexo" value="masculino" checked></td>
    <td width="82" align="right"><font class="registro">Femenino</font></td>
    <td width="81"><input type ="RADIO" name="sexo" value="femenino"></td>
    </tr>
    </table>
</td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Fecha de Nacimiento</font></td>
<td width="270">
<select name="dia">
<option value="" selected>D&iacute;a</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<select name="mes">
<option value="" selected>Mes</option>
<option value="enero">Enero</option>
<option value="febrero">Febrero</option>
<option value="marzo">Marzo</option>
<option value="abril">Abril</option>
<option value="mayo">Mayo</option>
</select>
<select name="ano">
<option value="" selected>A&ntilde;o</option>
<option value="1940">1940</option>
<option value="1941">1941</option>
<option value="1942">1942</option>
<option value="1943">1943</option>
<option value="1944">1944</option>
<option value="1945">1945</option>
</select>
</td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Estado Civil</font></td>
<td width="270">
<select name="estadocivil">
<option value="Soltero" selected>Soltero (a)</option>
<option value="Casado">Casado (a)</option>
<option value="Viudo">Viudo (a)</option>
<option value="Divorciado">Divorciado (a)</option>
</select>
</td>
</tr>
<tr><td height="8"></td></tr>
<tr>
<td width="189"><font class="registro">N&uacute;mero de DNI</font></td>
<td width="270"><input type="text" name="dni" value="" size="17"></td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Domicilio</font></td>
<td width="270"><input type = "text" name="domicilio" value="" size="31" style="width:220px;height:18px;font-size:10pt;font-family:arial;font-weight:normal; color:000000;border-width:1;border-style:solid;border-color:CCCDCF"></td>
</tr>
<tr><td height="5"></td></tr>
    <tr>
    <td width="189"><font class="registro">Departamento</font></td>
    <td width="230">
        <select name="departamento">
        <option value="Seleccione un Departamento">Seleccione un Departamento
        <option value="ancash">Ancash</option>
        <option value="apurimac">Apurimac</option>
        <option value="arequipa">Arequipa</option>
        </select>
    </td>
    </tr>
    <tr><td height="5"></td></tr>
    <tr>
    <td width="189"><font class="registro">Provincia</font></td>
    <td width="230">
        <select name="provincia">
        <option value="Seleccione un Provincia">Seleccione una Provincia
        </select>
    </td>
    </tr>
    <tr><td height="5"></td></tr>
    <tr>
    <td width="189"><font class="registro">Distrito</font></td>
    <td width="230">
        <select name="provincia">
        <option value="Seleccione un Distrito">Seleccione un Distrito
        </select>
    </td>
    </tr>
    <tr><td height="5"></td></tr>

<tr>
<td width="189"><font class="registro">Tel&eacute;fono</font></td>
<td width="270"><input type = "text" name="telefono" value="" size="31"></td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">e-mail</font></td>
<td width="270"><input type = "text" name="email" value="" size="31"></td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Actividad</font></td>
<td width="270">
<select name="actividad">
<option value="Independiente">Independiente</option>
<option value="Dependiente">Dependiente</option>
<option value="Estudiante">Estudiante</option>
<option value="Sin actividad">Sin activad</option>
</select>
</td>
</tr>
</table>


<table width="459" cellspacing="0" cellpadding="0" border="0">
<tr><td height="10"></td></tr>
<tr>
<td width="189">&nbsp;</td>
<td width="100"><input type="button" value="Enviar" onClick="validar()" name="button"></td>
<td width="20">&nbsp;</td>
<td width="100"><input type="reset" value="Cancelar" name="reset"></td>
<td width="50">&nbsp;</td>
</tr>
</table>
<br>
</form>

</center>
</body>
</html> 
Tambien e notado que cuando carga el formulario en el tercer combo aparece todas las ciudades del primer select que sale primero, como haria para solo mostrar sus ciudades correspondientes.
Como he probado con el codigo:
Aca aparece lo siguiente:
1 select Ancash (paises)
2 select Aija (provincias)
3 select Aija (ciudades) (correspondiente al 2 select), pero tambien muestra las ciudades del 2 select (del select provincias)
  #4 (permalink)  
Antiguo 08/06/2007, 20:44
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: select asociados

Para cambiar el sript con las modificaciones que me comentas... habría que cambiar toda la programación... y no creo que te veas con ganas.

Cita:
Iniciado por franklin85
Otra cosa tambien cuando cargo el formulario de que forma hago para que el primer select aparesca en blanco o colocar un texto como "Seleccione su Departamento" (en el caso de los 3 select) y despues de eso ya colocar todas los departamento dados.
Para eso la primera opción ya no cuenta, con lo cual todos los cálculos de dónde están las options se me van al garete.

Cita:
Iniciado por franklin85
Tambien e notado que cuando carga el formulario en el tercer combo aparece todas las ciudades del primer select que sale primero, como haria para solo mostrar sus ciudades correspondientes.
Cuando se carga, de hecho, aparecen todas las ciudades. De otra manera no podría seleccionarse cualquiera de ellas, y el script no tendría la propiedad de ser "inteligente hacia atrás" (es decir, seleccionando una ciudad, se escogen automáticamente país y provincia).

Para tener tus selects en HTML y no tener que crearlos con javascript, cómete la parte de
Código PHP:
//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT"); 
y la de adjuntado
Código PHP:
//adjuntamos al documento
document.body.appendChild(selPais);
document.body.appendChild(selProv);
document.body.appendChild(selCiud); 
En su lugar selPais, selProv y selCiud serán referencias a los selects HTML. Puedes conseguirlas colocandoles un id, y referenciándolas con getElementsById() por ejemplo.



Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 11/06/2007, 15:36
Avatar de franklin85  
Fecha de Ingreso: octubre-2006
Mensajes: 103
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: select asociados

haber si te entiendo: seria algo así:
Código PHP:
//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT"); 
elimino esta parte del codigo y en ves de esa coloco el html con id, algo asi o me equivoco(disculpa pero no entiendo el lenguaje javascripts)
Código HTML:
<table width="409" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="189"><font class="registro">Departamento</font></td>
<td width="220">
<select name="departamento" id="depa">
</select>
</td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Provincia</font></td>
<td width="220">
<select name="provincia" id="provi">
</select>
</td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Distrito</font></td>
<td width="220">
<select name="distrito" id="ciud">
</select>
</td>
</tr>
</table> 
y con en vez de esto lo referenciamos
Código PHP:
//adjuntamos al documento
document.body.getElementsById(depa);
document.body.getElementsById(provi);
document.body.getElementsById(ciud); 
Por favor te agradesco mucho tu ayuda.
  #6 (permalink)  
Antiguo 12/06/2007, 01:55
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: select asociados

Casi casi:

En vez de
Código PHP:
//Creamos los SELECTS
var selPais=document.createElement("SELECT");
var 
selProv=document.createElement("SELECT");
var 
selCiud=document.createElement("SELECT"); 
Debes poner las referencias con los mismos nombres de variable:
Código PHP:
//referenciamos a los elementos del documento
var selPais=document.body.getElementsById(depa);
var 
selProv=document.body.getElementsById(provi);
var 
selCiud=document.body.getElementsById(ciud); 
Y además de eso eliminar las líneas:
Código PHP:
//adjuntamos al documento
document.body.appendChild(selPais);
document.body.appendChild(selProv);
document.body.appendChild(selCiud); 

Pon todo el código al final de tu página para asegurar que los elementos HTML están disponibles para el script.


Así debería funcionar. Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 12/06/2007, 11:33
Avatar de franklin85  
Fecha de Ingreso: octubre-2006
Mensajes: 103
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: select asociados

Hola derkenuke he realizado tus indicaciones pero hay un problema me vota un error el cual dice que
Código PHP:
var selPais=document.m.getElementsById(depa); 
no a sido declarada
He reducido my codigo lo importante es que salga lo de los select asociados lo voy a colocar para que lo mires y me digas cual es el error:
Código HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>SELECTs depedientes con inteligencia hacia atrás</title>
</head>
<body>

<form name="m" method="post" action="procesa.php">

<table width="409" cellspacing="0" cellpadding="0" border="0">
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Departamento</font></td>
<td width="220">
	<select name="departamento" id="depa" style="width:220px;height:18px;font-size:12px;font-family:Arial, Tahoma, Helvetica;font-weight:normal;color:000000;border-width:1;border-style:solid;border-color:CCCDCF">
	</select>
</td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Provincia</font></td>
<td width="220">
	<select name="provincia" id="provi" style="width:220px;height:18px;font-size:12px;font-family:Arial, Tahoma, Helvetica;font-weight:normal;color:000000;border-width:1;border-style:solid;border-color:CCCDCF">
	</select>
</td>
</tr>
<tr><td height="5"></td></tr>
<tr>
<td width="189"><font class="registro">Distrito</font></td>
<td width="220">
	<select name="distrito" id="ciud" style="width:220px;height:18px;font-size:12px;font-family:Arial, Tahoma, Helvetica;font-weight:normal;color:000000;border-width:1;border-style:solid;border-color:CCCDCF">
	</select>
</td>
</tr>
</table>

</form>

<script>

/****************************************************************
    ESTRUCTURA BÁSICA
****************************************************************/
var paises=["Ancash","Arequipa","Apurimac"];
var provincias=[
    ["Aija (p1)","Antonio Raimondi (p1)",  "Asunción (p1)", "Bolognesi (p1)"],
    ["Arequipa (p2)", "Camaná (p2)", "Caravelí (p2)", "Castilla (p2)", "Caylloma (p2)", "Condesuyos (p2)" , "Islay (p2)", "La Unión (p2)"],
    ["Abancay (p3)", "Antabamba (p3)", "Aymaraes (p3)", "Cotabambas (p3)", "Grau (p3)", "Chincheros (p3)", "Andahuaylas (p3)"]
];
var ciudades=[
    [
        ["Aija-1-1", "Coris-1-2", "Huacllán-1-3", "La Merced-1-4", "Succha-1-5" ],
        ["Llamellín-2-1", "Aczo-2-2", "Chaccho-2-3", "Chingas-2-4", "Mirgas-2-5", "San Juan de Rontoy-2-6", ],
        ["ciud1-3-1", "ciud1-3-2", "ciud1-3-3", "ciud1-3-4" ],
        ["ciud1-4-1", "ciud1-4-2", "ciud1-4-3" ]
    ],

    [
        ["ciud2-1-1", "ciud2-1-2", "ciud2-1-3", "ciud2-1-4", "ciud2-1-5", "ciud2-1-6", "ciud2-1-7", "ciud2-1-8" ],
        ["ciud2-2-1", "ciud2-2-2", "ciud2-2-3", "ciud2-2-4", "ciud2-2-5", "ciud2-2-6" ],
        ["ciud2-3-1", "ciud2-3-2", "ciud2-3-3", "ciud2-3-4", "ciud2-3-5", "ciud2-3-6" ],
        ["ciud2-4-1", "ciud2-4-2", "ciud2-4-3", "ciud2-4-4", "ciud2-4-5", "ciud2-4-6", "ciud2-4-7" ],
        ["ciud2-5-1", "ciud2-5-2", "ciud2-5-3", "ciud2-5-4", "ciud2-5-5" ],
        ["ciud2-6-1", "ciud2-6-2", "ciud2-6-3", "ciud2-6-4", "ciud2-6-5" ]
    ],

    [
        ["ciud3-1-1", "ciud3-1-2", "ciud3-1-3", "ciud3-1-4", "ciud3-1-5", "ciud3-1-6", "ciud3-1-7", "ciud3-1-8" ],
        ["ciud3-2-1", "ciud3-2-2", "ciud3-2-3" ],
        ["ciud3-3-1", "ciud3-3-2", "ciud3-3-3", "ciud3-3-4" ]
    ]
];


/****************************************************************
    FUNCIONES ÚTILES PARA ARRAYS Y SELECTS
****************************************************************/

//agrega un option a un select, con un par de atributos extra que nos serán útiles
function agregarOpt(elSel,txt,valor,suPais,suProvincia,contieneProvincias,contieneCiudades) {
    var indice=elSel.options.length;
    elSel.options[ indice ] = new Option(txt,valor);
    elSel.options[ indice ].suPais=suPais;
    elSel.options[ indice ].suProvincia=suProvincia;
    elSel.options[ indice ].contieneProvincias=contieneProvincias;
    elSel.options[ indice ].contieneCiudades=contieneCiudades;
}

//selecciona la opción iPos en el select elSelect
function selecciona(elSelect,iPos) {
    elSelect.options[iPos].selected="selected";        // para los estándares
    elSelect.options.selectedIndex=iPos;            // a la manera IE
}

//devuelve true si el elemento elem se encuentra entre los elementos del array
Array.prototype.existe=function(elem) {
    for(var i=0;i<this.length;i++)
        if( this[i] == elem ) return true;
    return false;
}

//borra todas las opciones de un select cuyo valor no se encuentre entre los elementos de elArray
function dejarOpcionesExistentes(elSelect,elArray) {
    for(var i=0; i<elSelect.options.length; i++) {
        if( !elArray.existe( elSelect.options[i].value ) ) {
            //borramos la opcion
            elSelect.options[i]=null;
            i--;    //reducimos i porque tenemos que iterar más veces (el length de las options es uno menos)
        }
    }
}

/****************************************************************
    CREACIÓN Y RELLENADO DE LOS SELECTS
****************************************************************/

//Creamos los SELECTS
var selPais=document.m.getElementsById(depa);
var selProv=document.m.getElementsById(provi);
var selCiud=document.m.getElementsById(ciud);


//la función coloca en los selects creados todos los valores de los arrays, pudiendo salvar el select que se indique en los argumentos
function reiniciar_selects(conPaises,conProvincias,ConCiudades) {
    if (conPaises==undefined || conPaises)
        haCambiadoPais=false;
    //eliminamos las option de los selects que procedan
    while( (conPaises==undefined || conPaises) && selPais.options.length>0 )
        selPais.options[0]=null;
    while( (conProvincias==undefined || conProvincias) && selProv.options.length>0 )
        selProv.options[0]=null;
    while( (ConCiudades==undefined || ConCiudades) && selCiud.options.length>0 )
        selCiud.options[0]=null;
    //colocamos las opciones nuevas si procede
    for(var i=0; i<paises.length; i++) {
        if(conPaises==undefined || conPaises )
            agregarOpt(selPais, paises[i], paises[i], null, null, provincias[i].toString().split(","), ciudades[i].toString().split(",") );
        for(var j=0; j<provincias[i].length; j++) {
            if(conProvincias==undefined || conProvincias )
                agregarOpt(selProv, provincias[i][j], provincias[i][j], i, null, null, ciudades[i][j].toString().split(",") );
            for(k=0; k<ciudades[i][j].length; k++) {
                if(ConCiudades==undefined || ConCiudades ) {
                    //cuenta regresiva para contar todas las provincias anteriores (cuantas provincias habia en los paises anteriores)
                    var aux=i-1, provinciasAnteriores=0;
                    while(aux>=0)
                        provinciasAnteriores+=provincias[aux--].length;
                    agregarOpt(selCiud, ciudades[i][j][k], ciudades[i][j][k], i, provinciasAnteriores+";"+j, null, null);
                }
            }
        }
    }
}

var haCambiadoPais=false;        //elemento de control para contar las provincias al cambiar de ciudad
reiniciar_selects(true,true,true);        //todos los valores en todos los selects


/****************************************************************
    EVENTOS ONCHANGE PARA CADA UNO DE LOS SELECTS
****************************************************************/
selPais.onchange=function() {
    //restablecemos provincias, ciudades
    reiniciar_selects(false,true,true);
    //cambiar provincias para que sólo contengan .contieneProvincias
    var contieneProvincias=this.options[this.options.selectedIndex].contieneProvincias;
    dejarOpcionesExistentes(selProv,contieneProvincias);
    //cambiar ciudades para que sólo contengan .contieneCiudades
    var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    dejarOpcionesExistentes(selCiud,contieneCiudades);
    haCambiadoPais=true;
}
selProv.onchange=function() {
    //restablecemos sólo ciudades
    reiniciar_selects(false,false,true);
    //seleccionar el pais al que pertenece la provincia
    var suPais=this.options[this.options.selectedIndex].suPais;
    selecciona(selPais,suPais);
    //cambiar ciudades para que sólo contengan .contieneCiudades
    var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selCiud.onchange=function() {
    //seleccionar el pais al que pertenece la ciudad
    var suPais=this.options[this.options.selectedIndex].suPais;
    selecciona(selPais,suPais);
    //seleccionar la provincia a la que pertenece la ciudad
    var suProvincia=this.options[this.options.selectedIndex].suProvincia;
    if(!haCambiadoPais) suProvincia=eval( suProvincia.replace(";","+") );        //suma de las provincias de los anteriores paises más la suya
    else suProvincia=suProvincia.split(";")[1];                                    //sólo la suya
    selecciona(selProv,suProvincia);
}

//creamos un botón por si acaso se necesita restablecer todo:
var boton=document.createElement("INPUT");
with(boton) {
    type="button", value="Restablecer";
    setAttribute("onclick","reiniciar_selects(true,true,true)");        // estándar
    boton.onclick=reiniciar_selects;                                    // IE
}
document.m.appendChild(boton);


</script>


</body>
</html> 
gracias por tu ayuda.
  #8 (permalink)  
Antiguo 12/06/2007, 13:30
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: select asociados

Olvida mi mensaje anterior... no sé en qué estaba pensando...

Bueno, este sería tu código final con los selects ya preparados. Sólo te queda rellenar los arrays a tu gusto:

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
title>SELECTs depedientes con inteligencia hacia atr&#225;s</title>
</head>
<
body>

<
form name="m" method="post" action="procesa.php">

<
table width="409" cellspacing="0" cellpadding="0" border="0">
<
tr><td height="5"></td></tr>
<
tr>
<
td width="189"><font class="registro">Departamento</font></td>
<
td width="220">
    <
select name="departamento" id="depa" style="width:220px;height:18px;font-size:12px;font-family:Arial, Tahoma, Helvetica;font-weight:normal;color:000000;border-width:1;border-style:solid;border-color:CCCDCF">
    </
select>
</
td>
</
tr>
<
tr><td height="5"></td></tr>
<
tr>
<
td width="189"><font class="registro">Provincia</font></td>
<
td width="220">
    <
select name="provincia" id="provi" style="width:220px;height:18px;font-size:12px;font-family:Arial, Tahoma, Helvetica;font-weight:normal;color:000000;border-width:1;border-style:solid;border-color:CCCDCF">
    </
select>
</
td>
</
tr>
<
tr><td height="5"></td></tr>
<
tr>
<
td width="189"><font class="registro">Distrito</font></td>
<
td width="220">
    <
select name="distrito" id="ciud" style="width:220px;height:18px;font-size:12px;font-family:Arial, Tahoma, Helvetica;font-weight:normal;color:000000;border-width:1;border-style:solid;border-color:CCCDCF">
    </
select>
</
td>
</
tr>
<
tr>
<
td colspan="2"> <input type="button" value="restablecer" onclick="reiniciar_selects(true,true,true)" /> </td>
</
tr>
</
table>

</
form>

<
script>

/****************************************************************
    ESTRUCTURA BÁSICA
****************************************************************/
var paises=["PAIS1","PAIS2","PAIS3"];
var 
provincias=[
    [
"PROVINCIA1 (p1)","PROVINCIA2 (p1)",  "PROVINCIA3 (p1)""PROVINCIA4 (p1)"], 
    [
"PROVINCIA1 (p2)""PROVINCIA2 (p2)""PROVINCIA3 (p2)""PROVINCIA4 (p2)""PROVINCIA5 (p2)""PROVINCIA6 (p2)"], 
    [
"PROVINCIA1 (p3)""PROVINCIA2 (p3)""PROVINCIA3 (p3)" ]
];
var 
ciudades=[
    [
        [
"ciud1-1-1""ciud1-1-2""ciud1-1-3""ciud1-1-4""ciud1-1-5" ],
        [
"ciud1-2-1""ciud1-2-2""ciud1-2-3""ciud1-2-4" ],
        [
"ciud1-3-1""ciud1-3-2""ciud1-3-3""ciud1-3-4" ],
        [
"ciud1-4-1""ciud1-4-2""ciud1-4-3" ]
    ],
    
    [
        [
"ciud2-1-1""ciud2-1-2""ciud2-1-3""ciud2-1-4""ciud2-1-5""ciud2-1-6""ciud2-1-7""ciud2-1-8" ],
        [
"ciud2-2-1""ciud2-2-2""ciud2-2-3""ciud2-2-4""ciud2-2-5""ciud2-2-6" ],
        [
"ciud2-3-1""ciud2-3-2""ciud2-3-3""ciud2-3-4""ciud2-3-5""ciud2-3-6" ],
        [
"ciud2-4-1""ciud2-4-2""ciud2-4-3""ciud2-4-4""ciud2-4-5""ciud2-4-6""ciud2-4-7" ],
        [
"ciud2-5-1""ciud2-5-2""ciud2-5-3""ciud2-5-4""ciud2-5-5" ],
        [
"ciud2-6-1""ciud2-6-2""ciud2-6-3""ciud2-6-4""ciud2-6-5" ]
    ],
    
    [
        [
"ciud3-1-1""ciud3-1-2""ciud3-1-3""ciud3-1-4""ciud3-1-5""ciud3-1-6""ciud3-1-7""ciud3-1-8" ],
        [
"ciud3-2-1""ciud3-2-2""ciud3-2-3" ],
        [
"ciud3-3-1""ciud3-3-2""ciud3-3-3""ciud3-3-4" ]
    ]
];


/****************************************************************
    FUNCIONES ÚTILES PARA ARRAYS Y SELECTS
****************************************************************/

//agrega un option a un select, con un par de atributos extra que nos serán útiles
function agregarOpt(elSel,txt,valor,suPais,suProvincia,contieneProvincias,contieneCiudades) {
    var 
indice=elSel.options.length;
    
elSel.optionsindice ] = new Option(txt,valor);
    
elSel.optionsindice ].suPais=suPais;
    
elSel.optionsindice ].suProvincia=suProvincia;
    
elSel.optionsindice ].contieneProvincias=contieneProvincias;
    
elSel.optionsindice ].contieneCiudades=contieneCiudades;
}

//selecciona la opción iPos en el select elSelect
function selecciona(elSelect,iPos) {
    
elSelect.options[iPos].selected="selected";        // para los estándares
    
elSelect.options.selectedIndex=iPos;            // a la manera IE
}

//devuelve true si el elemento elem se encuentra entre los elementos del array
Array.prototype.existe=function(elem) {
    for(var 
i=0;i<this.length;i++)
        if( 
this[i] == elem ) return true;
    return 
false;
}

//borra todas las opciones de un select cuyo valor no se encuentre entre los elementos de elArray
function dejarOpcionesExistentes(elSelect,elArray) {
    for(var 
i=0i<elSelect.options.lengthi++) {
        if( !
elArray.existeelSelect.options[i].value ) ) {
            
//borramos la opcion
            
elSelect.options[i]=null;
            
i--;    //reducimos i porque tenemos que iterar más veces (el length de las options es uno menos)
        
}
    }
}

/****************************************************************
    CREACIÓN Y RELLENADO DE LOS SELECTS
****************************************************************/

//referenciamos los SELECTS
var selPais=document.getElementById("depa");
var 
selProv=document.getElementById("provi");
var 
selCiud=document.getElementById("ciud");



//la función coloca en los selects creados todos los valores de los arrays, pudiendo salvar el select que se indique en los argumentos
function reiniciar_selects(conPaises,conProvincias,ConCiudades) {
    if (
conPaises==undefined || conPaises)
        
haCambiadoPais=false;
    
//eliminamos las option de los selects que procedan
    
while( (conPaises==undefined || conPaises) && selPais.options.length>)
        
selPais.options[0]=null;
    while( (
conProvincias==undefined || conProvincias) && selProv.options.length>)
        
selProv.options[0]=null;
    while( (
ConCiudades==undefined || ConCiudades) && selCiud.options.length>)
        
selCiud.options[0]=null;
    
//colocamos las opciones nuevas si procede
    
for(var i=0i<paises.lengthi++) {
        if(
conPaises==undefined || conPaises )
            
agregarOpt(selPaispaises[i], paises[i], nullnullprovincias[i].toString().split(","), ciudades[i].toString().split(",") );
        for(var 
j=0j<provincias[i].lengthj++) {
            if(
conProvincias==undefined || conProvincias )
                
agregarOpt(selProvprovincias[i][j], provincias[i][j], inullnullciudades[i][j].toString().split(",") );
            for(
k=0k<ciudades[i][j].lengthk++) {
                if(
ConCiudades==undefined || ConCiudades ) {
                    
//cuenta regresiva para contar todas las provincias anteriores (cuantas provincias habia en los paises anteriores)
                    
var aux=i-1provinciasAnteriores=0;
                    while(
aux>=0)
                        
provinciasAnteriores+=provincias[aux--].length;
                    
agregarOpt(selCiudciudades[i][j][k], ciudades[i][j][k], iprovinciasAnteriores+";"+jnullnull);
                }
            }
        }
    }
}

var 
haCambiadoPais=false;        //elemento de control para contar las provincias al cambiar de ciudad
reiniciar_selects(true,true,true);        //todos los valores en todos los selects


/****************************************************************
    EVENTOS ONCHANGE PARA CADA UNO DE LOS SELECTS
****************************************************************/
selPais.onchange=function() {
    
//restablecemos provincias, ciudades
    
reiniciar_selects(false,true,true);
    
//cambiar provincias para que sólo contengan .contieneProvincias
    
var contieneProvincias=this.options[this.options.selectedIndex].contieneProvincias;
    
dejarOpcionesExistentes(selProv,contieneProvincias);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
    
haCambiadoPais=true;
}
selProv.onchange=function() {
    
//restablecemos sólo ciudades
    
reiniciar_selects(false,false,true);
    
//seleccionar el pais al que pertenece la provincia
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//cambiar ciudades para que sólo contengan .contieneCiudades
    
var contieneCiudades=this.options[this.options.selectedIndex].contieneCiudades;
    
dejarOpcionesExistentes(selCiud,contieneCiudades);
}
selCiud.onchange=function() {
    
//seleccionar el pais al que pertenece la ciudad
    
var suPais=this.options[this.options.selectedIndex].suPais;
    
selecciona(selPais,suPais);
    
//seleccionar la provincia a la que pertenece la ciudad
    
var suProvincia=this.options[this.options.selectedIndex].suProvincia;
    if(!
haCambiadoPaissuProvincia=eval( suProvincia.replace(";","+") );        //suma de las provincias de los anteriores paises más la suya
    
else suProvincia=suProvincia.split(";")[1];                                    //sólo la suya
    
selecciona(selProv,suProvincia);
}



</script>


</body>
</html> 


Un saludo!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 12/06/2007, 14:09
Avatar de franklin85  
Fecha de Ingreso: octubre-2006
Mensajes: 103
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: select asociados

Hola derkenuke, ante todo gracias por tu ayuda, solo queria hacerte una ultima consulta. como puedo hacer que el boton cancelar de my formulario completo haga que tambien restablesca los select asociados
My boton de cancelar de my formulario es este:
Código PHP:
<input type="button" value="Enviar" onClick="validar()" name="button"
como lo hago para cuando el usuario de cancelar tambien se restablescan los combos.
Código PHP:
<input type="button" value="restablecer" onclick="reiniciar_selects(true,true,true)" /> 
bueno eso es todo gracias.
  #10 (permalink)  
Antiguo 12/06/2007, 14:55
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: select asociados

Puedes poner en el onclick del botón en cuestión:

Código PHP:
onclick="cancelar(); reiniciar_selects(true,true,true);" 
Y entonces ejecutará las dos funciones.

Una cosa, ¿Tu botón ejecuta la función validar()? ¿validar() sirve para cancelar? :S
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #11 (permalink)  
Antiguo 12/06/2007, 16:03
Avatar de franklin85  
Fecha de Ingreso: octubre-2006
Mensajes: 103
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: select asociados

no me equivoque era con este boton
Código PHP:
<input type="reset" value="Cancelar" name="reset"
  #12 (permalink)  
Antiguo 12/06/2007, 16:15
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: select asociados

Bueno, la técnica es la misma:

Código PHP:
<input type="reset" value="Cancelar" name="reset" onclick="reiniciar_selects(true,true,true);"  /> 
Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #13 (permalink)  
Antiguo 15/06/2007, 12:35
Avatar de franklin85  
Fecha de Ingreso: octubre-2006
Mensajes: 103
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: select asociados

hola derkenuke ante todo muchas gracias por tu ayuda.
He realizado todo y funciona todo bien, pero cuando selecciono uno de las opciones del primer select se activan sus opciones del 2 y 3 select pero en el 3 select hay una opcion que se repite varias veces, sin que yo las hubiera repetido en el codigo a que se debe esta falla
La opcion que falla es
1 select (cargan 21 opciones, y al cargar la opcion #11)
2 select (aca cargan 3 de la opcion 11 del primer select)
3 select (y aca es donde me muestra las opciones repetidas una de ellas las repite 6 veces)
Ojo que cuando cargo la opcion 11 el segundo select no lo cargo y voy defrente a ver las opciones del tercer select y es ahy donde me muestra las opciones repetidas.
  #14 (permalink)  
Antiguo 15/06/2007, 14:43
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: select asociados

Mmmm puede que haya un fallo en el script, todavía no lo puse en las FAQ por si acaso, quería que hubiese un par de pruebas.

Postea el código para que lo revise, espero que no se me halla pasado por alto algo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:25.