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 (i = 0; i < formulario.elements.length; i++)
{
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