2011-08-12 33 views
1

该线程出现了一个新问题:jquery form validator never makes ajax call,因为从ajax请求返回的数据是准确的,但它在比较时总是失败。这是使得AJAX请求的代码:从ajax返回的数据总是失败==比较?

var pass_form = $('#pass_form'); 
pass_form.submit(valid_pass_sett); 

function valid_pass_sett() { 
    //remove old errors - snipped 
    pass_old = $('input[name=pass_old]').val(); 
    pass_new = $('input[name=pass_new]').val(); 
    pass_confirm_new = $('input[name=pass_confirm_new]').val(); 

    if (pass_old === "") { 
     //display error on form - snipped 
     return false; 
    } else if (pass_new === "") { 
     //display error on form - snipped 
     return false; 
    } else if (pass_new != pass_confirm_new) { 
     //display error on form - snipped 
     return false; 
    } else if (pass_new.length < 8) { 
     //display error on form - snipped 
     return false; 
    } else { 
     $.post("http://www.example.com/ajax/validate.php",{ // async validation 
      type: 'valid_old_change_pass', 
      pass_old: pass_old, 
      pass_new: pass_new 
     }, valid_pass_combo_callback); 
     alert('after the ajax call...'); 
    } 
    return false; // cancel form submission 
} 

这是该请求被提交到的代码:

$username = $_SESSION['username']; 
$pass_old = $_POST['pass_old']; 
$pass_new = $_POST['pass_new']; 
if (empty($pass_old) || empty($pass_new)) { 
    echo "invalid"; 
} else if (!User::valid_user_pass($username, $pass_old)) { 
    echo "invalid_old"; 
} else if (!Sanitize::is_legal_password($pass_new)) { 
    echo "invalid_new"; 
} else { 
    echo "valid"; 
} 

,这是回调函数对其进行处理;回调函数是比较总是失败的函数。

function valid_pass_combo_callback(data) { 

//breakpoint is set here 
    if (data == 'valid') { 
     //only if the form is valid! 
     pass_form[0].unbind('submit').submit(); 
    } 
    else if (data == "invalid_old") { 
     //display error on form - snipped 
    } 
    else if (data == "invalid_new") { 
     //display error on form - snipped 
    } 
    else { 
     //it always jumps to here..., even though data *is* the correct value 
    } 
} 

我调试此代码,和validate.php正在返回"invalid_old"这是正确的(基于测试数据我进入)。因此,根据Firebug,data正在存储"invalid_old";然而,代码总是跳转到最后一个else语句。为什么比较总是失败?

+2

试着做一个破发点中的回调和设置表达式'数据==“invalid_old”'手表。它说什么?我怀疑这可能是一个不正确的案例,或者有时难以看到的事情。 – FishBasketGordo

+1

也许你的服务器在'invalid_old'后返回一个换行符。下载Charles代理的试用版(如果您使用的是ajax,则为一个不可缺少的工具),并检查服务器返回的数据的十六进制视图。 –

+0

我没有使用Charles代理,但我添加了一个'trim'函数给validate.php,并解决了这个问题。非常感谢您的帮助! –

回答

0

正如评论指出,加入JQuery的trim功能解决了这一问题,如图所示:

function valid_pass_combo_callback(data) { 
    trimmed_data = $.trim(data); 
    if (trimmed_data == 'valid') { 
     //only if the form is valid! 
     pass_form[0].unbind('submit').submit(); 
    } 
    else if (trimmed_data == "invalid_old") { 
     //display error on form - snipped 
    } 
    else if (trimmed_data == "invalid_new") { 
     //display error on form - snipped 
    } 
    else { 
     //it always jumps to here..., even though data *is* the correct value 
    } 
} 
+0

很高兴知道你做了什么。 – nottinhill

+0

@StephanKristyn我认为这是我使用的代码。我不再有权访问这个代码库(不同的工作场所),但我相信这是我使用的。 –

+0

@StephanKristyn我的编辑添加了您需要的信息吗? –

1

尝试暂时放置支票上方的alert(data.toString());以查看其返回的内容。如果它不是字符串本身,那么它不会返回您所期望的数据。