2014-01-05 3 views
1

Я занимаюсь разработкой веб-сайта, и прямо сейчас его регистрационная форма! Но у меня есть что-то вроде проблемы! Я хочу создать поле ввода пользователя, и когда пользователь печатает, проверьте, существует ли имя пользователя в базе данных и дает какой-то результат.

Ошибка в этом: предположим, что в базе данных есть только имя пользователя «Manuel». Если я набираю «Мануэль» в поле ввода, сообщение не отображается. Теперь, если я набираю какой-либо другой символ, он дает мне сообщение «Пользователь уже существует». Если я удалю последний напечатанный символ, сообщение исчезнет. Если я снова наберу и что-то вроде «Мануэла», появится сообщение, если я снова наберу и у вас «Manuelae» сообщение исчезнет

Спасибо за помощь!

Вот код

Здесь поле ввода: (register.php)

<input type="text" id="username" name="username" maxlength="40" required="required"> 
<span id="username-info">What's your username?</span> 

Здесь Javascript и JQuery код (registration.js)

$(document).ready(function() { 

    var userExists = new Boolean(); 

    var username = $("#username"); 
    var usernameInfo = $("#username-info"); 

    username.keyup(validateUsername); 

} 

Здесь функция validateUsername():

function validateUsername(){ 
    checkUsername(); 
    var minlenght = 5; 
    var usernameVal = username.val(); 
    if(usernameVal.length < 1){ 
     usernameInfo.addClass("input-error"); 
     usernameInfo.text(messages.FIELD_REQUIRED); 
    } else if(usernameVal.length < minlenght){ 
     usernameInfo.addClass("input-error"); 
     usernameInfo.text(messages.USERNAME_MIN_WORDS+minlenght+' '+messages.USERNAME_CHARACTERS); 
    } else if(userExists){ 

     //here i tell the user that the user already exists 
     usernameInfo.addClass("input-error"); 
     usernameInfo.text('The user already exists'); 

    } else { 
     usernameInfo.removeClass("input-error"); 
     usernameInfo.text(""); 
    } 

} 

А вот функция checkUsername():

function checkUsername() { 
     var url = 'processregistration.inc.php'; 

     $.ajax({ 
      type: "POST", 
      dataType:"json", 
      url: url, 
      data: {username: username.val()}, 
      success: function(data){ 

       userExists = data.CHECK; //true if the user exists, false if not 

      } 
     }); 
    } 
+1

Используйте console.log(), чтобы отобразить данные, отправленные и полученные. Это может помочь найти ошибку. Кстати, не следует ли вам вызывать шоу, когда вы получите ответ? – Tigran

ответ

0

Ajax означает Asynchronous JavaScript и XML.

Вы делаете проверку на значение, которое на самом деле не получено.

Вы должны сделать что-то вроде этого:

function validateUsername() { 
    // remove input-error, text 

    if (...localcheck...) { 
     // add input-error, text 
    } 
    else if (...otherlocalcheck...) { 
     // add input-error, text 
    } 
    else { 
     $.ajax({ 
      ... 
      success : function(data) { 
       if (data.CHECK) { 
        // add input-error, text 
       } 
      } 
     }); 
    } 
} 
+0

Спасибо, что он работает сейчас !!! – Manuel

+0

Добро пожаловать. Не забудьте принять или +1 ответ, если это помогло :). –

+0

Эй! Я новичок здесь, как я могу принять два ответа? оба были полезны :) и когда я нажимаю +1, он говорит, что ему нужна репутация +15 и возвращается к 0! – Manuel

0

Я думаю, вы на правильном пути, но я не думаю, что ваша реализация является правильным.

Примечание: Я не герой Javascript

$("#filter").keyup(function(e) { 

var filter = $("#filter").val(), 
    timer = $('#filter').data('timeout'), 

if(timer) { 
    clearTimeout(timer); 
    $('#username').removeData('timeout'); 
} 

$('#username').data('timeout', setTimeout(function() { 
    var url = 'processregistration.inc.php'; 

    $.POST(url, {username: $('#username').val()}, function(data) { 
     // you get the picture ;) 
     updateComponentThatShowsIfUserNameIsTakenFunction(data.CHECK); 
    }); 
}, 100)); 

function updateComponentThatShowsIfUserNameIsTakenFunction(taken) { 
    $('#username').addClass('input_error'); 
} 

Что я сделал: Удалены глобальные переменные, они раздражают и ошибок. Вместо этого я использую обратный вызов с именем updateComponentThatShowsIfUserNameIsTakenFunction. Вы также можете изменить его, чтобы напрямую вызвать эту функцию с «данными», конечно. Я также добавил тайм-аут для вас, так что вы не будете называть сервер КАЖДОЙ клавиатурой. Каждый тайм-аут отменяет предыдущий тайм-аут, заставляя проверку запускать только 100 мс после того, как пользователь набрал текст (вы не хотите спамить свой сервер).

Надеюсь, это сработает и поможет вам!

+0

В коде есть некоторая ошибка, кроме объявления переменных :(Я следовал за концом Smoky, но эта часть интервала очень интересна! Разве это не будет то же самое, если использовать функцию интервала set? SetInterval (function () { \t \t \t \t $ .ajax ({ \t \t \t \t \t типа: "POST", \t \t \t \t \t DATATYPE: "JSON", \t \t \t \t \t URL: «processregistration.inc.p л.с.», \t \t \t \t \t данные: {имя пользователя: username.val()}, \t \t \t \t \t успеха: функция (данные) { \t \t \t \t \t \t если (data.CHECK == верно) { \t \t \t \t \t \t \t usernameInfo.addClass ("input-error"); \t \t \t \t \t usernameInfo.text (messages.USERNAME_EXISTS); \t \t \t \t \t \t \t Входы [0] = 0; \t \t \t \t \t \t} \t \t \t \t \t} \t \t \t \t}); \t \t}, 5000); // 5 секунд – Manuel

+0

Я бы рекомендовал использовать $ .POST для упрощения. Это выглядит почти так же. Я также рекомендую использовать менее 5 секунд, вы не хотите, чтобы пользователь ждал около 5 секунд до начала запроса. 100 мс достаточно, чтобы помешать нормальным темпам от спама вашего сервера. Если вы хотите играть безопасно, поставьте его на 250, что составляет 4 раза в секунду (это уже очень медленно). –

+0

Я немного изменил его, и он отлично работает! Огромное спасибо! var globalTimeout = null; if (globalTimeout! = null) { \t \t \t \t clearTimeout (globalTimeout); \t \t \t} \t \t \t globalTimeout = SetTimeout (функция() { \t \t \t \t globalTimeout = NULL; \t \t \t \t $ .ajax ({ \t \t \t \t \t типа: "POST", \t \t \t \t \t dataType: "json", \t \t \t \t \t url: 'processregistration.inc.PHP», \t \t \t \t \t данные: {имя пользователя: username.val()}, \t \t \t \t \t успеха: функция (данные) { \t \t \t \t \t \t если (data.CHECK == верно) { \t \t \t \t \t \t \t usernameInfo.addClass ("input-error"); \t \t \t \t \t usernameInfo.text (messages.USERNAME_EXISTS); \t \t \t \t \t \t \t Входы [0] = 0; \t \t \t \t \t \t} \t \t \t \t \t} \t \t \t \t}); \t \t \t}, 100); – Manuel

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