Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > HTML, Javascript y otros
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Saber si existe una variable

Esto me da vergüenza preguntarlo pero llevo toda la mañana buscando y no he encontrado nada.

¿Cómo puedo saber en JavaScript si una variable existe o no? Algo así como el equivalente a isset de PHP.

// Gracias
Responder Con Cita
  #2  
Antiguo 04-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Bah! Parece que esto no es posible en javascript, lo cual es sorprendente en un lenguaje interpretado. La única forma que funciona es con sentencias try-catch:

Código PHP:
try
{
  
alert(foo);
}
catch (
error)
{
  
alert('La variable foo no está definida');

Aunque no me convence mucho usar excepciones para esto.

Afortunadamente, más que para una variable suelta yo lo quería para propiedades de objetos (pensé que sería lo mismo) y en ese caso sí se puede:


Código PHP:
if (!objeto.getAttribute('foo'))
{
  
alert('La propiedad foo no está definida');

Si a alguien le da curiosidad saber para qué quería esto les cuento la historia y quizá a alguien le sirva.

Como me harta estar escribiendo funciones para validar formularios hice resumen de lo que generalmente necesito al momento de validar un control:

1. Checar que se haya llenado el dato
2. Checar que tenga la longitud adecuada
3. Checar que tenga el formato correcto

En cada caso, si algo está mal hago algo similar a esto:


Código PHP:
alert('Formato incorrecto (correo electrónico)');
control.focus(); 
donde control es el control que se está validando.

Para la validación tengo que checar que

1. control.value no sea una cadena vacía
2. ereg.exec(control.value) no sea false
3. control.value.length coincida con la longitud esperada

Aquí ereg es una expresión regular para checar el formato, por ejemplo:

/[0-9]{4}-[0-9]{2}-[0-9]{2}/

checa que una fecha tenga el formato aaaa-mm-dd (más o menos).

Entonces, lo único que se requiere son cuatro cosas:

1. Mensaje a mostrar en caso de error
2. Saber si el dato es requerido o no
3. Expresión regular para checar el formato
4. Longitud esperada

En JavaScript podemos asignar propiedades nuevas a objetos:


Código PHP:
fecha.required true;
fecha.caption 'Fecha de nacimiento';
fecha.ereg = /[0-9]{4}-[0-9]{2}-[0-9]{2}/ 
Estas asignaciones las podemos hacer en el evento onLoad de la página HTML.

Para, por ejemplo, checar el formato usaríamos esta función:


Código PHP:
function check_format(control)
{
  
// si el atributo no existe es que no se requiere checar formato
  
if (!control.getAttribute('ereg'))
    return 
true;

  if (!
control.ereg.exec(control.value))
  {
    
alert('Dato con formato incorrecto: ' control.caption);
    
control.focus();

    return 
false;
  }

  return 
true;

Similarmente tendríamos funciones check_empty() y check_length() para verificar si el control está vacío o no. check_empty() primero verificaría la existencia del atributo 'required'. Si no existe o es false supone que no se requiere el dato y regresa true.

Como todas las funciones necesitan de la propiedad 'caption' para mostrar el mensaje de error, agrupo todas las verifiicaciones en esta función:


Código PHP:
function check_control(control)
{
  if (!
control.getAttribute('caption'))
    
control.caption control.name;

  
ok =
    
check_empty(control) &&
    
check_length(control) &&
    
check_format(control);

  return 
ok;

Así, únicamente tengo que iterar la función check_control() sobre todos los controles del formulario:


Código PHP:
function check_form(formulario)
{
  var 
ok true;

  for (
0formulario.elements.lengthi++)
  {
    
ok check_control(formulario.elements[i]);
    if (!
ok) break;
  }

  return 
ok;

Y así, el evento onSubmit() del formulario se reduce a:


Código PHP:
function form_submit(formulario)
{
  return 
check_form(formulario);

Claro que esto sólo sirve para validaciones sencillas aunque yo normalmente es lo que necesito ya que las validaciones complejas se hacen del lado del servidor.

// Saludos
Responder Con Cita
  #3  
Antiguo 04-06-2005
Avatar de JavierB
JavierB JavierB is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 99
Poder: 22
JavierB Va por buen camino
Hola roman

Para saber si una variable JavaScript existe, peudes usar esto:
Código PHP:
if(typeof foo=='undefined')
  
alert('no definida'); 
Saludos,
__________________
Lo importante no es saber, sino tener el e-mail del que sabe.
Responder Con Cita
  #4  
Antiguo 04-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Gracias JavierB. Lo he probadoy funciona bien. También me he dado cuenta que funciona así:

Código PHP:
if (foo == null)
  
alert('no definida'); 
y ambas maneras funcionan también para propiedades de un objeto.

// Saludos
Responder Con Cita
  #5  
Antiguo 05-06-2005
Avatar de JavierB
JavierB JavierB is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 99
Poder: 22
JavierB Va por buen camino
Hola de nuevo.

Con tu código me da error: 'foo' no está definido

Saludos,
__________________
Lo importante no es saber, sino tener el e-mail del que sabe.
Responder Con Cita
  #6  
Antiguo 07-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Gracias Javier.

En efecto marca ese error. Yo creo que de tantas pruebas que hice me confundí o no sé. Me quedo con el typeof.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:21:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi