Infatti sta succedendo questo.
La funzione viene raggiunta prima che Ajax mi dia il response.
Ciao, il problema di fondo è appunto questo.
Come è già stato spiegato, AJAX è asincrono (se non diversamente specificato), a grandi linee, questo significa che il submit è già stato eseguito quando avviene quel success.
Tra l'altro il return restituisce il valore alla funzione in cui questo è posto (come accennava Andrea); per cui, nel tuo caso il false viene restituito alla funzione success, non a validazione (come invece dovrebbe essere per annullare l'effetto del submit). Ma in entrambe i casi sarebbe totalmente inutile per il motivo iniziale.
Una soluzione potrebbe essere quella di impostare AJAX come "sincrono", ma questo in generale è fortemente sconsigliato. Non sto a spiegarti il perché.
Per risolvere potresti usare un semplice pulsante, come indicato da Ciro, al posto del submit; quindi eseguire la funzione validazione al click di tale pulsante e forzare poi il submit al success della chiamata AJAX, ovviamente solo quando ottieni una risposta valida.
Qui un semplice esempio (che andrà correlato dei relativi file php):
codice:
<!DOCTYPE HTML>
<html>
<head>
<title>Esempio</title>
<meta charset="utf-8">
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$(function(){
$('#mysubmit').click(function(){validazione($('#myform'))}); // Evento click del falso submit
function validazione($form){
/*
qui i vari controlli preliminari
*/
var email = $("#email").val();
$.ajax({
type: 'post',
url: 'sezione/registrazione/checkemail.php',
data: {
user_email:email
},
success: function (response) {
if(response == '0') $form.submit(); // Se risposta valida, eseguo il submit
else alert('Email già esistente');
},
error: function (){alert('Impossibile connettersi al server')}
});
}
})
</script>
</head>
<body>
<form id="myform" action="dataprocess.php" method="post" >
<!-- qui gli elementi del form -->
<input id="email">
<input id="mysubmit" type="button" value="Invia"><!-- questo è un falso submit -->
</form>
</body>
</html>
Chiaramente non c'è bisogno di ricordare che tutti i dovuti controlli eseguiti via JavaScript, lato client, andrebbero rieseguiti lato server.