2014-11-04 162 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

添加数据类型:“JSON” – 2014-11-04 21:26:10

+0

我不认为这是在这段代码引起问题,但你应该用'var',例如声明局部变量'var contentOfInput = ...' – Barmar 2014-11-04 21:27:54

+0

@ADASein如果他这样做,他必须删除显式调用'$ .parseJSON'。 – Barmar 2014-11-04 21:29:05

回答

0

谢谢大家的意见!

最后,将数据类型添加到$ .AJAX()帮助!我添加了dataType:'json'到AJAX调用中,并从回调中删除了.parseJSON(),并且我不再遇到任何错误。

再次感谢你这么多@ADASein

1

我假设你不想在按Tab键的时候调用你的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侦听器检查。我只是想防止这个错误。 – 2014-11-06 06:20:03

1

您可以检查Jeroen描述的关键代码(这会节省您对服务器的调用),或者在检查结果为false时从PHP脚本返回空数组(json编码)。

+0

你说得对,我没有足够的检查php,看看没有任何回应,如果第一个条件没有得到满足。无论使用我的解决方案,总是应该完成。 – jeroen 2014-11-04 21:50:04

+1

@jeroen最后,Honza现在有足够的选项/指针来解决客户端和服务器端的问题:)。 – Barry 2014-11-04 21:55:55