AjaxSubmit перезаписать поле формы перед отправкой

Я хотел бы перезаписать значение поля "пароль" перед отправкой формы в Jquery с использованием функции 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;
});

Проблема с этим кодом состоит в том, что он отправляет POST-переменную "password" со значением поля формы и дублирует переменную со значением, которое я установил в "loginoptions.data".

3 ответа

Решение

Кажется, что ajaxSubmit использует функцию serialize() jquery в форме, а затем добавляет дополнительные данные, сериализованные тоже. Итак, если у меня есть поле с именем "пароль" со значением "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;

Опираясь на ответ Криштиану, я смог заставить это работать. Если вы используете :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
            }
         });

Если вы хотите сделать это в любом случае, то я думаю, что вы можете использовать функцию обратного вызова 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)))
      } 
    }
  }
Другие вопросы по тегам