2010-09-22 5 views
0

J'ai une expérience jQuery très limitée et je me demandais si vous pouviez m'aider avec une fonction qui doit vérifier, avec une requête AJAX, si une adresse e-mail existe ou non.Fonction jQuery pour vérifier si une adresse e-mail existe

Jusqu'à présent j'ai ce morceau de code pour le contrôle e-mail:

$('input#email').bind('blur', function() { 
    $.ajax({ 
     url: 'ajax/email.php', 
     type: 'GET', 
     data: 'email=' + $('input#email').val(), 
     cache: false, 
     success: function (html) { 
      if (html == 1) alert('Email exists!'); 
     } 
    }); 
}); 

Comment puis-je faire fonction de cela et l'utiliser comme ceci:

if (!email_exists($('input#email').val())) { 
    $('#error_email').text('Email exists').show(); 
    return false; 
} 

Mon code PHP ressemble ceci:

$email = ($_GET['email']) ? $_GET['email'] : $_POST['email']; 

$query = "SELECT `id` FROM `users` \n"."WHERE `users`.`email` = '".mysql_real_escape_string($email)."'"; 
$result = mysql_query($query); 

if (mysql_num_rows($result) > 0) { 
    echo '1'; 
} else { 
    echo '0'; 
} 

Merci.

+0

Vous voulez que ce type d'appel soit asynchrone (le A dans AJAX). Cela signifie que vous ne souhaitez pas bloquer l'application en attente d'un appel à renvoyer. L'utilisation d'une fonction 'email_exists' et l'attente de retour n'est pas une * programmation pilotée par événement *. Créez une fonction appelée 'check_email_exists' et demandez à cette fonction d'exécuter' .show() 'ou de simplement faire en sorte que' blur' la gère. – webbiedave

+0

@webbiedave: J'ai essayé avec le flou et placé la vérification en dehors du $ ('# form'). Submit (function (e) {}); et cela fonctionne bien, mais si vous soumettez le formulaire, l'erreur disparaît. – Psyche

Répondre

2

Si vous devez vraiment avoir une réponse retournée par la fonction synchrone, vous pouvez utiliser un XMLHttpRequest synchrone au lieu de l'asynchrone normal (le « A » en AJAX):

function email_exists(email) { 
    var result= null; 
    $.ajax({ 
     url: 'ajax/email.php', 
     data: {email: email}, 
     cache: false, 
     async: false, // boo! 
     success: function(data) { 
      result= data; 
     } 
    }); 
    return result=='1'; 
} 

Cependant, c'est fortement déconseillé car il va faire le navigateur raccrocher pendant qu'il attend la réponse, ce qui est assez peu convivial.

(nb: aussi, passer un objet à data pour laisser jQuery faire face à la mise en forme pour vous Sinon, vous devez faire 'email='+encodeURIComponent(email) explicitement..)

Vous ne pouvez pas avoir une fonction qui retourne une manière synchrone valeur d'une action asynchrone, ou vice versa (vous auriez besoin de threads ou de co-routines pour le faire, et JavaScript n'a ni l'un ni l'autre). Au lieu de cela, adoptez la programmation asynchrone et renvoyez le résultat à un rappel:

$('#email').bind('change', function() { 
    check_email($('#email').val(), function(exists) { 
     if (exists) 
      $('#error_email').text('Email exists').show(); 
    }); 
}); 

function check_email(email, callback) { 
    $.ajax({ 
     url: 'ajax/email.php', 
     data: {email: email}, 
     cache: false, 
     success: function(data) { 
      callback(data=='1'); 
     } 
    }); 
} 
+0

Je comprends, merci. – Psyche

1

Vous en avez déjà fait une "fonction" en l'attachant à l'événement de flou de votre saisie. Je voudrais juste

success: function(html) { 
    if (html == 1) 
    $('#error_email').text('Email exists').show(); 
    else 
    $('#error_email').hide(); 
} 
+0

Je sais, mais je veux faire une fonction différente. – Psyche

Questions connexes