Ver Mensaje Individual
  #7 (permalink)  
Antiguo 17/10/2007, 09:36
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Validar campos - Campos no iguales

Cita:
Iniciado por Erickvk
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.
Lo siento Erickvk, interpreté mal tu código. Tienes razón en que el tuyo es más eficiente, es mucho más


He codigo la idea y lo he implementado en el mío:
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<nElementos-1i++) {        // comprobamos cada campo
        
for(var j=i+1j<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> 
78 comprobaciones para 12 campos en vez de 130 que hacía antes. Es una buena mejora.

Hemos salvado el escollo a la hora de que se repitan dos campos, aunque todavía es un poco incómodo cuando se repiten tres (de cuatro o más ni hablamos).

He puesto 55 campos solo para comprobar el rendimiento... una media de 350ms para la función, 1540 comprobaciones. No está mal el rendimiento, contando que tienes 30 campos y que no vas a meter más código en mi ejemplo.


He investigado las soluciones que te puse, sobre todo la de las expresiones regulares es la que más me llama la atención (cómo no). Con 55 campos en la misma máquina me ha tardado en ejecutar una media de 20ms, extremadamente rápido. El handicap que tiene es que es un poco más dificil encontrar en qué campos están los errores, exigiría más código (supongo que no empeoraría mucho el rendimiento).

Código:
<!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="barr" /><br/>
    1. <input type="text" value="barat" /><br/>
    2. <input type="text" value="barbn" /><br/>
    3. <input type="text" value="barci" /><br/>
    4. <input type="text" value="bardo" /><br/>
    5. <input type="text" value="foo" /><br/>
    6. <input type="text" value="fooaq" /><br/>
    7. <input type="text" value="foobq" /><br/>
    8. <input type="text" value="foocq" /><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/>
    13. <input type="text" value="bara" /><br/>
    14. <input type="text" value="baraa" /><br/>
    15. <input type="text" value="barba" /><br/>
    16. <input type="text" value="barca" /><br/>
    17. <input type="text" value="barda" /><br/>
    18. <input type="text" value="fooa" /><br/>
    19. <input type="text" value="fooaa" /><br/>
    20. <input type="text" value="fooba" /><br/>
    21. <input type="text" value="foocaq" /><br/>
    22. <input type="text" value="fooda" /><br/>
    23. <input type="text" value="fooea" /><br/>
    24. <input type="text" value="foofa" /><br/>
    25. <input type="text" value="fooga" /><br/>
	26. <input type="text" value="barb" /><br/>
    27. <input type="text" value="barabn" /><br/>
    28. <input type="text" value="barab" /><br/>
    29. <input type="text" value="barbb" /><br/>
    30. <input type="text" value="barcb" /><br/>
    31. <input type="text" value="bardb" /><br/>
    32. <input type="text" value="foob" /><br/>
    33. <input type="text" value="fooab" /><br/>
    34. <input type="text" value="foobb" /><br/>
    35. <input type="text" value="foocb" /><br/>
    36. <input type="text" value="foodb" /><br/>
    37. <input type="text" value="fooeb" /><br/>
    38. <input type="text" value="foofb" /><br/>
    39. <input type="text" value="foogb" /><br/>
	40. <input type="text" value="barc" /><br/>
    41. <input type="text" value="baracq" /><br/>
    42. <input type="text" value="barac" /><br/>
    43. <input type="text" value="barbc" /><br/>
    44. <input type="text" value="barcc" /><br/>
    45. <input type="text" value="bardc" /><br/>
    46. <input type="text" value="fooc" /><br/>
    47. <input type="text" value="fooac" /><br/>
    48. <input type="text" value="foobc" /><br/>
    49. <input type="text" value="foocc" /><br/>
    50. <input type="text" value="foodc" /><br/>
    51. <input type="text" value="fooec" /><br/>
    52. <input type="text" value="foofc" /><br/>
    53. <input type="text" value="foogc" /><br/>
	54. <input type="text" value="bard" /><br/>
    55. <input type="text" value="barad" /><br/>

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

</form>

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


function comprobarRepetidos(fr) {
	// cojo todos los valores de los campos input type="text" y los meto en un array)
	var elementos = fr.elements;
    var nElementos = elementos.length;
	var aComprobar = [];
    var strFinal = "";
    for(var i=0; i<nElementos; i++) {
		if( elementos[i].tagName.toUpperCase()=="INPUT" && elementos[i].type.toUpperCase()=="TEXT" )
			aComprobar.push( elementos[i].value );
	}
	// ordeno los elementos (los iguales quedarán seguidos)
	aComprobar.sort();
	// uno los elementos en un string con || (se supone que en tus campos no se escribirá __)
	aComprobar = aComprobar.join("__");
	// ahora necesito comprobar con una expesion regular las palabras iguales seguidas
	var palabrasIguales = aComprobar.match( /([^__]+)__((\1)(__|$))+/g );
	if(palabrasIguales==null) {
		alert("Bien! No hay palabras repetidas.");
		return true;
	}
	else {
		strFinal += ("Vaya! Hay palabras repetidas:\n\r");
		for(var i=0; i<palabrasIguales.length; i++) {
			var palabraRepetida = palabrasIguales[i].split("__")[0];
			var vecesRepetida = palabrasIguales[i].split(palabraRepetida).length - 1;
			strFinal += ("Se repite "+palabraRepetida+" "+vecesRepetida+" veces.\n\r" );
		}
		alert(strFinal);
		return false;
	}
}

// -->
</script>

</body>
</html>
La expresión regular es un poco complicada. miramos todo lo que no sean __ (letras) seguidos de __ y luego otra vez esas mismas letras (\1) seguidos de __ o del final ($). Miramos también más ocurrencias de eso último.




Bueno, sólo estaba jugando, tal vez te guste así.

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.