Foros del Web » Programando para Internet » Javascript »

Validar campos - Campos no iguales

Estas en el tema de Validar campos - Campos no iguales en el foro de Javascript en Foros del Web. Buenas, Llevo peleándome todo el día con un código JavaScript, y bueno, quizás alguien que sepa lo lee y me puede ayudar, ya que Google ...
  #1 (permalink)  
Antiguo 15/10/2007, 16:32
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 4 meses
Puntos: 1
Validar campos - Campos no iguales

Buenas,

Llevo peleándome todo el día con un código JavaScript, y bueno, quizás alguien que sepa lo lee y me puede ayudar, ya que Google no lo ha hecho. Ahí va.

Resulta que necesito hacer una validación en un formulario, concretamente que ningún campo se repita a lo largo del formulario. En caso de 2 campos únicamente sé hacerlo, y sería algo así:

Código:
function ValidaCampos(form1)   
  {   

	      if(form1.jug1steamid_capi.value == form1.jug2steamid.value)

    {

    alert("Hay 2 campos iguales!!");

     return false;

    }
La cosa es que no sé cómo se hace para comprobar más de 2, ya que el formulario se compone de 30 campos, y si hago todas las combinaciones con "IFs" pues me salen 900 IFs xDD

Sé que con un bucle se puede solucionar, pero no me sale bien :S

A ver si alguien sabe guiarme. Si necesitáis más datos pedírmelos. Gracias!! Saludos!
  #2 (permalink)  
Antiguo 16/10/2007, 01:22
 
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 Phosky Ver Mensaje
Buenas,

Llevo peleándome todo el día con un código JavaScript, y bueno, quizás alguien que sepa lo lee y me puede ayudar, ya que Google no lo ha hecho. Ahí va.

Resulta que necesito hacer una validación en un formulario, concretamente que ningún campo se repita a lo largo del formulario. En caso de 2 campos únicamente sé hacerlo, y sería algo así:

Código:
function ValidaCampos(form1)   
  {   

	      if(form1.jug1steamid_capi.value == form1.jug2steamid.value)

    {

    alert("Hay 2 campos iguales!!");

     return false;

    }
La cosa es que no sé cómo se hace para comprobar más de 2, ya que el formulario se compone de 30 campos, y si hago todas las combinaciones con "IFs" pues me salen 900 IFs xDD

Sé que con un bucle se puede solucionar, pero no me sale bien :S

A ver si alguien sabe guiarme. Si necesitáis más datos pedírmelos. Gracias!! Saludos!
Seguramente puedas recorrer los elementos del formulario, la variable n es el numero de elementos que tiene el formulario.

function validacion(formulario){
int cont =0;
for(int i=1; i<n-1; i++){
for (int j= i+1, j<n; j++)
if(formulario.elements[i].value == formulario.elements[j].value)
cont++
}
if (cont != 0)
{
alert("Hay "+cont+" campos iguales!!");
return false;
}
return true
}
  #3 (permalink)  
Antiguo 16/10/2007, 10:13
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 4 meses
Puntos: 1
Re: Validar campos - Campos no iguales

Cita:
Iniciado por Erickvk Ver Mensaje
Seguramente puedas recorrer los elementos del formulario, la variable n es el numero de elementos que tiene el formulario.

function validacion(formulario){
int cont =0;
for(int i=1; i<n-1; i++){
for (int j= i+1, j<n; j++)
if(formulario.elements[i].value == formulario.elements[j].value)
cont++
}
if (cont != 0)
{
alert("Hay "+cont+" campos iguales!!");
return false;
}
return true
}
Buenas,

He probado el código, pero el formulario deja de funcionar. Quizás deberías saber que tengo otras validaciones, para ver que no se dejen campos vacíos.

¿qué puede pasar?
  #4 (permalink)  
Antiguo 16/10/2007, 15:53
Avatar de 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

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
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 17/10/2007, 00:39
 
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.
  #6 (permalink)  
Antiguo 17/10/2007, 08:04
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 4 meses
Puntos: 1
Re: Validar campos - Campos no iguales

Cita:
Iniciado por Erickvk Ver Mensaje
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.
El problemilla es que el tuyo no me funciona, Erickvk :(

Os dejo un trocillo del formulario (porque es muy largo) con lo imprescindible (no todos los campos) para que podáis comprobar que en algo casca

Código PHP:
<script type='text/javascript'>

function 
checkSteamID(cadena,id){

        if(
cadena == '')
        {
            
alert('Campo SteamID vacio :'+'jugador '+id);
                return 
true;
        }    
        
        var 
re = new RegExp('^STEAM_0:+[0-1]+:+[0-9]{1,8}$');
        
        if(!
cadena.match(re))
        {
            
alert('Introduce correctamente la SteamID :'+'jugador '+id);
                return 
true;
        }    

    return 
false;
}
function 
vacio(cadena)   
 {               
    var 
blanco String.fromCharCode(13);   
                                  
    var 
i;                             
    var 
es_vacio;                       
    for(
0es_vacio true;(cadena.length) && es_vacioi++)   
      
es_vacio blanco.indexOf(cadena.charAt(i)) != - 1;   
    return(
es_vacio);   
}


/* INICIO by Erickvk */
function validacion(form1){
int cont =0;
for(
int i=1i<23-1i++){
for (
int ji+1j<23j++)
if(
form1.elements[i].value == form1.elements[j].value)
cont++
}
if (
cont != 0)
{
alert("Hay "+cont+" campos iguales!!");
return 
false;
}
return 
true
}
/* FINAL by Erickvk */


function ValidaCampos(form1)   
  {   

    if(
checkSteamID(form1.jug1steamid_capi.value,1)){ return false; }
    if(
checkSteamID(form1.jug2steamid.value,2)){ return false; }
    if(
checkSteamID(form1.jug3steamid.value,3)){ return false; }
    if(
checkSteamID(form1.jug4steamid.value,4)){ return false; }
     if(
checkSteamID(form1.jug5steamid.value,5)){ return false; }
    
    if(!
vacio(form1.jug6nick.value))    
    {
        if(
vacio(form1.jug6email.value)) 
        {
            
alert('Introduce el email del jugador 6.');        
            return(
false);
        }
        if(
checkSteamID(form1.jug6steamid.value,6)){ return false; }    
    }
             
     if(
form1.op_faseprev[0].checked == false && form1.op_faseprev[1].checked == false)     
      
alert('Indica si jugo el clan fase previa.');     
    else if(
vacio(form1.email.value))     
      
alert('Introduce un email.');      
    else if(
vacio(form1.nombre_completo_clan.value))     
      
alert('Introduce el nombre del clan.');              
    else if(
vacio(form1.tag_clan.value))     
      
alert('Introduce el tag del clan.');         
    else if(
vacio(form1.jug1nick_capi.value))     
      
alert('Introduce el nick del jugador 1.');                              
    else if(
vacio(form1.jug1email_capi.value))     
      
alert('Introduce el email del jugador 1.');            
    else if(
vacio(form1.jug2email.value))     
      
alert('Introduce el email del jugador 2.');   
    else if(
vacio(form1.jug3nick.value))     
      
alert('Introduce el nick del jugador 3.');                              
    else if(
vacio(form1.jug3email.value))     
      
alert('Introduce el email del jugador 3.');               
    else if(
vacio(form1.jug4nick.value))     
      
alert('Introduce el nick del jugador 4.');                              
    else if(
vacio(form1.jug4email.value))     
      
alert('Introduce el email del jugador 4.');           
    else if(
vacio(form1.jug5nick.value))     
      
alert('Introduce el nick del jugador 5.');                              
    else if(
vacio(form1.jug5email.value))     
      
alert('Introduce el email del jugador 5.');                    
    else  
      return(
true);   

  
  
      return(
false);   
  }      
 
</script>
 
<form name='form1' method='post' action='inscripcion_insert_bd.php' onSubmit='return ValidaCampos(this)'>
  <p align="left"><b>Datos</b>
  <hr></p>
  <table width="419" border="0" align="center" cellpadding="2" cellspacing="0">
    <tr>
      <td width="178">Nombre Completo</td>
      <td colspan="3"><input name="nombre_completo_clan" type="text" id="nombre_completo_clan" value="">        * Obligatorio</td>
    </tr>
    <tr>
      <td>TAG</td>
      <td colspan="3"><input name="tag_clan" type="text" id="tag_clan">        * Obligatorio </td>
    </tr>
    <tr>
      <td>Email de contacto</td>
      <td colspan="3"><input name="email" type="text" id="email">        * Obligatorio </td>
    </tr>
    <tr>
      <td>&iquest;Jug&aacute;steis la Fase Previa?</td>
      <td width="27"><p>Si
          <br>
          No 
          
      </p>      </td>
      <td width="82"><input name="op_faseprev" type="radio" value="si">
        <br>
      <input name="op_faseprev" type="radio" value="no"></td>
      <td width="116"> * Obligatorio </td>
    </tr>
  </table>
  <p align="left"><b>Datos de los Jugadores</b>
  <hr></p>
  <table width="419" border="0" align="center" cellpadding="2" cellspacing="0">
    <tr valign="top">
      <td height="25" colspan="2"><div align="center">Jugador 1 (Capit&aacute;n) </div></td>
    </tr>
    <tr>
      <td width="179">Nick del Capit&aacute;n SIN TAG </td>
      <td width="232"><input name="jug1nick_capi" type="text" id="jug1nick_capi">        * Obligatorio </td>
    </tr>
    <tr>
      <td>STEAM ID</td>
      <td><input name="jug1steamid_capi" type="text" id="jug1steamid_capi">        * Obligatorio </td>
    </tr>
    <tr>
      <td>Email del Capit&aacute;n </td>
      <td><input name="jug1email_capi" type="text" id="jug1email_capi">        * Obligatorio </td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr valign="top">
      <td height="25" colspan="2"><div align="center">Jugador 2 </div></td>
    </tr>
    <tr>
      <td>Nick del Jugador SIN TAG </td>
      <td><input name="jug2nick" type="text" id="jug2nick">        * Obligatorio </td>
    </tr>
    <tr>
      <td>STEAM ID </td>
      <td><input name="jug2steamid" type="text" id="jug2steamid">        * Obligatorio </td>
    </tr>
    <tr>
      <td>Email del Jugador </td>
      <td><input name="jug2email" type="text" id="jug2email">        * Obligatorio </td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr valign="top">
      <td height="25" colspan="2"><div align="center">Jugador 3 </div></td>
    </tr>
    <tr>
      <td>Nick del Jugador SIN TAG </td>
      <td><input name="jug3nick" type="text" id="jug3nick">        * Obligatorio </td>
    </tr>
    <tr>
      <td>STEAM ID </td>
      <td><input name="jug3steamid" type="text" id="jug3steamid">        * Obligatorio </td>
    </tr>
    <tr>
      <td>Email del Jugador </td>
      <td><input name="jug3email" type="text" id="jug3email">
      * Obligatorio </td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr valign="top">
      <td height="25" colspan="2"><div align="center">Jugador 4 </div></td>
    </tr>

    <tr>
      <td>Nick del Jugador SIN TAG </td>
      <td><input name="jug4nick" type="text" id="jug4nick">        * Obligatorio </td>
    </tr>
    <tr>
      <td>STEAM ID </td>
      <td><input name="jug4steamid" type="text" id="jug4steamid">        * Obligatorio </td>
    </tr>
    <tr>
      <td>Email del Jugador </td>
      <td><input name="jug4email" type="text" id="jug4email">        * Obligatorio </td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>

    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr valign="top">
      <td height="25" colspan="2"><div align="center">Jugador 5 </div></td>
    </tr>
    <tr>
      <td>Nick del Jugador SIN TAG </td>
      <td><input name="jug5nick" type="text" id="jug5nick">        * Obligatorio </td>
    </tr>
    <tr>
      <td>STEAM ID </td>
      <td><input name="jug5steamid" type="text" id="jug5steamid">        * Obligatorio </td>
    </tr>
    <tr>
      <td>Email del Jugador </td>
      <td><input name="jug5email" type="text" id="jug5email">        * Obligatorio </td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr valign="top">
      <td height="25" colspan="2"><div align="center">Jugador 6 </div></td>
    </tr>
    <tr>
      <td>Nick del Jugador SIN TAG </td>
      <td><input name="jug6nick" type="text" id="jug6nick"></td>
    </tr>
    <tr>
      <td>STEAM ID </td>
      <td><input name="jug6steamid" type="text" id="jug6steamid"></td>
    </tr>
    <tr>
      <td>Email del Jugador </td>
      <td><input name="jug6email" type="text" id="jug6email"></td>
    </tr>
  </table>
  <p align="center">
    <input name="env" type="submit" id="env" value="Enviar Datos">
  </p>
</form> 
  #7 (permalink)  
Antiguo 17/10/2007, 09:36
Avatar de 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.
  #8 (permalink)  
Antiguo 17/10/2007, 16:12
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 4 meses
Puntos: 1
Re: Validar campos - Campos no iguales

Sigo sin poder implementar vuestro código en mi formulario con mis funciones :S
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 11:58.