Foros del Web » Programando para Internet » Javascript »

llamada a un select para mostrar/ocultar un INPUT

Estas en el tema de llamada a un select para mostrar/ocultar un INPUT en el foro de Javascript en Foros del Web. Hola foreros, estoy intentando crear unas listas desplegables en las que, a parte de las opciones generadas por php desde una BD, exista otra que ...
  #1 (permalink)  
Antiguo 10/08/2010, 10:36
Avatar de gengeru  
Fecha de Ingreso: agosto-2006
Mensajes: 9
Antigüedad: 17 años, 8 meses
Puntos: 0
llamada a un select para mostrar/ocultar un INPUT

Hola foreros,

estoy intentando crear unas listas desplegables en las que, a parte de las opciones generadas por php desde una BD, exista otra que haga aparecer un input (que debe permanecer desactivado y oculto si no se selecciona esta opción) que permita añadir un nuevo registro a la BD. Tengo un problema con la llamada al valor (value) de la opción elegida en los <select> del formulario de entrada de datos de la BD y necesito una ayudita porque no consigo definir la variable que contenga dicho valor (y seguro que es algo básico pero javascript no lo conozco bien). Para abreviar, dejo el código necesario:

Javascript:

La idea es que esta variable almacene el value del option ("añadir COSA",debe ser numérico, en mi caso, del 1 al 8) de forma que al seleccionar dicha opción se activa un input. Necesito hacerlo asi porrque conecto con bases de datos y los nombres de los campos son únicos y no pueden duplicarse. Si le diese el valor - $n = 1; - el código funcionaría para el primer select pero no para el resto...
<script type="text/javascript">
var $n = document.getElementById("sel").value;
var $id = 'nuevo'+$n;
function mostrarInput(valor)
{
if(valor!=$n)
{
document.getElementById($id).style.visibility="hid den";
document.getElementById($id).disabled=true;
} else {
document.getElementById($id).style.visibility="vis ible";
document.getElementById($id).disabled=false;
}
}
</script>

HTML:

<select size="1" name="NombreCOSA1" maxlength="30" onchange="mostrarInput(this.value)" id="sel">
<option value="">Selecciona una "COSA1"</option>
<?php .....//aquí me devuelve consultas de la BD.... ?>
<option value="1">Añadir COSA1</option>
</select>
<input style="visibility:hidden" name="NombreCOSA1" maxlength="30" size="30" disabled="disabled" id="nuevo1" ></input >

<select size="1" name="NombreCOSA2" maxlength="30" onchange="crearInput(this.value)" id="sel">
<option value="">Selecciona una "COSA2"</option>
<?php .....//aquí me devuelve consultas de la BD.... ?>
<option value="2">Añadir COSA2</option>
</select>
<input style="visibility:hidden" name="NombreCOSA2" maxlength="30" size="30" disabled="disabled" id="nuevo2" ></input >

Espero haberme explicado, si no, puedo dar más detalles. Tiene que haber una forma de que al usar el método document.getelementbyid("sel"), éste me devuelva el valor del option seleccionado; o sea, 1, 2,.... etc.

Desde ya, muchas gracias por vuestro tiempo

Última edición por gengeru; 10/08/2010 a las 10:43
  #2 (permalink)  
Antiguo 10/08/2010, 16:25
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: llamada a un select para mostrar/ocultar un INPUT

Yo diría que el error está en que en JS las variables no empiezan por $, sino que son del tipo 'var loQueSea'. Por otro lado, en la función mostrarInput pones un if en el que comparas el value de sel (document.getElementById('sel').value)... con el value de sel (mostrarInput(this.value);). ¿Cómo quieres que sean diferentes?
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #3 (permalink)  
Antiguo 11/08/2010, 12:32
Avatar de gengeru  
Fecha de Ingreso: agosto-2006
Mensajes: 9
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: llamada a un select para mostrar/ocultar un INPUT

Cita:
Iniciado por _cronos2 Ver Mensaje
Yo diría que el error está en que en JS las variables no empiezan por $, sino que son del tipo 'var loQueSea'. Por otro lado, en la función mostrarInput pones un if en el que comparas el value de sel (document.getElementById('sel').value)... con el value de sel (mostrarInput(this.value);). ¿Cómo quieres que sean diferentes?
Saludos (:
Jeje, lo del $ es por la costumbre, la verdad. Los códigos que suelo usar de JS suelo "cortarlos y pegarlos"... Es lo que tiene cuando no estás habituado a escribir.

Lo que no entiendo es lo que me dices de la comparación; repito que doy por hecho que la declaración de la variable "n" no es buena... o sea, que habría que usar otro método pero no sé cúal, supongo... En cambio, la lógica de la comparación la veo correcta: si el valor elegido es la "opción añadir" del primer select, quiero que n me devuelva 1 (n=1), si es la del segundo select quiero que n=2 y así sucesivamente.

Gracias por la respuesta, si hay más ideas no dudeis en plasmarlas. Un saludo!
  #4 (permalink)  
Antiguo 11/08/2010, 13:14
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: llamada a un select para mostrar/ocultar un INPUT

Hola

Lo primero que las id han de ser únicas

Prueba así
Código Javascript:
Ver original
  1. <select size="1" name="NombreCOSA1" maxlength="30" onchange="if(this.value == 1){document.getElementById('nuevo'+this.value).style.visibility="visible";}else {document.getElementById('nuevo'+this.value).style.visibility="hidden";}">
  2. <option value="">Selecciona una "COSA1"</option>
  3. <?php .....//aquí me devuelve consultas de la BD.... ?>
  4. <option value="1">A&#241;adir COSA1</option>
  5. </select>
  6. <input style="visibility:hidden" name="NombreCOSA1" maxlength="30" size="30" disabled="disabled" id="nuevo1" ></input >

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #5 (permalink)  
Antiguo 13/08/2010, 03:09
Avatar de gengeru  
Fecha de Ingreso: agosto-2006
Mensajes: 9
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: llamada a un select para mostrar/ocultar un INPUT

Gracias Adler!

Mis disculpas por no atender la respuesta pero no tengo conexión a internet y no puedo mantenerme on. En estos dos días me he compado un parf de libros de JS y me empiezo a enterar de lo importante que es la jerarquización en la programación orientada a objetos. Ya veo lógico por qué la ID debe ser única y mi garrafal error. De momento he probado tu propuesta aunque recibo errores. Voy a verlo detenidamente pero entiendo por donde van los tiros y tu idea. Muchas gracias, de verdad.,
  #6 (permalink)  
Antiguo 13/08/2010, 05:17
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: llamada a un select para mostrar/ocultar un INPUT

Hola

¿Te levanta errores? Lo he repasado y no encuentro donde están esos errores que mencionas. Ya que estás interesado en mejorar, inténtalo de esta otra manera, es exactamente lo mismo, pero parece mas profesional
Cita:
onchange="document.getElementById('nuevo'+this.val ue).style.visibility= (this.value == 1) ? 'visible' : 'hidden';"
Por otro lado, no tienes por que usar atributo size="1" puesto que por defecto es 1, tampoco maxlength="30" por que creo, que no es un atributo de un select. El campo de texto ya está oculto, por lo tanto no es necesario deshabilitarlo disabled="disabled"

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #7 (permalink)  
Antiguo 14/08/2010, 13:39
Avatar de gengeru  
Fecha de Ingreso: agosto-2006
Mensajes: 9
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: llamada a un select para mostrar/ocultar un INPUT

Pues me tira el error en el momento en que "deshago la selección" (vuelvo atrás). Aún no conozco cómo funciona el evento onchange así que prefiero no especular con el pro qué. Yo lo he arreglado "incrustando" una orden por cada <select> tal y como has mencionado aunque eso es, precisamente, lo que quería intentar evitar.

Ah, lo de deshabilitar y habilitar el <input> es por evitar duplicar los registros en la base de datos pues, si no, también recibo errores al respecto. He dejado parte del php para que veáis como interactúa pero mejor no comentar nada al respecto para evitar que se migre el tema (ya os daré la brasa en otor momento :P).

He dejado un ejemplo de lo que ya me funciona aunque me parece, algo que has logrado evitar en tu propuesta, poco profesional y muy engorroso. Además, no sé hasta qué punto me puedo comer la memoria si intento manejar muchos campos de este tipo a la vez (estoy hablando de 20 o 30 campos a la vez en los que habría sentencias php y JS):

<tr>
<td class="descripcion" align="right">Reino:<em>(Obligatorio)</em></td>
<td>
<select name="NombreReino" onchange="if(this.value!=1){document.getElementByI d('nuevo1').style.visibility='hidden';}else{docume nt.getElementById('nuevo'+this.value).style.visibi lity='visible';document.getElementById('nuevo'+thi s.value).disabled=false;}">
<option value="">Selecciona un Reino</option>
Código PHP:
Ver original
  1. <?php
  2.          $db=mysql_connect('xxxxxxxx', 'xxxxxxxx', 'xxxxxxxx');
  3.          mysql_select_db ('parasitos');
  4.          $query = "SELECT NombreReino FROM taxonomia GROUP BY NombreReino ORDER BY NombreReino";
  5.          $result = mysql_query($query);
  6.          if($result == false)
  7.           {
  8.            user_error("La consulta falló: " . mysql_error() . "<br />\n$query");
  9.           }
  10.            elseif(mysql_num_rows($result) == 0)
  11.             {
  12.               echo "<p>Lo siento, la consulta no devolvió ninguna fila de datos.</p>\n";
  13.             }
  14.          else
  15.           {
  16.            while($query_row = mysql_fetch_assoc($result))
  17.             {
  18.              foreach($query_row as $value)
  19.               {
  20.                  echo'<option value='."$value".' />'.$value.'</option />';
  21.               }
  22.              echo "<br />\n";
  23.             }
  24.           }
  25.          ?>
<option value="1">Añadir Reino</option>
</select>
<input style="visibility:hidden" name="NombreReino" maxlength="30" size="30" disabled="disabled" id="nuevo1"></input >
</td>
</tr>
<tr>
<td align="right">Subreino:</td>
<td><input type="text" name="NombreSubreino" maxlength="30" size="30"></td>
</tr>
<tr>
<td align="right">Superfilo:</td>
<td><input type="text" name="NombreSuperfilo" maxlength="30" size="30"></td>
</tr>
<tr>
<td class="descripcion" align="right">Filo:<em>(Obligatorio)</em></td>
<td>
<select name="NombreFilo" onchange="if(this.value!=2){document.getElementByI d('nuevo2').style.visibility='hidden';}else{docume nt.getElementById('nuevo'+this.value).style.visibi lity='visible';document.getElementById('nuevo'+thi s.value).disabled=false;}">
<option value="">Selecciona un Filo</option>
Código PHP:
Ver original
  1. <?php
  2.          $db=mysql_connect('xxxxxxxxxxx', 'xxxxxxx', 'xxxxxxxx');
  3.          mysql_select_db ('parasitos');
  4.          $query = "SELECT NombreFilo FROM taxonomia GROUP BY NombreFilo ORDER BY NombreFilo";
  5.          $result = mysql_query($query);
  6.          if($result == false)
  7.           {
  8.            user_error("La consulta falló: " . mysql_error() . "<br />\n$query");
  9.           }
  10.            elseif(mysql_num_rows($result) == 0)
  11.             {
  12.               echo "<p>Lo siento, la consulta no devolvió ninguna fila de datos.</p>\n";
  13.             }
  14.          else
  15.           {
  16.            while($query_row = mysql_fetch_assoc($result))
  17.             {
  18.              foreach($query_row as $value)
  19.               {
  20.                  echo'<option value='."$value".' />'.$value.'</option />';
  21.               }
  22.              echo "<br />\n";
  23.             }
  24.           }
  25.         ?>
<option value="2">Añadir Filo</option>
</select>
<input style="visibility:hidden" name="NombreFilo" maxlength="30" size="30" disabled="disabled" id="nuevo2"></input>
</td>
</tr>
[........Y esto continua laaaaaaaaaargo y tendido............]

Adler, mil gracias de nuevo por marcarme el camino. Yo sigo indagando en el tema para mejorar este tostón, hasta luego!
  #8 (permalink)  
Antiguo 14/08/2010, 15:05
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: llamada a un select para mostrar/ocultar un INPUT

Hola

Interntaré explicarlo con pocas palabras, ya es Sábado!!!!
Lo que ocurre es que cuando seleccionas una opción distinta a la que tiene el valor 1, te marca el error elemento indefinido. Eso es por que this.value equivale al valor de la opción seleccionada. En fin esto es lo que tu haces

Cita:
onchange="if(this.value!=1){document.getElementByI d('nuevo1').style.visibility='hidden';}else{docume nt.getElementById('nuevo'+this.value).style.visibility='visible';document.getElementBy Id('nuevo'+this.value).disabled=false;}">
Cuando ha de ser
Cita:
onchange="if(this.value!=1){document.getElementByI d('nuevo1').style.visibility='hidden';}else{docume nt.getElementById('nuevo1').style.visibility='visible';document.getElementBy Id('nuevo1').disabled=false;}">
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />

Etiquetas: input, llamada, select
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 03:39.