Para anular el accionar de un evento, debes utilizar el método 
preventDefault, una vez neutralizado, puedes realizar las acciones que desees. 
El evento que se produce cuando se envía un formulario se llama 
submit, por lo que para realizar la validación, primero debes anularlo, luego realizas la validación y en base al resultado de esa operación, envías o no los datos del formulario. Un pequeño ejemplo.    
Código HTML:
Ver original- <form id = "ejemplo" action = "destino.php" method = "post"> 
-     Nombre:  <input type = "text" name = "nombre" id = "nombre" />
-     Edad:  <input type = "text" name = "edad" id = "edad" />
-     <input type = "submit" value = "Enviar" /> 
-   
Código Javascript
:
Ver original- var formulario = document.getElementById("ejemplo"), 
-     nombre = document.getElementById("nombre"), 
-     edad = document.getElementById("edad"), 
-     respuesta = document.getElementById("respuesta"), 
-     valido = true; 
-   
- formulario.addEventListener("submit", function(event){ 
-     event.preventDefault(); 
-     valido = nombre.length ? true : edad.length ? true : false; 
-   
-     if (valido){ 
-         var ajax = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP") || new ActiveXObject("Msxml2.XMLHTTP"), 
-             datos = "nombre=" + nombre.value + "&edad=" + edad.value; 
-   
-         ajax.open(this.getAttribute("method"), this.getAttribute("action"), true); 
-         ajax.onreadystatechange = function(){ 
-             if (ajax.readyState == 4){ 
-                 switch (ajax.status){ 
-                     case 200: 
-                         respuesta.innerHTML = ajax.responseText; 
-                     break; 
-   
-                     case 404: 
-                         respuesta.innerHTML = "Error: La página solicitada no existe"; 
-                     break; 
-   
-                     default: 
-                         respuesta.innerHTML = ajax.status; 
-                     break; 
-                 } 
-             } 
-         }; 
-   
-         ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
-         ajax.send(datos); 
-     } 
-     else 
-         alert("Debe de ingresar todos los datos en el formulario"); 
- }, false); 
En este pequeño ejemplo, tenemos un formulario con los campos 
nombre y 
edad, además de un botón que al pulsarlo, ejecutará el evento 
submit del formulario. Más abajo, hay un Div en el que se mostrará la respuesta del servidor puesto que haremos una petición asíncrona que es lo que leí que deseas hacer. 
En el código JS, tomo a todos los elementos por su Id y declaro una variable 
valido que será el comodín que usaremos para saber si los datos del formulario son válidos y así podamos realizar el envío de los mismos para su procesamiento. Su valor inicial será 
true. Enseguida, al ejecutarse el evento 
submit, lo anulo y proceso a realizar la validación; si se ingresaron datos en la caja del 
nombre, le asigno el valor 
true a la variable 
valido, caso contrario, le asigno 
false. El mismo procedimiento se repetirá para la caja de la 
edad. 
Una vez realizada esta validación, evaluamos el valor de la variable 
valido. Si es verdadera, es decir, 
true, realizamos la petición asíncrona (Ajax), caso contrario, muestro un mensaje de alerta en donde le indico al usuario que debe ingresar todos los datos en el formulario. La petición asíncrona es como cualquier otra, de modo que si conoces sobre el tema, no hay mucho que explicar. 
Este es sólo un ejemplo de validación para evitar que se envíen datos nulos, pero lo ideal es que realices otro tipo de validaciones, como del formato de los datos y caracteres ingresados, haciendo uso de expresiones regulares para validar la información. 
Saludos