Foros del Web » Programando para Internet » Javascript »

Validación dinámica

Estas en el tema de Validación dinámica en el foro de Javascript en Foros del Web. Hola chic@s, estoy haciendo una validación dinámica, el problema es que no reconoce los objetos de mi forma, aunque los nombres estén bien, no se ...
  #1 (permalink)  
Antiguo 06/03/2006, 16:28
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Validación dinámica

Hola chic@s, estoy haciendo una validación dinámica, el problema es que no reconoce los objetos de mi forma, aunque los nombres estén bien, no se que me está faltando, si le hago un alert a lo que viene dentro del if, me manda un value de undefined, a pesar de que los nombres de los campos si se llaman de esa manera (visto con un alert).

Cualquier ayuda será grandemente apreciada.

Código:
with(document.forms[0])
{
   for ( j = 1; j <= 3; j++ )
   {
      if ( ["reservation_"+j.toString()+"_address"].value != "" )
      {
          //algo
      }
   }
}
Saludos!
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #2 (permalink)  
Antiguo 06/03/2006, 16:50
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola u_goldman:

¿Qué poco se te ve por estos lares...?

Bueno... a ver lo que se puede hacer... en principio toString(), aunque está bien, en javascript no es necesario...

La verdad es que si tus campos son:
reservation_1_address
...
reservation_2_address
y
reservation_3_address

La teoría está bien...

También podías haber hecho el bucle con las letras... entrecomillando los índices:

for (j = "1"; j <= "3"; j++)

...pero como de esto no es la pregunta, te propondré una solución, y es no empezar a referenciar a un objeto con su valor entrecorchetado...

podría ser:

with(document) {
for (j = 1; j <= 3; j++) {
if ( forms[0]["reservation_" + j + "_address"].value != "" ) {
//algo
}
}
}

Has dicho que la validación es dinámica, pero ¿los campos son creados dinámicamente?... ¿usando createElement?... si fuera así, tal vez estarías creando el atributo name de manera errónea...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 06/03/2006, 16:51
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
prueba con un simple

if (eval('document.forms[0].reservation_'+j+'_address').value != '')

Y me dices si te funciona

Saludos
  #4 (permalink)  
Antiguo 06/03/2006, 16:52
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
¡Chin! un "medio-coche" con el master del jscript caricatos, si tuviera vergûenza borraría mi mensaje ...........pero no la tengo, jejeje
  #5 (permalink)  
Antiguo 06/03/2006, 16:56
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Cita:
Iniciado por Myakire
¡Chin! un "medio-coche" con el master del jscript caricatos, si tuviera vergûenza borraría mi mensaje ...........pero no la tengo, jejeje
¡Je, je! jscript me suena a microchoff...

Pues lo del eval es una alternativa válida, ¡por que no!... particularmente procuro no usarlo... creo que son poquísimas las ocasiones que no exista una alternativa a su uso...

Bueno, a ver que nos dice u_goldman

Saludetes
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 06/03/2006, 17:00
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Seguro no nos dirá nada, ya vez como son algunos usuarios adictos a las birras, perdón al trabajo, se les olvida todo.

Yo uso el eval más de lo que quisiera .... por flojo, jeje, que tanto trabajo es pasarlo como tu dices ..... debo del volver al buen camino, definitivamente.

Saludos
  #7 (permalink)  
Antiguo 06/03/2006, 17:01
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Gracias caricatos y Myakire!

Pasando a detallar un poco más, lo sugerido por el master caricatos, sería el camino largo pues tengo dentro de ese with una validación imensa que tiene un par de condiciones, por lo tanto tendría que modificar bastantes campos.

Aplicando el eval, como lo recomendó el maestro Tigurón, funcionó perfecto...

Gracias por la sugerencia del cast caricatos, si no se necesita, entonces estorba...

La idea es en realidad algo así:
Código:
<input type="text" class="inputfield" name="reservation_multiplan_pickup_2_address" id="reservation_multiplan_pickup_2_address" value="" />
Donde estos campos podrían tomar muchos valores...

El nombre de ellos y la referencia a la forma era correcta, lo que no me explico(y les agradecería grandemente si me explican) es por qué comenzando con corchetes no hacía correctamente referencia a ese objeto?

Gracias por su pronta respuesta...
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #8 (permalink)  
Antiguo 06/03/2006, 17:05
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Cita:
Iniciado por u_goldman
..
El nombre de ellos y la referencia a la forma era correcta, lo que no me explico(y les agradecería grandemente si me explican) es por qué comenzando con corchetes no hacía correctamente referencia a ese objeto?
mmmmmmmm, no pues esperemos a que caricatos responda, no sea que meta las 4, al decir algo que no sea cierto del todo
  #9 (permalink)  
Antiguo 06/03/2006, 17:06
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Retiro lo dicho, no funciona en firefox...
Alguna otra recomendación antes de tomar el camino largo?

Código:
//for
if ( eval("reservation_multiplan_pickup_"+j.toString()+"_address").value != "" )
{
  alert( eval("reservation_multiplan_pickup_"+j.toString()+"_address").value );
}
//
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #10 (permalink)  
Antiguo 06/03/2006, 17:15
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
eval funciona en firefox, pero creo hay que referenciarlo por ID, es decir: eval(forma.getElementById('reservation_multiplan_p ickup_'+j+'_address')), etc.

A ver que dice caricatos

Editado: Gaste unos minutos investigando y efectivamente parece que así funciona, pero en todos lados desaconsejan el uso del eval() por diferentes motivos. Bueno, elige el camino largo, ni modo.
  #11 (permalink)  
Antiguo 06/03/2006, 17:20
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Bueno... tampoco es que sea un erudito (ahora que escribo artículos, uso este tipo de palabras...)

Es que los corchetes, es una forma de nombrar a un objeto como una cadena de texto... necesita depender de algo, además podrían existir variables globales que obviamente dependerían de window.

Lo de hacer un cast, la verdad es muy útil con algunos objetos, y sobre todo los creados por el webmaster

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #12 (permalink)  
Antiguo 06/03/2006, 17:25
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
¡Ufff !

Mientras escribía un mensaje aparecieron 2 nuevos...
Mozilla soporta muy bien el eval... y opera también.

¿A qué llaman camino largo...? con eval se añade una función intermedia entre el objeto formulario y cada objeto campo... y hasta se escribe más (o me lo parece)

Prueba ese sistema largo y dinos el resultado.

Saludetes
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #13 (permalink)  
Antiguo 06/03/2006, 17:27
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Cita:
Pasando a detallar un poco más, lo sugerido por el master caricatos, sería el camino largo pues tengo dentro de ese with una validación imensa que tiene un par de condiciones, por lo tanto tendría que modificar bastantes campos.
Es un camino largo para el amigo U_G
  #14 (permalink)  
Antiguo 06/03/2006, 17:29
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
ok, en realidad parece que el problema viene anteriormente, espero no estar dando mucha lata, nunca me aparezco y cuando me aparezco no los dejo en paz

Tengo un div que refresco por medio de una llamada httpxml(AJAX), la cuál depende de un combobox, al parecer el problema se encuentra en que firefox simplemente no encuentra este control:

Código:
<div id="dynamic_container" style="clear:both;min-height=50px;">
//Aquí se llena dinámicamente
</div>
El tipo de controles que genera es más o menos así:
Código:
<div class="formrow">
  <span class="formlabel" id="req26"><label for="reservation_multiplan_pickup_1_address">*Address:</label></span>
  <span class="formfield"><input type="text" class="inputfield" id="reservation_multiplan_pickup_1_address" name="reservation_multiplan_pickup_1_address" value="" /></span>
</div>
Y pueden ser "N" número de campos, con "N" número de ocurrencias, donde solo es variable el número, en este caso 1.

El error que detecta firefox es que este objeto no está definido o sea que existe, pero no existe...tendré que hacer referencia al div?? estoy tratando pero no me resulta.

Gracias
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #15 (permalink)  
Antiguo 06/03/2006, 17:40
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola:

Si los datos los creas con innerHTML no debería haber problemas con el atributo name, pero si se crean con createElement, el nombre debe ser NAME (todas mayúsculas)

¿Te has fijado con innerHTML que es lo que se crea?

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #16 (permalink)  
Antiguo 06/03/2006, 17:45
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Si, los datos son creados con innerHTML, y son minúsculas, por alguna razón FF no los encuentra, estoy tratando de documentarme al respecto, pero no encuentro nada útil aún, je je, ya tenía bastante tiempo sin pelearme con un script :S
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #17 (permalink)  
Antiguo 06/03/2006, 17:46
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
No creo que los cree con innerHTML, yo creo que el problema se ha de eliminar con una invocación .getElementById, con o sin eval().

¿que opinas?

Editado: Si los crea con innerHTML, jejeje, hoy no doy una
  #18 (permalink)  
Antiguo 06/03/2006, 18:05
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola:

Prueba esto:

Código:
<html>
<head>
<title>
	prueba
</title>
<script type="text/javascript">
function innovar(f, que) {
	f.innerHTML += "<input type='text' name='" + que + "' />";
}
function chequear(f, que) {
	alert(f[que].value)
}
</script>
</head>
<body >
<form name="prueba" >
<input type=text name=nuevo />
<input type=button value=nuevo onclick="innovar(this.form, nuevo.value)" />
<input type=button value="ver nuevo" onclick="alert(this.form.innerHTML)" />
<input type=button value="ver value nuevo" onclick="chequear(this.form, nuevo.value)" />
</form>
</body>
</html>
Los campos se crean dinámicamente y en firefox va bien...

Puedes probarlo aquí: http://www.pepemolina.com/probador/

¿Se parece a lo que tienes...?

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #19 (permalink)  
Antiguo 06/03/2006, 18:15
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Gracias caricatos...sabes?
Saqué ese código del with() para probarlo, el error cambió.

Acabo de ver tu script y en el botón de ver value nuevo, me manda exactamente el mismo error que cuando yo trato de acceder al value de mis controles:

objeto has not properties

en el caso de tu script f[que], disparado cuando se hace click en value nuevo.

en el caso del mio hice la referencia completa a

Error: document.reservation_form.reservation_plan_pickup_ address has no properties
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #20 (permalink)  
Antiguo 06/03/2006, 18:22
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Esto ya esta medio raro.

El código de caricatos en opera funciona bien, pero solo cuando hay dos controles creados dinámicamente. Y en firefox nomás no me saca el nada el botón "ver value nuevo", pero tampoco marca error.

Si, ya se que este post no aporta nada, pero me pareció muy raro, jejeje
  #21 (permalink)  
Antiguo 06/03/2006, 18:24
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
No te marca error si vas a Tools->JavaScript Console ?
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #22 (permalink)  
Antiguo 06/03/2006, 18: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
Hola:

Bueno, en opera no lo probé aún, pero uno de los errores es que se haya borrado el value del campo nuevo y entonces no se referencia nada, o sea que hay que reescribirlo y tiene que ser tal cual... y el caso de que no saque nada... tal vez sea que no hayas escrito nada... se supone que devuelve el contenido del campo que coincida con el nombre que encuentra en el primer control de texto... una prueba recurrente es poner en ese campo "nuevo".

Voy a ver que pasa con opera.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #23 (permalink)  
Antiguo 06/03/2006, 18:36
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Cita:
Iniciado por u_goldman
No te marca error si vas a Tools->JavaScript Console ?
aaahhh, es cierto .... vaya con este firefox, y si, esta "atascado" con el error que mencionas y uno más:

Cita:
Error: Se esperaba fin de valor para la propiedad pero se encontró 'auto'. Error in parsing value for property 'padding'. Declaration dropped.
Archivo Fuente: http://www.pepemolina.com/probador/
Línea: 0
  #24 (permalink)  
Antiguo 06/03/2006, 18:37
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
ok, entonces salvo lo que digan los masters del javascript, me parece que tendría que ser un problema con DOM y Firefox...a lo mejor ya me apuro y hago una validación server side :S
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #25 (permalink)  
Antiguo 06/03/2006, 18:40
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Cita:
Iniciado por caricatos
Hola:
... se supone que devuelve el contenido del campo que coincida con el nombre que encuentra en el primer control de texto... una prueba recurrente es poner en ese campo "nuevo"...
mmmm, zapatero a tus zapatos, cierto, yo colocaba una cadena cualquiera pero no un nombre de control.
Entonces ¿por que en opera aparece el value de un 2o control creado dinámicamente?, mmmmm, a ver ....
  #26 (permalink)  
Antiguo 06/03/2006, 18: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
Cita:
Iniciado por Myakire
aaahhh, es cierto .... vaya con este firefox, y si, esta "atascado" con el error que mencionas y uno más:
¡Je, je!... ese error es de la página, que es muy poco viejilla y me despreocupé con las validaciones , pero con el código no da problemas... (bueno, también se puede probar de otras maneras... )

Al menos a mi no se me atasca (tal vez dependa de la versión o de la configuración)

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #27 (permalink)  
Antiguo 07/03/2006, 09:00
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Solamente pasé por acá para agradecer a los maestros caricatos y Myakire por su atención a este post.

Detallando lo sucedido:

Resulta que cansado de tratar de encontrar mis objetos insertados mediante innerHTML para validarlos, me dispuse a hacer una validación server side, cual sería mi sorpresa al ver que en firefox, al hacer submit a la forma, simplemente los campos no existían.

Hice una búsqueda exhaustiva(bueno, no tanto ), resulta que esos inputs insertados mediante innerHTML, no estarán accesibles para browsers basados en GECKO(Netscape, firefox and so on...), de hecho al parecer es todo un extraño que en IE se puedan manipular.

Me enteré también de los pormenores del innerHTML, y que no funcionará con XHTML estricto, y dos o tres cosas más.

La propuesta de solución encontrada por todos estos sitios es usar DOM para agregar estos elementos, el problema es que en lo personal se me hizo un poco complicado(sobra decir que mis conocimientos de javascript son limitados), y como no dispongo de mucho tiempo entonces busqué otros posibles "guorkaraunds".

Creo que la solución mas sencilla como siempre es la mejor, lo haré con layers escondidos, ya les contaré como resulto todo.

Gracias y hasta la próxima
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #28 (permalink)  
Antiguo 07/03/2006, 09:13
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola:

No sabía eso de mozilla, ¿será que suelo usar el DOM?
El tema de la inserción con DOM no es tan complicado... se crean los elementos con:
unDiv = document.createElement("div");// así se crea un tag div

y para añadirlo a un nodo (por ejemplo el body)
document.body.appendChild(unDiv);

Los estilos se añaden fácilmente...

unDiv.style.display = "block";

Otros atributos se pueden añadir con setAttribute(el_atributo, su_valor)...
y casos como el id o el name se pueden añadir directamente: elDiv.id = "xxx";
Si es el name se escribe en mayúsculas (elDiv.NAME...)

Bueno, cuando retomes el tema te lo explicaremos mejor.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
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 16:10.