2011-08-12 21 views
0

這部分是從這個線程的延續:jquery - return value from callback function (in post request) into the function its inside of? 因爲我更新了代碼,但麻煩依然存在。我使用jQuery驗證了一個簡單的html表單,儘管我的其他if/else語句正常工作,但ajax調用永遠都不會發生。這裏是javascript代碼:jquery表單驗證器從不讓阿賈克斯調用

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 
} 

和這裏的validate.php的相關部分:

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

當我使用Firebug調試,和所有其他形式的投入是正確的,該腳本到達Ajax調用,那麼提交表單,即使它應該調用回調函數。這是一個回調函數的代碼:

function valid_pass_combo_callback(data) { 
    if (data == 'valid') { 
     //only if the form is valid! 
     pass_form[0].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 
    } 

} 

編輯終極版:好吧,我在我的回調函數固定錯誤,因爲在第一個答案看到,現在,有點不同的問題又出現了。我調試了函數valid_pass_combo_callback,它從validate.php獲得正確的值;在這種情況下,invalid_old是正在返回的值。當我調試時,data等於invalid_old。然而,比較失敗...所以代碼總是跳轉到最後一個else語句,無論如何。什麼也沒有發生,因爲那裏沒有任何行爲,那麼爲什麼比較總是失敗?

編輯,求助:我決定放棄綁定這個函數來提交,而是綁定到窗體上的一個按鈕onclick事件(我用它代替提交按鈕)並解決了這個問題。單擊按鈕時會調用驗證,並且如果客戶端驗證通過,則將表單提交給服務器進行驗證。

回答

1

這裏的一個問題是,你是在調用回調函數,而不是傳遞函數本身:你沒有提交表單,但是,從AJAX請求

$.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); // Remove (data) so the callback 
            // isn't invoked immediately. 
+0

修復了最初的問題;但是,我在我的問題中添加了更多細節,因爲現在我遇到了另一個問題,即比較* always *失敗,即使'data'存儲validate.php中的正確值。 –

+0

您應該爲新問題提出一個新問題。 – FishBasketGordo

+0

完成:http://stackoverflow.com/questions/7043708/data-returned-from-ajax-always-failing-in-comparison再次感謝您的幫助。 –

1

你的代碼看,但你說的形式是獲得提交。我認爲在下面的代碼中有一些js錯誤,因爲表單正在被提交。

$.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(data));//Here is the issue, it will call the method right away 
     alert('after the ajax call...'); 

爲什麼不阻止表單提交的默認行爲。

function valid_pass_sett(e) { 

    e.preventDefaul();//This will ensure the form will never be submitted. 

而且回調方法做一個小的變化,以解除綁定提交處理程序,然後提交表單。這是因爲我們已經有一個提交處理程序,我們不想在下次使用下面的方法提交時調用它。

function valid_pass_combo_callback(data) { 
    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 
    } 
} 
+0

我應該從我的HTML代碼中刪除onsubmit =「return valid_pass_sett()」嗎? –

+0

我從我的HTML代碼中移除了'onsubmit =「return valid_pass_sett()」'並更改了我的'pass_form。submit()'綁定來反映你的。感謝您的幫助! –

+0

@pythonscript - 這對你有幫助嗎? – ShankarSangoli