2014-11-04 4 views
0

Я пытаюсь проверить значение ввода с помощью AJAX. Каждый раз, когда пользователь нажимает клавишу AJAX, отправляется, а затем на основе результата с сервера я добавляю к вводу допустимый или недопустимый класс.jQuery AJAX: неожиданный конец ввода

.js:

$("input[name=username]").keyup(function(event) { 
    processAJAXCheck(this,"username"); 
}); 

$("input[name=username]").change(function(event) { 
    processAJAXCheck(this,"username"); 
}); 

function processAJAXCheck(element, toCheck) { 
    contentOfInput = $(element).val(); 

    $.ajax({ 
     url: "ajax.php", 
     type: "POST", 
     data: {content: contentOfInput, toCheck: toCheck}, 
     success: afterAJAXResponse 
    }); 
} 

function afterAJAXResponse(data) { 
    result = $.parseJSON(data); 

    if(result['toCheck'] != undefined) { 
     inputSelector = 'input[name='+result['toCheck']+']'; 
     if(result['result'] == true) { 
      $(inputSelector).removeClass('invalid'); 
      $(inputSelector).addClass('valid'); 
      formValid = true; 
     } else { 
      $(inputSelector).removeClass('valid'); 
      $(inputSelector).addClass('invalid'); 
      formValid = false; 
     } 
    } 

    result = null; 
} 

PHP код:

if(isset($_POST['toCheck']) && isset($_POST['content']) 
    && $_POST['toCheck'] != "" && $_POST['content'] != "") 
{ 
    require_once 'classes/AAA.php'; 
    require_once 'classes/Database.php'; 
    require_once 'etc/settings.php'; 

    $db = new Database($GLOBALS['db_server'],$GLOBALS['db_name'],$GLOBALS['db_user'],$GLOBALS['db_pass']); 
    $aaa = new AAA($db); 

    switch($_POST['toCheck']) 
    { 
     case 'email': 
      $output['result'] = $aaa->isUsableEmail($_POST['content']); 
      $output['toCheck'] = 'email'; 
      break; 
     case 'username': 
      $output['result'] = $aaa->isUsableUsername($_POST['content']); 
      $output['toCheck'] = 'username'; 
      break; 
     default: 
      $output['result'] = 'error'; 
      break; 
    } 

    echo json_encode($output); 
} 

Странным является то, что все работает без проблем при нажатии на любую клавишу символа. Но когда я нажимаю «Tab», чтобы переключиться на другой вход (который использует ту же самую функцию, но не возвращает ошибку - и когда я нажимаю Tab там!) Я получаю следующее сообщение об ошибке:

Uncaught SyntaxError: Unexpected end of input b.extend.parseJSON 
jquery-1.9.1.min.js:3 afterAJAXResponse 
registration.php?school_id=1&department_id=1:189 b.Callbacks.c 
jquery-1.9.1.min.js:3 b.Callbacks.p.fireWith jquery-1.9.1.min.js:3 k 
jquery-1.9.1.min.js:5 b.ajaxTransport.send.r 

Спасибо за ваш ответы заранее.

+0

Добавить DATATYPE: «» –

+0

JSON Я не думаю, что это вызывает проблемы в этом коде, но вы должны объявлять локальные переменные 'var', например, 'var contentOfInput = ...' – Barmar

+0

@ADASein Если он это делает, он должен удалить явный вызов '$ .parseJSON'. – Barmar

ответ

0

Спасибо всем за ваши советы!

И, наконец, добавление dataType в $ .AJAX() помогло! Я добавил dataType: «json» в вызов AJAX и удалил .parseJSON() из обратного вызова, и я больше не испытываю никаких ошибок.

Опять же, спасибо большое @ADASein

1

Я предполагаю, что вы не хотите называть свою функцию ajax при нажатии клавиши табуляции. Тем не менее, вы не проверяете это, и keyup захватывает ваше событие щелчка на вкладке.

Вы должны изменить:

$("input[name=username]").keyup(function(event) { 
    processAJAXCheck(this,"username"); 
}); 

к чему-то вроде:

$("input[name=username]").keyup(function(event) { 
    if (event.keyCode !== 9) { // I think it's 9... 
    processAJAXCheck(this,"username"); 
    } 
}); 

Вы также можете добавить ввести - 13 - например.

+0

Я не возражаю, если я проверю его на «действие TAB» или нет, потому что он будет, хотя и проверен слушателем .change. Я просто хочу предотвратить эту ошибку. –

1

Вы можете либо проверить код ключа, как описано Jeroen (который спасет вас от звонка на сервер), либо вернуть пустой скрипт (json encoded) из вашего php-скрипта, когда post проверяет значение false.

+0

Вы правы, я не проверял php достаточно хорошо, чтобы убедиться, что ничего не возвращается, если первое условие не выполняется. Независимо от использования моего решения, это всегда должно быть сделано. – jeroen

+1

@jeroen В конце концов, у Honza теперь достаточно опций/указателей, чтобы исправить проблему как на стороне клиента, так и на стороне сервера :). – Barry

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