Отправить данные формы с помощью ajax

Я хочу отправить все данные в форме с помощью ajax. У меня есть такая форма.

<form action="target.php" method="post" > <input type="text" name="lname" /> <input type="text" name="fname" /> <input type="buttom" name ="send" onclick="return f(this.form ,this.form.fname ,this.form.lname) " > </form> 

И в .js-файле у нас есть следующий код:

 function f (form ,fname ,lname ){ att=form.attr("action") ; $.post(att ,{fname : fname , lname :lname}).done(function(data){ alert(data); }); return true; 

Но это не работает. Я не хочу использовать данные формы.

поскольку мы хотим отправить все поля ввода формы, которые имеют атрибут name, вы можете сделать это для всех форм, независимо от имен полей:

Первое решение

 function submitForm(form){ var url = form.attr("action"); var formData = {}; $(form).find("input[name]").each(function (index, node) { formData[node.name] = node.value; }); $.post(url, formData).done(function (data) { alert(data); }); } 

Второе решение : в этом решении вы можете создать массив входных значений:

 function submitForm(form){ var url = form.attr("action"); var formData = $(form).serializeArray(); $.post(url, formData).done(function (data) { alert(data); }); } 

В вашей form функции есть объект DOM. Чтобы использовать attr() вам нужно преобразовать его в объект jQuery.

 function f(form, fname, lname) { action = $(form).attr("action"); $.post(att, {fname : fname , lname :lname}).done(function (data) { alert(data); }); return true; } 

С .serialize ()

 function f(form, fname, lname) { action = $(form).attr("action"); $.post(att, $(form).serialize() ).done(function (data) { alert(data); }); return true; } 

Кроме того, вы можете использовать .serialize ()

Я написал себе функцию, которая преобразует большинство вещей, которые, возможно, захочет отправить через AJAX для получения запроса POST.
Следующая часть функции может представлять интерес:

  if(data.tagName!=null&&data.tagName.toUpperCase()=="FORM") { //Get all the input elements in form var elem = data.elements; //Loop through the element array for(var i = 0; i < elem.length; i++) { //Ignore elements that are not supposed to be sent if(elem[i].disabled!=null&&elem[i].disabled!=false||elem[i].type=="button"||elem[i].name==null||(elem[i].type=="checkbox"&&elem[i].checked==false)) continue; //Add & to any subsequent entries (that means every iteration except the first one) if(data_string.length>0) data_string+="&"; //Get data for selectbox if (elem[i].tagName.toUpperCase() == "SELECT") { data_string += elem[i].name + "=" + encodeURIComponent(elem[i].options[elem[i].selectedIndex].value) ; } //Get data from checkbox else if(elem[i].type=="checkbox") { data_string += elem[i].name + "="+(elem[i].value==null?"on":elem[i].value); } //Get data from textfield else { data_string += elem[i].name + (elem[i].value!=""?"=" + encodeURIComponent(elem[i].value):"="); } } return data_string; } 

Мне не нужен jQuery, так как я его не использую. Но я уверен, что $.post jquery принимает строку как аргумент seconf.

Вот вся функция, другие части не комментируются. Я не могу пообещать, что в нем нет ошибок:

 function ajax_create_request_string(data, recursion) { var data_string = ''; //Zpracovani formulare if(data.tagName!=null&&data.tagName.toUpperCase()=="FORM") { //Get all the input elements in form var elem = data.elements; //Loop through the element array for(var i = 0; i < elem.length; i++) { //Ignore elements that are not supposed to be sent if(elem[i].disabled!=null&&elem[i].disabled!=false||elem[i].type=="button"||elem[i].name==null||(elem[i].type=="checkbox"&&elem[i].checked==false)) continue; //Add & to any subsequent entries (that means every iteration except the first one) if(data_string.length>0) data_string+="&"; //Get data for selectbox if (elem[i].tagName.toUpperCase() == "SELECT") { data_string += elem[i].name + "=" + encodeURIComponent(elem[i].options[elem[i].selectedIndex].value) ; } //Get data from checkbox else if(elem[i].type=="checkbox") { data_string += elem[i].name + "="+(elem[i].value==null?"on":elem[i].value); } //Get data from textfield else { if(elem[i].className.indexOf("autoempty")!=-1) { data_string += elem[i].name+"="; } else data_string += elem[i].name + (elem[i].value!=""?"=" + encodeURIComponent(elem[i].value):"="); } } return data_string; } //Loop through array if(data instanceof Array) { for(var i=0; i<data.length; i++) { if(data_string!="") data_string+="&"; data_string+=recursion+"["+i+"]="+data[i]; } return data_string; } //Loop through object (like foreach) for(var i in data) { if(data_string!="") data_string+="&"; if(typeof data[i]=="object") { if(recursion==null) data_string+= ajax_create_request_string(data[i], i); else data_string+= ajax_create_request_string(data[i], recursion+"["+i+"]"); } else if(recursion==null) data_string+=i+"="+data[i]; else data_string+=recursion+"["+i+"]="+data[i]; } return data_string; } 

Код, который вы опубликовали, имеет две проблемы:

Сначала: <input type="buttom" должен быть <input type="button"... Вероятно, это просто опечатка, но без button ваш вход будет обрабатываться как type="text" поскольку тип ввода по умолчанию – это text .

Второе: в определении function f() вы используете параметр form думая, что это уже объект jQuery , используя form.attr("action") . Тогда аналогично в вызове метода $.post вы передаете fname и lname которые являются HTMLInputElement s. Я верю, что вы хотите, это значения url и значения элемента формы.

Попробуйте со следующими изменениями:

HTML

 <form action="/echo/json/" method="post"> <input type="text" name="lname" /> <input type="text" name="fname" /> <!-- change "buttom" to "button" --> <input type="button" name="send" onclick="return f(this.form ,this.form.fname ,this.form.lname) " /> </form> 

JavaScript

 function f(form, fname, lname) { att = form.action; // Use form.action $.post(att, { fname: fname.value, // Use fname.value lname: lname.value // Use lname.value }).done(function (data) { alert(data); }); return true; } 

Вот скрипка .

 $.ajax({ url: "target.php", type: "post", data: "fname="+fname+"&lname="+lname, }).done(function(data) { alert(data); }); 

вы можете попробовать это:

 function f (){ fname = $("input[name='fname']").val(); lname = $("input[name='fname']").val(); att=form.attr("action") ; $.post(att ,{fname : fname , lname :lname}).done(function(data){ alert(data); }); return true; } 

вы можете использовать метод jQuery для сериализации для получения значений формы. Попробуйте это

 <form action="target.php" method="post" > <input type="text" name="lname" /> <input type="text" name="fname" /> <input type="buttom" name ="send" onclick="return f(this.form) " > </form> function f( form ){ var formData = $(form).serialize(); att=form.attr("action") ; $.post(att, formData).done(function(data){ alert(data); }); return true; }