Ver Mensaje Individual
  #5 (permalink)  
Antiguo 17/10/2007, 00:39
Erickvk
 
Fecha de Ingreso: septiembre-2007
Mensajes: 268
Antigüedad: 16 años, 7 meses
Puntos: 8
Re: Validar campos - Campos no iguales

Cita:
Iniciado por derkenuke Ver Mensaje
Hola a los dos:

Erickvk, veo un fallo en tu planteamiento: Un campo se comprueba con sí mismo, por lo tanto siempre se suma una unidad a cont. Por otra parte, si un campo A se repite con B, B se repite también con A, luego cont no sumara 1 (una repetición) sino 2 unidades.


Aquí va un esbozo:

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>Página nueva</title>
<
style type="text/css">

</
style>
</
head>

<
body>

<
form action="">

    
0. <input type="text" value="bar" /><br/>
    
1. <input type="text" value="bara" /><br/>
    
2. <input type="text" value="barb" /><br/>
    
3. <input type="text" value="barc" /><br/>
    
4. <input type="text" value="bard" /><br/>
    
5. <input type="text" value="foo" /><br/>
    
6. <input type="text" value="fooa" /><br/>
    
7. <input type="text" value="foob" /><br/>
    
8. <input type="text" value="fooc" /><br/>
    
9. <input type="text" value="food" /><br/>
    
10. <input type="text" value="fooe" /><br/>
    
11. <input type="text" value="foof" /><br/>
    
12. <input type="text" value="foog" /><br/>

    <
button type="button" onclick="comprobarRepetidos(this.form)">comprobarRepetidos()</button>

</
form>

<
script type="text/javascript">
<!--



function 
comprobarRepetidos(fr) {
    var 
elementos fr.elements;
    var 
nElementos elementos.length;
    var 
strFinal "";
    for(var 
i=0i<nElementosi++) {        // comprobamos cada campo
        
for(var j=0j<nElementosj++) {    // con cada campo
            
if( i!=&& elementos[i].tagName.toUpperCase()=="INPUT" && elementos[i].tagName.toUpperCase()=="INPUT" &&
                
elementos[i].type.toUpperCase()=="TEXT" && elementos[j].type.toUpperCase()=="TEXT" ) {
                if( 
elementos[i].value == elementos[j].value ) {
                    
strFinal += "El campo número "+i+" se repite con el número "+j+". Cambie alguno de los dos.\n\r";
                }
            }
        }
    }
    if( 
strFinal == "" ) {
        
alert("No hubo ningún campo repetido");
    }
    else {
        
alert("Hubo los siguientes errores: \n\r" strFinal );
    }
}

// -->
</script>

</body>
</html> 
Lo único que no he tenido en cuenta es ésto último, que si un campo se repite, el error sale dos veces (invertido). Para no hacer aparecer dos veces el mismo error habría que hacer unas virguerías que todavía no se me han ocurrido hacerlas de forma sencilla. Más sobretodo si se repiten los valores de tres campos, que entonces se vuelve horrible.


Advierto que el script es lento (ya lo has comentado tú) con 12 elementos (132 comprobaciones si no me equivoco), pero es que con 30 serían 870 comprobaciones de elementos y sus valores, algo árduo. ¿Qué se escribe en los campos? Quizá podamos encontrar algún algoritmo más rápido y cómodo (ya estoy pensando en alguno). Por ejemplo meter todos los valores de los campos en un array, ordenarlo, y comprobar el anterior con el siguiente. O si son 30 y se hace muy pesado con expresiones regulares y armando un String con los valores.




Bueno, seguiremos mejorando la cosa.

Un saludo
Mi recorrido es mas eficiente ya que recorre el minimo de veces los elementos de formulario, y la i y la j nunca valen lo mismo, ya que se inicializa la j con i+1.