Hola:
No sé porqué no funciona con el evento submit del formulario... tal vez se produzca algún error, pero lo correcto es un botón submit sin más y en el tag form onsybmit="validar(this)"... lo del this es para pasar el mismo formulario como parámetro, para simplificar el código.
En este artículo:
El abc de los formularios hay información sobre validaciones.
Saludos