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