如何在不重定向的情况下提交HTML表单


95

如果我有这样的表格,

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>

如何在不通过JavaScript / jQuery重定向到另一个视图的情况下提交它?

我从Stack Overflow上阅读了很多答案,但是所有这些答案都将我重定向到POST函数返回的视图。


您需要XHR请求(AJAX)
Sterling Archer 2014年

2
XHR / AJAX是一种方法-它提交帖子并在后台获取响应,因此浏览器永远不会离开它所在的页面。另一种方法是在处理帖子后进行服务器端重定向,这取决于您使用的服务器技术。
斯蒂芬·P

@StephenP我使用ASP.NET MVC 5.1。
努克公爵2014年

@Duke,我要说的是有多种方法(ajax与服务器重定向),您的选择取决于您的需求。现代网站很可能希望做ajax。同时,所有这些答案说注意你需要的jQuery - jQuery的不错,但是,事实上,其他的方式做阿贾克斯...虽然我的确会使用jQuery自己。
Stephen P

1
我的方法简单,简洁,优雅,只有两行代码。它不使用任何脚本,并且即使关闭了JavaScript,也可以在HTML4及更高版本中使用。
Issa Chanzi 2015年

Answers:


74

为了实现您想要的,您需要使用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()" })
公爵杜克(Nuke Nuke)2014年

这起作用了:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
Duke Nuke 2014年

由于某种原因,您的第二个解决方案不起作用,但是我在上一个评论中发布的解决方案却起作用了。我将我的解决方案添加到您的帖子原因中,仅是因为您可以实现这一目标。
公爵杜克(Nuke Nuke)2014年

1
第二个也必须正常工作,可能还有其他问题,但是如果您找到了解决方案,我们现在就不必走这条路了!很高兴它有所帮助;)
Amin Jafari 2014年

谢谢,这个答案也帮助我在提交后将自定义文本替换了表单
Anupam

116

您可以通过将表单重定向action到invisible来实现<iframe>。它不需要任何JavaScript或任何其他类型的脚本。

<iframe name="dummyframe" id="dummyframe" style="display: none;"></iframe>

<form action="submitscript.php" target="dummyframe">
    <!-- Form body here -->
</form>

1
这很棒。但是,提交表格后,我该怎么办?即,表单的文本字段必须为空,焦点返回到第一个字段,依此类推。
Pranjal Choladhara

1
有一些可以做到这一点的JavaScript。只需更改为<input type='submit'...<input type='reset'然后添加onclick='document.forms["myForm"].submit();'>
Issa Chanzi '16

漂亮的答案!效果很棒
Cybrus

请注意,很可能会将表单所在的页面重新加载到iframe中,如果您正在构建应用程序或大型网站,则可能会导致性能问题。
Alexandre Daubricourt

22

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来适应未来的需求。


根据MDN,此行为对于target完全有效,因此AJAX仍然是可选的。
Daniel DeLeón19年

18

由于当前所有答案都使用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);
}

2
非常感谢!
约书亚·埃文斯

我给你戴顶帽子。我花了数小时试图弄清楚如何使用jquery将具有contentType = false参数的表单发送到nginx后端,并始终得到415。这是我发现的唯一解决我特定问题的解决方案。
user12066

7

好的,我不会告诉您一种神奇的方法,因为没有。如果您为表单元素设置了动作属性,它将进行重定向。

如果您不希望它重定向,请不要设置任何操作并设置 onsubmit="someFunction();"

在您someFunction()进行的所有操作中(无论是否使用AJAX),最后,您return false;都告诉浏览器不要提交表单...


1
有一种神奇的方法。设置目标属性,以便表单重定向到当前框架以外的其他位置。如果您在网页中为此类内容添加了不可见的iframe。很简单
Issa Chanzi

5

您需要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;
    });
});

5
您是否不缩进此源代码有任何特定原因吗?看起来像C发明之前的60年代的代码。我以为我们已经解决了很长时间了。
Alfe

2

请参阅jQuery的post功能。

我将创建一个按钮,并设置一个onClickListener$('#button').on('click', function(){});),然后在函数中发送数据。

另外,请参见preventDefaultjQuery 的功能!


2

从2020年开始的单线解决方案(如果您不希望按multipart/form-data或发送数据)application/x-www-form-urlencoded

<form onsubmit='return false'>
    <!-- ... -->           
</form>

3
如果将此与OP结合使用action="...",则可以有效地防止页面切换,但也可以防止数据通过网络提交。
凯夫

@Kev我个人通过JS XHR发送数据,这就是为什么我不希望页面重定向,因为它是一个JS应用
Alexandre Daubricourt

@Kev抱歉,我应该提到
Alexandre Daubricourt

1

也可以通过将提交按钮移到表单外部来实现所需的效果,如下所示:

防止页面重新加载和表单提交Ajax / jquery重定向

像这样:

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

1

使用此代码段,您可以提交表单并避免重定向。相反,您可以将成功函数作为参数传递,并做任何您想做的事情。

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

0

如果您控制后端,请使用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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.