如果我有这样的表格,
<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>
如何在不通过JavaScript / jQuery重定向到另一个视图的情况下提交它?
我从Stack Overflow上阅读了很多答案,但是所有这些答案都将我重定向到POST函数返回的视图。
如果我有这样的表格,
<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>
如何在不通过JavaScript / jQuery重定向到另一个视图的情况下提交它?
我从Stack Overflow上阅读了很多答案,但是所有这些答案都将我重定向到POST函数返回的视图。
Answers:
为了实现您想要的,您需要使用jQuery Ajax,如下所示:
$('#myForm').submit(function(e){
e.preventDefault();
$.ajax({
url: '/Car/Edit/17/',
type: 'post',
data:$('#myForm').serialize(),
success:function(){
// Whatever you want to do after the form is successfully submitted
}
});
});
也尝试以下一种方法:
function SubForm(e){
e.preventDefault();
var url = $(this).closest('form').attr('action'),
data = $(this).closest('form').serialize();
$.ajax({
url: url,
type: 'post',
data: data,
success: function(){
// Whatever you want to do after the form is successfully submitted
}
});
}
这完美无瑕。我从Html.ActionLink(...)
function SubForm (){
$.ajax({
url: '/Person/Edit/@Model.Id/',
type: 'post',
data: $('#myForm').serialize(),
success: function(){
alert("worked");
}
});
}
@Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
您可以通过将表单重定向action
到invisible来实现<iframe>
。它不需要任何JavaScript或任何其他类型的脚本。
<iframe name="dummyframe" id="dummyframe" style="display: none;"></iframe>
<form action="submitscript.php" target="dummyframe">
<!-- Form body here -->
</form>
<input type='submit'...
,<input type='reset'
然后添加onclick='document.forms["myForm"].submit();'>
iFrame
在页面底部并target
在表单中放置一个隐藏的内容:
<iframe name="hiddenFrame" width="0" height="0" border="0" style="display: none;"></iframe>
<form action="/Car/Edit/17" id="myForm" method="post" name="myForm" target="hiddenFrame"> ... </form>
快捷方便。请记住,尽管该target
属性仍得到广泛支持(并且在HTML5中受支持),但在HTML 4.01中已弃用该属性。
因此,您确实应该使用Ajax来适应未来的需求。
target
完全有效,因此AJAX仍然是可选的。
由于当前所有答案都使用jQuery或iframe技巧,因此认为仅使用普通JavaScript添加方法就没有害处:
function formSubmit(event) {
var url = "/post/url/here";
var request = new XMLHttpRequest();
request.open('POST', url, true);
request.onload = function() { // request successful
// we can use server response to our request now
console.log(request.responseText);
};
request.onerror = function() {
// request failed
};
request.send(new FormData(event.target)); // create FormData from form that triggered event
event.preventDefault();
}
// and you can attach form submit event like this for example
function attachFormSubmitEvent(formId){
document.getElementById(formId).addEventListener("submit", formSubmit);
}
好的,我不会告诉您一种神奇的方法,因为没有。如果您为表单元素设置了动作属性,它将进行重定向。
如果您不希望它重定向,请不要设置任何操作并设置 onsubmit="someFunction();"
在您someFunction()
进行的所有操作中(无论是否使用AJAX),最后,您return false;
都告诉浏览器不要提交表单...
您需要Ajax才能实现。像这样:
$(document).ready(function(){
$("#myform").on('submit', function(){
var name = $("#name").val();
var email = $("#email").val();
var password = $("#password").val();
var contact = $("#contact").val();
var dataString = 'name1=' + name + '&email1=' + email + '&password1=' + password + '&contact1=' + contact;
if(name=='' || email=='' || password=='' || contact=='')
{
alert("Please fill in all fields");
}
else
{
// Ajax code to submit form.
$.ajax({
type: "POST",
url: "ajaxsubmit.php",
data: dataString,
cache: false,
success: function(result){
alert(result);
}
});
}
return false;
});
});
请参阅jQuery的post
功能。
我将创建一个按钮,并设置一个onClickListener
($('#button').on('click', function(){});
),然后在函数中发送数据。
另外,请参见preventDefault
jQuery 的功能!
从2020年开始的单线解决方案(如果您不希望按multipart/form-data
或发送数据)application/x-www-form-urlencoded
:
<form onsubmit='return false'>
<!-- ... -->
</form>
action="..."
,则可以有效地防止页面切换,但也可以防止数据通过网络提交。
也可以通过将提交按钮移到表单外部来实现所需的效果,如下所示:
像这样:
<form id="getPatientsForm">
Enter URL for patient server
<br/><br/>
<input name="forwardToUrl" type="hidden" value="/WEB-INF/jsp/patient/patientList.jsp" />
<input name="patientRootUrl" size="100"></input>
<br/><br/>
</form>
<button onclick="javascript:postGetPatientsForm();">Connect to Server</button>
使用此代码段,您可以提交表单并避免重定向。相反,您可以将成功函数作为参数传递,并做任何您想做的事情。
function submitForm(form, successFn){
if (form.getAttribute("id") != '' || form.getAttribute("id") != null){
var id = form.getAttribute("id");
} else {
console.log("Form id attribute was not set; the form cannot be serialized");
}
$.ajax({
type: form.method,
url: form.action,
data: $(id).serializeArray(),
dataType: "json",
success: successFn,
//error: errorFn(data)
});
}
然后做:
var formElement = document.getElementById("yourForm");
submitForm(formElement, function() {
console.log("Form submitted");
});
如果您控制后端,请使用response.redirect
代替response.send
。
您可以为此创建自定义HTML页面,或仅重定向到您已经拥有的页面。
在Express.js中:
const handler = (req, res) => {
const { body } = req
handleResponse(body)
.then(data => {
console.log(data)
res.redirect('https://yoursite.com/ok.html')
})
.catch(err => {
console.log(err)
res.redirect('https://yoursite.com/err.html')
})
}
...
app.post('/endpoint', handler)