我在这里看到了很多例子,并且已经尝试了几个小时让他们上班但似乎无法弄清楚我做错了什么。我对jquery和ajax很新,所以请你好。
我正在尝试使用smartWizard jquery插件。这是一些代码
function validateStep1()
{
var isValid = true;
// validate first_name
var first_name = $('#first_name').val();
if(!first_name && first_name.length <= 0)
{
isValid = false;
$('#msg_first_name').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_first_name').html('').hide();
}
// validate last_name
var last_name = $('#last_name').val();
if(!last_name && last_name.length <= 0)
{
isValid = false;
$('#msg_last_name').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_last_name').html('').hide();
}
// validate address
var address = $('#address').val();
if(!address && address.length <= 0)
{
isValid = false;
$('#msg_address').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_address').html('').hide();
}
// validate city
var city = $('#city').val();
if(!city && city.length <= 0)
{
isValid = false;
$('#msg_city').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_city').html('').hide();
}
// validate county
/*
var county = $('#county').val();
if(!county && county.length <= 0)
{
isValid = false;
$('#msg_county').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_county').html('').hide();
}
*/
// validate state
var state = $('#state').val();
if(!state && state.length <= 0)
{
isValid = false;
$('#msg_state').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_state').html('').hide();
}
// validate postal
var postal = $('#postal').val();
if(!postal && postal.length <= 0)
{
isValid = false;
$('#msg_postal').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_postal').html('').hide();
}
// validate home_phone
var home_phone = $('#home_phone').val();
if(!home_phone && home_phone.length <= 0)
{
isValid = false;
$('#msg_home_phone').html('<?php echo $LANG['field_this_required'] ?>').show();
}
else
{
$('#msg_home_phone').html('').hide();
}
if(isValid==true)
{
document.getElementById('step_num').value=1;
loading('<?php echo $LANG['saving']; ?> ',1);
$.post('editprofile.php',$('#editProfile').serialize(),function(data)
{
unloading();
if(!data)
{
isValid = false;
$('#msg_step-1').html("<p style='font-weight:bold;color:#ff0000'><?php echo $LANG['database_update_error']; ?></p>").show();
}
else if(data.status !=1 )
{
isValid = false;
alert(data.message);
$('#msg_step-1').html("<p style='font-weight:bold;color:#ff0000'>"+data.message+"</p>").show();
}
else
{
$('#msg_step-1').html("<p style='font-weight:bold;color:#ff0000'>"+data.message+"</p>").show();
isValid = true;
}
},'json')
.done(function() { alert("done "+isValid); return isValid;})
.fail(function() { alert("fail "+isValid); return isValid;})
;
}
else
{
return isValid;
}
//Commented out the return so that it will only return when done above.
//return isValid;
}
还有其他代码可以检查此函数的返回值并相应地执行操作。
如果任何初始验证检查失败,则其他代码不会执行,因为变量isValid
设置为false,这是返回的内容。我的问题是发布到editprofile.php - 代码移动,就好像函数返回了一个真值,即使它还没有返回任何东西。它仍然继续执行$.post
部分中的代码,但只有在此函数之外的其他代码运行之后才会执行。
我理解代码是以异步方式运行的;但是,我很困惑为什么WITHOUT EXCEPTION它会在false
之类的任何检查返回false值时始终获得$('#address').val()
值;但是,它不会从$.post
代码中获取它。为什么要等待所有这些返回值但不等待$.post
代码?
我也对调用代码在返回值之前如何操作感到困惑。
为了记录,这里是调用该函数的代码:
function leaveAStepCallback(obj){
var step_num= obj.attr('rel');
return validateSteps(step_num);
}
function validateSteps(step)
{
var isStepValid = true;
// validate step 1
if(step == 1){
if(validateStep1() == false ){
isStepValid = false;
$('#wizardvalidate').smartWizard('showMessage','Please correct the errors in step'+step+ ' and click next.');
$('#wizardvalidate').smartWizard('setError',{stepnum:step,iserror:true});
}else{
$('#wizardvalidate').smartWizard('setError',{stepnum:step,iserror:false});
}
}
// validate step 2
if(step == 2){
if(validateStep2() == false ){
isStepValid = false;
$('#wizardvalidate').smartWizard('showMessage','Please correct the errors in step'+step+ ' and click next.');
$('#wizardvalidate').smartWizard('setError',{stepnum:step,iserror:true});
}else{
$('#wizardvalidate').smartWizard('setError',{stepnum:step,iserror:false});
}
}
// validate step3
if(step == 3){
if(validateStep3() == false ){
isStepValid = false;
$('#wizardvalidate').smartWizard('showMessage','Please correct the errors in step'+step+ ' and click next.');
$('#wizardvalidate').smartWizard('setError',{stepnum:step,iserror:true});
}else{
$('#wizardvalidate').smartWizard('setError',{stepnum:step,iserror:false});
}
}
return isStepValid;
}
再次,我是所有这一切的新手,所以请你好! :)
答案 0 :(得分:0)
正如您在问题中所说,$.post
异步。
它的回调只会在服务器回复时运行,这可以保证在其余代码完成执行后的一段时间。
答案 1 :(得分:0)
我面对同样的问题,经过几个小时的拔毛后解决了......
var stpflag = false;
function validateSteps(step){
var isStepValid = true;
// validate step 1
if(step == 1){
var returnstatus = savefunctionality();
if((returnstatus == false ) && (stpflag== false)){
isStepValid = false;
$('#wizard').smartWizard('showMessage','Please correct the errors in step'+step+ ' and click next.');
$('#wizard').smartWizard('setError',{stepnum:step,iserror:true});
// $('#wizard').smartWizard.prototype.goBackward();
}else if((returnstatus == false ) && (stpflag== true)){
isStepValid = true;
$('#wizard').smartWizard('setError',{stepnum:step,iserror:false});
$('#wizard').smartWizard('hideMessage','');
showstep2(); // here write your logic for render next page on step-2 div.
stpflag=false;
}
}
return isStepValid;
}
function savefunctionality() {
var returnVal = false;
$。AJAX(
{
type: 'POST',
dataType: 'json',
url: '/mainfolder/folder/savepage/',
async: true,
data: values,
success: function(json) {
$("#error_msg").html("");
if(json.result.errors != undefined){
if(json.result.errors.length > 0){
itemData = json.result.errors;
returnVal = false;
stpflag = false;
}
} else if(json.result == 1){
returnVal = true;
stpflag = true;
$('a.buttonNext').trigger('click');
}
}
});
return returnVal;
}
这里我使用了两个变量 1. returnVal:总是返回false 2. stpflag:创建了一个新的全局变量stpflag。
明确触发了下一个按钮。
希望也适合你