Foros del Web » Programando para Internet » Javascript »

problema con la validacion de checkbox

Estas en el tema de problema con la validacion de checkbox en el foro de Javascript en Foros del Web. hola hace unos dias caricatos me facilito un codigo que me sirvio perfectamente para validar botones de radio, ahora en vez de estos tengo checkbox, ...
  #1 (permalink)  
Antiguo 09/01/2007, 20:32
 
Fecha de Ingreso: junio-2006
Mensajes: 175
Antigüedad: 17 años, 10 meses
Puntos: 0
problema con la validacion de checkbox

hola hace unos dias caricatos me facilito un codigo que me sirvio perfectamente para validar botones de radio, ahora en vez de estos tengo checkbox, reemplace lo unico que me parecio logico en el codigo y no me funciona para nada, este es codigo a ver si alguien atina con el error, de antemano gracias..

<input type='checkbox' name="campos[<?php echo $row["id"];?>]" >

<script language="javascript">
function validar(f) {
var valida = false;
for (var i = 0, total = f["campos[]"].length; i < total; i ++)
valida = (valida || f["campos[]"][i].checked);
if (!valida) window.alert("Debe seleccionar un registro");
return valida;
}
</script>
<form id="form1" name="form1" method="post" onsubmit="return validar(this)" action="reimprimir_almacen.php">
__________________
Lo poco que sé se lo debo a mi ignorancia....
  #2 (permalink)  
Antiguo 10/01/2007, 01:41
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: problema con la validacion de checkbox

Hola:

Deberías dejar los corchetes vacíos para que pudiese funcionar... si tienes interés en dejar los valores que pones entre los corchetes la respuesta sería un poco más complejo... recorrer todos los elementos del formulario, rescatando solo los que sean checkboxes y que la primera parte del nombre coincidiera hasta el corchete de apertura...

for (var i = 0, total = f.elements.length; i < total; i ++)
if (f.elements[i].name.substr(0, 7) == "campos[" && f.elements[i].type = "checkbox")
valida = (valida || f.elements[i].checked)
...

Ya nos dirás...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 10/01/2007, 19:40
 
Fecha de Ingreso: junio-2006
Mensajes: 175
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: problema con la validacion de checkbox

hola disculpa pero no funcionó, manda igual el formularrio..

function validar(f) {
var valida = false;
for (var i = 0, total = f.elements.length; i < total; i ++)
if (f.elements[i].name.substr(0, 7) == "campos[" && f.elements[i].type = "checkbox")
valida = (valida || f.elements[i].checked);
if (!valida) window.alert("Debe seleccionar un registro");
return valida;
}
__________________
Lo poco que sé se lo debo a mi ignorancia....
  #4 (permalink)  
Antiguo 11/01/2007, 01:30
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: problema con la validacion de checkbox

Hola:

Acabo de comprobar que es correcta la comparación del texto... seguramente tengas que separar cada camparación entre paréntesis...

if ((f.elements[i].name.substr(0, 7) == "campos[") && (f.elements[i].type == "checkbox"))

Al editar la línea para insertar los paréntesis (azules) encontré el problema gordo, al hacer una asignación en vez de una comparación (rojo)

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 11/01/2007, 04:43
yz!
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con la validacion de checkbox

Estoy intentando hacer lo mismo, solo que todos mis checkbox tienen el mismo name.
He vaciado los corchetes, como decias, pero no me funciona.
Webdeveloper me indica que el error de sintaxis esta en el punto de:
total = f[].length;

<input type='checkbox' name="InscritoSeleccionado" >

<script language="javascript">
function validar(f) {
var valida = false;
total = f[].length;
for (var i = 0; i < total; i ++)
valida = (valida || f[][i].checked);
if (!valida) window.alert("Debe seleccionar un registro");
return valida;
}
</script>

<form id="form1" name="form1" method="post" onsubmit="return validar(this)" action="reimprimir_almacen.php">

Estoy un poco perdido con javascript y todavía no lo entiendo demasiado bien.
  #6 (permalink)  
Antiguo 11/01/2007, 04:59
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: problema con la validacion de checkbox

Hola:

yz!: Si pones detrás de un objeto un par de corchetes quiere decir que es un array, y dentro debe estar el índice (y si fuera un array asociativo, la cadena que asocia el elemento)... pero no es el caso porque los corchetes son parte del nombre, así que hay que dejar el nombre tal cual... y la única forma que conozco para hacerlo es haciendo esa referencia como una cadena de texto, y esa sintaxis debe llevar corchetes. En resúmen, tu ejemplo quedaría así:

<script language="javascript">
function validar(f) {
var valida = false;
total = f["f[]"].length;
for (var i = 0; i < total; i ++)
valida = (valida || f["f[]"][i].checked);
if (!valida) window.alert("Debe seleccionar un registro");
return valida;
}
</script>
No sé si tus checkboxes tienen el name="InscritoSeleccionado"... el ejemplo que puse es para name="f[]"

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 11/01/2007, 05:15
yz!
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con la validacion de checkbox

Primero agradecerte por tu ayuda y por molesarte en echar una mano.

Ahora que he introducido mi name="InscritoSeleccionado" funciona mejor, pero cuando solo hay un registro que seleccionar y estando este seleccionado me salta "Debe seleccionar un registro".

Algo parecido me sucede con un checkbox que los selecciona todos a la vez, funciona bien pero cuando el registro es solo uno no obedece.

Saludos y muchas gracias por tu ayuda.
  #8 (permalink)  
Antiguo 11/01/2007, 05:29
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: problema con la validacion de checkbox

Hola:

La razón de los corchetes es para que php sepa que se trata de un array, y si no los pones "entiende" que es un dato simple, así que si va a ser procesado por php es aconsejable usarlo, pero si usas corchetes debes referenciarlos con javascript como he comentado antes (con corchetes y entrecomillado)

Pega el código que tienes ahora (javascript y html -solo el formulario... y del formulario los elementos que quieres validar-)

Verás que con pocos retoques conseguiremos que funcione.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #9 (permalink)  
Antiguo 11/01/2007, 05:45
yz!
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con la validacion de checkbox

Vale hay va el codigo resumido.

Código:
<script language="JavaScript" type="text/javascript">
<!--
function valida_inscritos(f) {
    var valida = false;
    total = f["InscritoSeleccionado"].length;
    //alert (total);
    for (var i = 0; i < total; i ++)
        valida = (valida || f["InscritoSeleccionado"][i].checked);
    if (!valida) alert ("Debe seleccionar un registro");
    return valida;
}

var checkflag = "false";
function check(field) {
    if (checkflag == "false") {
        for (i = 0; i < field.length; i++) {
            field[i].checked = true;
        }
        checkflag = "true";
        return "Uncheck All"; 
    } else {
        for (i = 0; i < field.length; i++) {
            field[i].checked = false;
        }
        checkflag = "false";
        return "Check All";
    }
}
//-->
</script>
Y el formulario:
Código:
<form name="form1" method="post" action="/menu_privado/inscritos_oferta.asp" onsubmit="return valida_inscritos(this);">
<input name="Inscritos" value="Check All" type="checkbox" onclick="this.value=check(this.form.InscritoSeleccionado)">Cabecera
<input name="InscritoSeleccionado" value="valor1" type="checkbox">Registro1
<input name="InscritoSeleccionado" value="valor2" type="checkbox">Registro2
</form>
Los registros se cargan dinámicamente desde una base de datos.

Saludos y muchas gracias por tu ayuda.
  #10 (permalink)  
Antiguo 11/01/2007, 06:14
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: problema con la validacion de checkbox

Hola:

Comentaré los cambios a medida que los vea (espero que no se me pase ninguno):

Como te expliqué en el mensaje anterior debes usar los corchetes en los nombres que se procesarán como array por php:

Código:
<input name="InscritoSeleccionado[]" value="valor1" type="checkbox">Registro1
<input name="InscritoSeleccionado[]" value="valor2" type="checkbox">Registro2
Por consiguiente debe arreglarse en el script:

Código:
function valida_inscritos(f) {
    var valida = false;
    total = f["InscritoSeleccionado[]"].length;
    //alert (total);
    for (var i = 0; i < total; i ++)
        valida = (valida || f["InscritoSeleccionado[]"][i].checked);
    if (!valida) alert ("Debe seleccionar un registro");
    return valida;
}
Por consiguiente debes cambiar tu llamada a la función check en el otro checkbox:

Código:
onclick="this.value=check(this.form['InscritoSeleccionado[]'])">
Y para rematarlo te voy a simplificar tu función check()...

var checkflag = false;
function check(field) {
checkflag = !checkflag;
for (i = 0; i < field.length; i++) {
field[i].checked = checkflag;
}
return (checkflag) ? "Uncheck All":"Check All";
}

No sé si puse al revés los flags... compruébalo y nos cuentas.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Última edición por caricatos; 12/01/2007 a las 01:50 Razón: Me faltaban unos corchetes
  #11 (permalink)  
Antiguo 12/01/2007, 01:56
yz!
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con la validacion de checkbox

Bueno yo realmente trabajo con asp y ya he programado el script para qeu recorra la coleccion de inscritos y actue sobre ellos.

He cambiado lo que me has dicho: "InscritoSeleccionado[]", pero sigue el mismo comprotamiento, cuando la tabla muestra varios registros, no hay ningun problema, pero cuando muestra sólo uno no obedece.

Acerca del resumen de la función check:
Ha dejado de funcionar totalmente, cosa que no comprendo ya que veo eso resumen que has hecho como totalmente lógico. A mi entender, debería comportarse adecuadamente.
  #12 (permalink)  
Antiguo 12/01/2007, 02:29
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: problema con la validacion de checkbox

Hola:

Si trabajas con asp y no es obligatorio el uso de corchetes, puedes quitarlos en todas las ocurrencias...

Lo de la función, acabo de corregirla ya que justamente me había olvidado de poner esos corchetes (que pueden verse en rojo)

Preparé una página completa:

Código:
<html>
	<head>
		<title>
			recepción
		</title>
		<script type="text/javascript">
			var checkflag = false;
			function check(field) {
				checkflag = !checkflag;
				for (i = 0; i < field.length; i++)
					field[i].checked = checkflag;
				return (checkflag) ? "Uncheck All":"Check All";
			}

			function valida_inscritos(f) {
				var valida = false;
				total = f["InscritoSeleccionado"].length;
				for (var i = 0; i < total; i ++)
					valida = (valida || f["InscritoSeleccionado"][i].checked);
				if (!valida) alert ("Debe seleccionar un registro");
				return valida;
			}
		</script>
	</head>
	<body >
		<form name="form1" action="javascript:alert('enviado')" onsubmit="return valida_inscritos(this);">
			<input name="Inscritos" value="Check All" type="checkbox" onclick="this.value=check(this.form.InscritoSeleccionado)">Cabecera
			<input name="InscritoSeleccionado" value="valor1" type="checkbox">Registro1
			<input name="InscritoSeleccionado" value="valor2" type="checkbox">Registro2
			<br />
			<button type="submit" >enviar</button>
		</form>	
	</body>
</html>
Por cierto, me parece que no tiene sentido lo que retorna la función check, tal vez sea mejor ponerlo como contenido (innerHTML) de un label asociado a ese checkbox

Código:
<input id="Inscritos" value="Check All" type="checkbox" onclick="check(this.form.InscritoSeleccionado)">
<label for="Inscritos" id="inscri" >Check All</label>
Y la última línea de la función check:
Código:
document.getElementById("inscri").innerHTML = (checkflag) ? "Uncheck All":"Check All";
Ya no debería retornar nada...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #13 (permalink)  
Antiguo 12/01/2007, 04:00
yz!
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con la validacion de checkbox

Comenzaré por la función check. Comprobé que cuando deseleccionaba la casilla, todos los checkbox se activaban, así que después de probar unas cosas negué la flag, por lo que ahora si funciona correctamente, sólo le queda un pequeño defecto. ¿Porqué cunado solo hay un registro en la tabla no lo selecciona también?

Código:
var checkflag = "false";
function check(field) {
    checkflag = !checkflag;
    for (i = 0; i < field.length; i++) {
        field[i].checked = !checkflag;
    }
}
Tambien le quite el return directamente, no necesitaba que la función devolviese nada.

La otra función funciona casi perfectamente pero le sucede cómo a la función check, cuando trabaja con un solo registro en la tabla, no lo reconoce y salta el alert.

Es como si no supiese leer el array de 1.

Un saludo.
  #14 (permalink)  
Antiguo 16/01/2007, 03:29
yz!
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con la validacion de checkbox

¿Como podría solucionar esto? ¿Porque no sabe leer un array de un elemento?
No llego a comprenderlo, una ayudita por favor.
  #15 (permalink)  
Antiguo 02/05/2007, 09:20
yz!
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con la validacion de checkbox

Tiempo después vuelvo a la carga con este problema que finalmente he podido resolver.
Esta función fue modificada un poco para que se pueda adaptar a casi cualquier formulario.
Creo que la función todavía podría depurarse un poco.

Código:
function CA(f,isO){
    var trk=0;
    for (var i=0; i<f.elements.length; i++) {
        var e=f.elements[i];
        if ((e.name != 'allbox') && (e.type=='checkbox')) {
            if (isO != 1) {
                trk++;
                e.checked=f.allbox.checked;
            } else {
            }
        }
    }
}
El checkbox "maestro", que los marcará o desmarcará a todos (es importante el name):
Código:
<input name="allbox" type="checkbox" title="Marque / desmarque todos" onclick="CA(this.form);" />
Uno cualqueira de los demás checkboxes:
Código:
<input name="ActivaSeleccionada" type="checkbox" value="<%=rs.fields("ID_Oferta")%>" onclick="CCA(this.form,this);" />
La función que se encargará de la relación entre el último checkbox al marcar o desmarcar:
Código:
function CCA(f,CB) {
    var TB=TO=0;
    for (var i=0;i<f.elements.length;i++) {
        var e=f.elements[i];
        if ((e.name != 'allbox') && (e.type=='checkbox')) {
            TB++;
            if (e.checked)
                TO++;
        }
    }
    f.allbox.checked=(TO==TB)?true:false;
}
Espero que haya otros que les pueda servir.

Gracias a todos por su ayuda
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 15:19.