jquery.form
jquery.form插件(http://malsup.com/jquery/form/)是大家經常會用到的一個jQuery插件,它可以很方便將表單轉換為ajax的方式進行提交。以下是官網給出的一個栗子:
$(document).ready(function() {
var options = {
target: '#output1', // target element(s) to be updated with server response
beforeSubmit: showRequest, // pre-submit callback
success: showResponse // post-submit callback
};
$('#myForm1').ajaxForm(options);
});
function showRequest(formData, jqForm, options) {
var queryString = $.param(formData);
alert('About to submit: \n\n' + queryString);
return true;
}
function showResponse(responseText, statusText, xhr, $form) {
alert('status: ' + statusText + '\n\nresponseText: \n' + responseText +
'\n\nThe output div should have already been updated with the responseText.');
}
再看以下需求:
假設我想在用戶點擊submit按鈕的時候,對表單中的某些數據進行動態的修改,例如要對密碼字段進行加密處理,然后才發送給服務器。這時候,我們可能想到可以在beforeSubmit的回調函數(showRequest)中進行處理,例如像這個樣子:
function showRequest(formData, jqForm, options) {
var jform = jqForm[0];
var password= jform.password.value;
password=encrypt(password); //加密密碼
$("#password").val(password);
alert($("#password").val()); //檢驗一下輸入框的內容是否發生了改變
return true;
}
通過上面的代碼,我們提交表單的時候很順利彈出了我們期待的加密后的密碼,表明表單內容已經被我們成功修改,但當我們以為一切都很順利的時候,發現提交到服務器的密碼依然是沒有加密的密碼?咋回事??
原因是:我們的修改晚了!!
因為,在執行beforeSubmit之前,jquery.form已經完成了表單數據的串行化處理,也就是說,你無論如何修改表單內容,其實都不影響串行化的結果。(就是jquery.ajax方法中的data數據)
那么,有沒有辦法呢?當然有啦,因為jquery.form早就為我們准備了另一個回調接口:beforeSerialize
我們只要將上述修改表單數據的過程挪到beforeSerialize的回調函數中,就可以在表單串行化之前對數據進行動態的修改。
看一下官網的表述:
-
beforeSerialize
Callback function to be invoked before the form is serialized. This provides an opportunity to manipulate the form before it's values are retrieved.
-
beforeSubmit
Callback function to be invoked before the form is submitted. The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for validating the form data. If the 'beforeSubmit' callback returns false then the form will not be submitted.
很清楚看到,beforeSerialize可以在表單的數值被獲取之前對數據進行處理。而beforeSubmit則是在提交之前對已經獲取的數據進行校驗。