Отправьте форму с помощью ajax
Я разрабатываю приложение (своего рода социальную сеть для моего университета). Мне нужно добавить комментарий (вставить строку в конкретную базу данных). Для этого у меня есть HTML-форма на моей странице html с различными полями. В момент отправки я не использую действие формы, но я использую пользовательскую функцию javascript для разработки некоторых данных перед отправкой формы.
function sendMyComment() {
var oForm = document.forms['addComment'];
var input_video_id = document.createElement("input");
var input_video_time = document.createElement("input");
input_video_id.setAttribute("type", "hidden");
input_video_id.setAttribute("name", "video_id");
input_video_id.setAttribute("id", "video_id");
input_video_id.setAttribute("value", document.getElementById('video_id').innerHTML);
input_video_time.setAttribute("type", "hidden");
input_video_time.setAttribute("name", "video_time");
input_video_time.setAttribute("id", "video_time");
input_video_time.setAttribute("value", document.getElementById('time').innerHTML);
oForm.appendChild(input_video_id);
oForm.appendChild(input_video_time);
document.forms['addComment'].submit();
}
Последняя строка отправляет форму на правильную страницу. Он работает нормально. Но я хотел бы использовать ajax для отправки формы, и я понятия не имею, как это сделать, потому что я понятия не имею, как поймать входные значения формы. кто-нибудь может мне помочь?
Ответы
Ответ 1
Никто не дал чистый ответ javascript
(по просьбе OP), так что вот оно:
function postAsync(url2get, sendstr) {
var req;
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
if (req != undefined) {
// req.overrideMimeType("application/json"); // if request result is JSON
try {
req.open("POST", url2get, false); // 3rd param is whether "async"
}
catch(err) {
alert("couldnt complete request. Is JS enabled for that domain?\\n\\n" + err.message);
return false;
}
req.send(sendstr); // param string only used for POST
if (req.readyState == 4) { // only if req is "loaded"
if (req.status == 200) // only if "OK"
{ return req.responseText ; }
else { return "XHR error: " + req.status +" "+req.statusText; }
}
}
alert("req for getAsync is undefined");
}
var var_str = "var1=" + var1 + "&var2=" + var2;
var ret = postAsync(url, var_str) ;
// hint: encodeURIComponent()
if (ret.match(/^XHR error/)) {
console.log(ret);
return;
}
В вашем случае:
var var_str = "video_time=" + document.getElementById('video_time').value
+ "&video_id=" + document.getElementById('video_id').value;
Ответ 2
Что насчет
$.ajax({
type: 'POST',
url: $("form").attr("action"),
data: $("form").serialize(),
//or your custom data either as object {foo: "bar", ...} or foo=bar&...
success: function(response) { ... },
});
Ответ 3
Вы можете добавить функцию onclick к своей кнопке отправки, но вы не сможете отправить свою функцию, нажав клавишу ввода. Со своей стороны, я использую это:
<form action="" method="post" onsubmit="your_ajax_function(); return false;">
Your Name <br/>
<input type="text" name="name" id="name" />
<br/>
<input type="submit" id="submit" value="Submit" />
</form>
Надеюсь, что это поможет.
Ответ 4
Вот универсальное решение, которое перебирает все поля формы и автоматически создает строку запроса. Он использует новый API выборки. Автоматически считывает атрибуты формы: method
и action
и захватывает все поля внутри формы. Поддержка одномерных полей массива, таких как emails[]
. Может служить универсальным решением для простого управления многими (возможно, динамическими) формами с одним источником правды - html.
document.querySelector('.ajax-form').addEventListener('submit', function(e) {
e.preventDefault();
let formData = new FormData(this);
let parsedData = {};
for(let name of formData) {
if (typeof(parsedData[name[0]]) == "undefined") {
let tempdata = formData.getAll(name[0]);
if (tempdata.length > 1) {
parsedData[name[0]] = tempdata;
} else {
parsedData[name[0]] = tempdata[0];
}
}
}
let options = {};
switch (this.method.toLowerCase()) {
case 'post':
options.body = JSON.stringify(parsedData);
case 'get':
options.method = this.method;
options.headers = {'Content-Type': 'application/json'};
break;
}
fetch(this.action, options).then(r => r.json()).then(data => {
console.log(data);
});
});
<form method="POST" action="some/url">
<input name="emails[]">
<input name="emails[]">
<input name="emails[]">
<input name="name">
<input name="phone">
</form>
Ответ 5
Намного проще использовать jQuery, так как это всего лишь задача для университета, и вам не нужно сохранять код.
Итак, ваш код будет выглядеть так:
function sendMyComment() {
$('#addComment').append('<input type="hidden" name="video_id" id="video_id" value="' + $('#video_id').text() + '"/><input type="hidden" name="video_time" id="video_time" value="' + $('#time').text() +'"/>');
$.ajax({
type: 'POST',
url: $('#addComment').attr('action'),
data: $('form').serialize(),
success: function(response) { ... },
});
}
Ответ 6
Я бы предложил использовать jquery для этого типа требований. Попробуйте
<div id="commentList"></div>
<div id="addCommentContainer">
<p>Add a Comment</p> <br/> <br/>
<form id="addCommentForm" method="post" action="">
<div>
Your Name <br/>
<input type="text" name="name" id="name" />
<br/> <br/>
Comment Body <br/>
<textarea name="body" id="body" cols="20" rows="5"></textarea>
<input type="submit" id="submit" value="Submit" />
</div>
</form>
</div>
$(document).ready(function(){
/* The following code is executed once the DOM is loaded */
/* This flag will prevent multiple comment submits: */
var working = false;
$("#submit").click(function(){
$.ajax({
type: 'POST',
url: "mysubmitpage.php",
data: $('#addCommentForm').serialize(),
success: function(response) {
alert("Submitted comment");
$("#commentList").append("Name:" + $("#name").val() + "<br/>comment:" + $("#body").val());
},
error: function() {
//$("#commentList").append($("#name").val() + "<br/>" + $("#body").val());
alert("There was an error submitting comment");
}
});
});
});
Ответ 7
Если вы используете jQuery, вы можете использовать функцию $.ajax()
:
$.ajax({
type: 'POST',
url: $("form").attr("action"),
data: $("form").serialize(),
// or your custom data either as object {foo: "bar", ...}
// data: {"foo":"bar"}
success: function(response) { ... },
});
Ответ 8
Я хотел бы добавить новый способ сделать это, который, на мой взгляд, намного чище, используя API fetch()
. Это современный способ реализации сетевых запросов. В вашем случае, поскольку у вас уже есть form element
, мы можем просто использовать его для построения нашего запроса.
const formInputs = oForm.getElementsByTagName("input");
let formData = new FormData();
for (let input of formInputs) {
formData.append(input.name, input.value);
}
fetch(oForm.action,
{
method: oForm.method,
body: formData
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log(error.message))
.finally(() => console.log("Done"));
Как видите, он очень чистый и гораздо менее многословный в использовании, чем XMLHttpRequest
.
Ответ 9
Вы можете создать объект xml или json, который содержит все данные формы вместе с любыми дополнительными данными, которые вы хотите передать, и передать этот объект через метод POJ ajax. Например, вы можете пойти с учебником ajax в w3schools.com
По мере того как я отвечаю через мобильный, вы не можете каталогизировать URL-адрес и код. Поэтому, пожалуйста, не голосуйте.