1

ここで多数の例を見て、それらを機能させるために何時間も試みましたが、何が間違っているのかわかりません。私は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が、この関数の外部にある他のコードが実行された後にのみ実行されます。

コードが非同期で実行されることを理解しています。falseただし、次のようなチェックのいずれかが$('#address').val()false値を返す場合に、例外なしで常に値を取得する理由について混乱しています。ただし、$.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;
        }

繰り返しになりますが、私はこれらすべてに慣れていないので、よろしくお願いします!:)

4

2 に答える 2

0

あなたの質問で言ったように、$.post非同期です。

そのコールバックは、サーバーが応答したときにのみ実行されます。これは、残りのコードの実行が終了してからしばらく時間がかかることが保証されています。

于 2013-03-08T21:10:50.360 に答える
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;
}

関数保存機能() {

    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;
}

ここで使用した 2 つの変数 1. returnVal: 常に false を返します 2. stpflag: 新しいグローバル変数 stpflag を作成しました。

次のボタンを明示的にトリガーしました。

希望もあなたのために働くでしょう

于 2013-05-22T07:20:20.163 に答える