2012-04-03 49 views
0

我想在使用AjaxSubmit函數在Jquery上提交表單之前覆蓋「password」字段的值。 我知道我可以只更新輸入字段的值,但我不希望用戶看到這個轉換。換句話說,我只想發送一個自定義值到密碼字段並保持屏幕上的當前值...發送之前的AjaxSubmit覆蓋表單字段

我該怎麼做?

我當前的代碼:

var loginoptions = { 
    success: mySuccessFuction, 
    dataType: 'json' 
} 

$('#My_login_form').submit(function(e) { 
    e.preventDefault(); 
    var pass=$("#My_login_form_password").val(); 
    if (pass.length>0){ 
     loginoptions.data={ 
      password: ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass))) 
     } 
    $("#My_login_form").ajaxSubmit(loginoptions); 
    delete loginoptions.data; 
}); 

這段代碼的問題是,它在發送與表單字段值,一個複製一個與我的「loginoptions設置的值了「密碼」 POST變量。數據」。

+0

您可以使用jQuery.post而不是ajaxform插件。那麼你會更好地控制發送的數據。 – Andbdrew 2012-04-03 12:08:02

+0

我不認爲你需要散列密碼clientside。對於最簡單的攻擊,發送清除密碼或散列是沒有區別的。在任何情況下,您都需要對密碼serverside進行散列和加密。無論如何,使用現有的認證模塊更安全。 – Christoph 2012-04-03 12:16:59

+0

我會優先使用ajaxSubmit函數,但如果沒有辦法做到這一點,我想我會改變它發佈你有說Andbdrew。 – 2012-04-03 12:25:06

回答

0

似乎ajaxSubmit會用了jQuery的連載()函數的形式,然後,添加額外的數據也被序列化了。因此,如果我有一個名爲「password」的字段值爲「1234」,然後嘗試將其更改爲「abcd」,則使用「loginoptions.data.password」,它將序列化所有內容並將「options.data」這樣的:

"password=1234&field_2=value_2&password=abcd" 

多次嘗試後,我放棄了使用ajaxSubmit的功能,並決定使用AJAX功能來提交表單:

var the_form=$('form#My_login_form'); 
loginoptions.url=the_form.attr("action"); 
loginoptions.type=the_form.attr("method"); 
var serializedForm=decodeURIComponent(the_form.serialize()); 
loginoptions.data=serializedForm.deserializeToObject(); 
var pass=$("#My_login_form_password").val(); 
    if (pass.length>0){ 
     loginoptions.data.password= ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass))); 
    } 
$.ajax(loginoptions); 

這裏是deserializeToObject()功能:

function deserializeToObject(){ 
    var result = {}; 
    this.replace(
     new RegExp("([^?=&]+)(=([^&]*))?", "g"), 
     function($0, $1, $2, $3) { result[$1] = $3; } 
    ) 
    return result; 
} 

String.prototype.deserializeToObject = deserializeToObject; 
0

如果你想這樣做,反正那麼我認爲你可以使用回調函數beforeSubmit: function(contentArray, $form, options){}

beforeSubmit: function(contentArray, $form, options){ 
    for(var i=0; i<contentArray.length; i++){ 
     if(contentArray[i].name == "password") { 
     contentArray[i].value = ($.sha1($("#My_login_form_csrf").val()+$.sha1(pass))) 
     } 
    } 
    } 
+0

它不起作用...如果我製作了一個console.log的contentArray,它顯示正常,但是,當我看到請求時,它沒有應用更改...現在只顯示密碼而沒有更改。 – 2012-04-03 13:58:37

+0

哦,試着檢查和修改'選項。data'而不是'contentArray',可能是有效的 – 2012-04-03 17:16:27

+0

它沒有工作太...如果我做「console.log(options.data);」它給了我「未定義」,但是,如果我使「console.log(選項);」,我可以看到options.data中的序列化字符串... – 2012-04-04 13:24:40

2

爲了克里斯蒂亞諾的答案的建立,我能夠得到這個工作。如果使用:beforeSubmit(),則更改的值不會發布,但如果使用:beforeSerialize(),它會發布更改的值。

  $('#ff').ajaxForm({ 
      beforeSerialize:function(jqForm, options){ 
       var serializedForm = decodeURIComponent(jqForm.serialize()); 
       options.data = serializedForm.deserializeToObject(); 
       options.data.tPassword = MD5($("#tPassword").val())  
      }, 
      success:function(data){ 
       // do stuff 
      } 
     }); 
+1

沒有記住這種方法。我想這也許可以在未來的版本中添加到插件中? – 2013-08-23 15:10:51