2010-09-22 3 views
0

У меня очень ограниченный опыт jQuery, и мне было интересно, можете ли вы помочь мне с функцией, которая должна проверять с помощью запроса AJAX, если существует адрес электронной почты.Функция jQuery для проверки наличия адреса электронной почты

До сих пор у меня этот кусок кода для проверки электронной почты:

$('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!'); 
     } 
    }); 
}); 

Как я могу сделать функцию из этого и использовать его как это:

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

Мой PHP код выглядит следующим образом это:

$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'; 
} 

спасибо.

+0

Вы хотите, чтобы этот вид вызова был асинхронным (A в AJAX). Это означает, что вы не хотите связывать приложение, ожидающее возврата вызова. Использование функции «email_exists» и ожидание ее возврата не является * управляемым событиями программированием *. Создайте функцию, называемую 'check_email_exists', и выполните эту функцию' .show() 'или просто обработайте' blur'. – webbiedave

+0

@webbiedave: Я попытался с размытием и поместил проверку вне $ ('# form'). Submit (function (e) {}); и он отлично работает, но если вы отправите форму, ошибка исчезнет. – Psyche

ответ

2

Если вы действительно должны иметь ответ возвращается из функции синхронно, вы можете использовать синхронный XMLHttpRequest вместо обычного асинхронного одного («A» в 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'; 
} 

Однако это сильно обескуражен, так как он заставит браузера повесить трубку, пока он ждет ответа, что довольно недружелюбно.

(нб: также, передать объект data, чтобы JQuery справиться с форматированием для вас В противном случае, вам нужно будет сделать 'email='+encodeURIComponent(email) явно.).

Вы не можете иметь функцию, которая синхронно возвращающую значение из асинхронного действия или наоборот (для этого вам понадобятся потоки или совместные подпрограммы, а в JavaScript нет). Вместо этого включите асинхронное программирование и верните результат обратно в обратный вызов:

$('#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

Я понимаю, спасибо. – Psyche

1

Вы уже сделали это «функцией», присоединив его к событию размытия вашего ввода. Я бы просто

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

Я знаю, но я хочу сделать его другой функцией. – Psyche

Смежные вопросы