Foros del Web » Programando para Internet » Javascript »

Radio button raro

Estas en el tema de Radio button raro en el foro de Javascript en Foros del Web. Hola tengo un formulario donde tengo un grupo de radio buttons para seleccionar un empleado. Todo funciona perfectamente si existen más de 1 radio button ...
  #1 (permalink)  
Antiguo 03/11/2006, 09:10
 
Fecha de Ingreso: abril-2006
Mensajes: 76
Antigüedad: 18 años
Puntos: 0
Radio button raro

Hola tengo un formulario donde tengo un grupo de radio buttons para seleccionar un empleado. Todo funciona perfectamente si existen más de 1 radio button en el formulario, si solo hay uno tengo un extraño comportamiento:

en el form tengo:
<input type="radio" name=nempleado value=1 onclick="marcarempleado()">
<input type="radio" name=nempleado value=2 onclick="marcarempleado()">
<input type="radio" name=nempleado value=3 onclick="marcarempleado()">
....

Al pulsar se ejecuta el codigo de marcarempleado:
for(i=0;i<=document.menu1.nempleado.length;i++)
if ( document.menu1.nempleado[i].checked )
{
document.menu2.selempleado.value = document.menu1.nempleado[i].value;
}

Si hay solo 1 empleado, el objeto document.menu1.nempleado.length me dice que es Undefined!!!!!!! Si hay 2 o mas todo funciona correctamente. No lo entiendo.

Saludos
Yartax
  #2 (permalink)  
Antiguo 03/11/2006, 14:05
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
jeje, a mi me paso igual en una ocación, nunca supe el por que de eso, pero simplemente lo resolvi poniendo un campo oculto:

<input type="hidden" name=nempleado value=X>
<input type="radio" name=nempleado value=1 onclick="marcarempleado()">
<input type="radio" name=nempleado value=2 onclick="marcarempleado()">
<input type="radio" name=nempleado value=3 onclick="marcarempleado()">

Asi, aunque solo tengas un radio existiran dos campos "nempleado" y el length ya te arrojara Dos como minimo y no te afecta en lo mas minimo el campo ocualta ya que usas un FOR para optener el valor del radio seleccionado...

Aunque no se si solo tienes la Duda del por que pasa eso o si querias que te ayudaran a resolverlo jeje, pero bueno, Suerte!
__________________
Wow! No se que decir...
  #3 (permalink)  
Antiguo 06/11/2006, 02:22
 
Fecha de Ingreso: abril-2006
Mensajes: 76
Antigüedad: 18 años
Puntos: 0
Ok, gracias lo resolveré como tú. Pero..... vaya guevos con el radio button no?
  #4 (permalink)  
Antiguo 06/11/2006, 15:24
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Jajaja, si definitivo, no se que fregaos pase en este caso, aunque lo resolvi preferiria saber la razón del por que no lo reconoce...
__________________
Wow! No se que decir...
  #5 (permalink)  
Antiguo 06/11/2006, 16:30
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Buenas,

Creo que el problema está en la condición del for, más concretamente en el operador de comparación "<=".

Fíjate que cuando obtienes la propiedad "length" te muestra el total de elementos, en cambio para acceder a los elementos, se comienza desde cero...

Qué pasa si tienes un sólo radio? : length devuelve '1', y el for se ejecuta para '0' y para '1' (mal).

Si tienes 3 como en tu ejemplo, te debería también algún error. pues el for se ejecutaría para los elementos '0', '1', '2', '3'...

... el hecho de que parezca que te funciona con más de uno es que si tuvieras marcado el tercero, se te mostraría el valor en el cuadro de texto, pero luego daría error al buscar el radio '3' que no existe

Para programar en javascript nada mejor en el firefox con la extensión FireBug: https://addons.mozilla.org/firefox/1843/

Lo que también hay que tener cuidado por que el firefox "se traga" algunas cosas, como que no pongas punto y coma... cosa que no entiendo por qué lo permiten.

Te dejo un ejemplo (prueba a poner y quitar '=')


Código:
<HTML>
<HEAD>

	<script language="javaScript">

		function marcarempleado()
		{

			var nEmpleados = document.getElementsByName("nempleado").length;
			alert(nEmpleados);

			for(i=0; i < nEmpleados; i++)
			{
				if ( document.getElementsByName("nempleado")[i].checked )
				{
					document.getElementById("texto").value = document.getElementsByName("nempleado")[i].value;
				}	
			}

		}

	</script>


</HEAD>

<BODY>
<input type="radio" name=nempleado value=1 onclick="marcarempleado()">
<input type="radio" name=nempleado value=2 onclick="marcarempleado()">
<input type="radio" name=nempleado value=3 onclick="marcarempleado()">
<input type="text" id="texto"/>
</BODY>

</HTML>

Igual se me escapa algo, pero al menos es lo que doy de mi a estas horas xD

Última edición por MikiBroki; 07/11/2006 a las 00:20
  #6 (permalink)  
Antiguo 07/11/2006, 13:51
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Pero cuando era un solo radio y mandar en un alert el tamaño nos indicaba "Undefined", osea que ni siquiera el length nos indicaba uno, eso es lo que no entienod realmente...si existe uno, por que nos indicaba Undefined?
__________________
Wow! No se que decir...
  #7 (permalink)  
Antiguo 07/11/2006, 14:07
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Pues no sé, sería cuestión de ver el código completo (igual pusiste alguna mayúscula/minúscula que iba o no, o pusiste mal el nombre)... con el código que he puesto lo he probado con sólo uno sin problema
  #8 (permalink)  
Antiguo 07/11/2006, 14:40
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
En cuanto pueda lo checaré, ya les comentare o mejor les pondre parte del código....
__________________
Wow! No se que decir...
  #9 (permalink)  
Antiguo 07/11/2006, 15:25
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Ya he dado con el problema (me estaba picando la curiosidad con este tema )

Partiendo del siguiente código:

Código:
<HTML>
<HEAD>

<script language="javaScript">

function marcarempleado()
{
alert( document.miform.nempleado );
//alert( document.miform.nempleado.length );

/*			
var num_elementos = document.getElementsByName("nempleado").length;			
for( var contador=0; contador < num_elementos; contador++ )
{
if( document.getElementsByName("nempleado")[contador].checked  == true )
alert( "está marcado el radio [" + contador + "] y su valor es [" + document.getElementsByName("nempleado")[contador].value + "]" );
}
}
*/
</script>


</HEAD>


<BODY>
<form name="miform">
<input type="radio" name=nempleado value=11       onclick="marcarempleado()">
<input type="radio" name=nempleado value=22 onclick="marcarempleado()">
<input type="radio" name=nempleado value=33 onclick="marcarempleado()">
</form>
</BODY>

</HTML>

La clave está en que si tienes varios radio, el alert te devolverá un "[object NodeList]" (digamos que es un array de objetos radio). Pero si tienes un sólo radio devolverá simplemente "[object]", o lo que es lo mismo el único objeto radio existente.

Esto lo verás así en Firefox, porque el "genial" IE siempre devolverá "[object]", sin indicarnos de qué tipo es...

Para continuar con el ejemplo comenta el primer alert y descomenta el segundo: si tenemos digamos 3 radio, "length" devolverá 3 (el número de objetos radio en el array devuelto), pero si hay un sólo radio "length" devuelve undefined... porque al hacerse sobre un objeto, éste no tiene dicha propiedad.

¿Entonces cómo recorrer los radio?: comenta ambos alert y descomenta el resto del script.

Un saludo ;)

Última edición por MikiBroki; 07/11/2006 a las 15:50
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 05:50.