我正在为我的最新项目开发此验证脚本,其中一个要求是它检查用户输入的值是否在数据库中,如果不是,则返回错误。
function validateSteps(){
var FormErrors = false;
for(var i = 1; i < fieldsetCount; ++i){
var error = validateStep(i);
if(error == -1)
FormErrors = true;
}
$('#formElem').data('errors',FormErrors);
}
function validateStep(step){
if(step == fieldsetCount) return;
var error = 1;
var hasError = false;
$('#formElem').children(':nth-child('+ parseInt(step) +')').find(':input:not(button)').each(function(){
var $this = $(this);
var valueLength = jQuery.trim($this.val()).length;
var inputValue = jQuery.trim($this.val());
var errorID = $this.attr('name') + "_err";
var errorPrepend = "<div class='rf_error' id='" + errorID +"'>";
var errorAppend = "</div>";
var errorMsg = "";
/* =================================
MORE VALIDATION STATEMENTS HERE
============================ */
if($this.is('.rf_GrpCode') && !hasError)
{
$.get("inc/scripts/formHandle.php", { GrpCode: inputValue, type: "groupCode" }, function(data) {
if(!data.GrpCode)
{
hasError = true;
errorMsg = "The code you have entered is invalid.";
}
}, "json");
}
if(hasError)
{
$this.css('background-color','#FFEDEF');
//alert("Has error: " + errorID);
if(errorMsg)
{
if($('#' + errorID).length)
{
$('#' + errorID).html(errorMsg);
}
else
{
$this.after(errorPrepend + errorMsg + errorAppend);
}
}
}
else
{
//alert("Has no error: " + errorID);
$('#' + errorID).remove();
$this.css('background-color','#FFFFFF');
}
});
var $link = $('#navigation li:nth-child(' + parseInt(step) + ') a');
$link.parent().find('.error,.checked').remove();
var valclass = 'checked';
if(hasError){
error = -1;
valclass = 'error';
}
$('<span class="'+valclass+'"></span>').insertAfter($link);
return error;
}
$('#registerButton').bind('click',function(){
if($('#formElem').data('errors')){
$.confirm({
'title' : 'Ooops!',
'message' : 'It appears some of the information you have entered is invalid. Please go back through the steps a amend the marked fields.',
'buttons' : {
'OK' : {
'class' : 'blue',
'action': function(){}
}
}
});
return false;
}
});
$ .get()请求本身工作正常,如果数据库中没有值的实例,将进入if语句。但是,一旦涉及到错误处理部分,它就不会获取我在if语句中设置的变量。
我可以理解它为什么不起作用,因为这些变量是在函数其余部分的范围之外设置的。不幸的是,据我所知,这是如何让这些变量最终被错误处理部分识别出来的。
希望有道理,
非常感谢任何帮助,谢谢,
林登
答案 0 :(得分:2)
问题是get
只是执行AJAX get请求的快捷方式。 AJAX是异步的,因此请在检查变量后返回请求。你有几个选择。通常情况下,我不鼓励阻止ajax呼叫(有点失败的目的),但如果这是在提交时发生,那么它可能是有道理的。
您可以将get
更改为ajax
并设置async: false
。这将等待请求完成后再继续。
如果你需要等待多个这样的调用,你应该看一下http://api.jquery.com/jQuery.when/,这将允许请求并行运行,但仍然等待所有操作完成后再继续。< / p>
答案 1 :(得分:0)
$.get()
请求是异步的。在响应进入后,您只需hasError
设置,这比您检查时要快很多。
答案 2 :(得分:0)
问题是,你的ajax调用是异步的。因此,在成功处理程序甚至设置if(hasError) {
的值之前,将执行条件检查hasError
。启动ajax调用后,您无法直接执行代码。取而代之的是成功监听器中的所有其他代码。
if($this.is('.rf_GrpCode') && !hasError)
{
$.get("inc/scripts/formHandle.php", { GrpCode: inputValue, type: "groupCode" }, function(data) {
if(!data.GrpCode)
{
errorMsg = "The code you have entered is invalid.";
$this.css('background-color','#FFEDEF');
//alert("Has error: " + errorID);
if(errorMsg)
{
if($('#' + errorID).length)
{
$('#' + errorID).html(errorMsg);
}
else
{
$this.after(errorPrepend + errorMsg + errorAppend);
}
}
}
else
{
//alert("Has no error: " + errorID);
$('#' + errorID).remove();
$this.css('background-color','#FFFFFF');
}
}, "json");
}
答案 3 :(得分:0)
get函数是异步的。您可以在答案到达之前处理结果。