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

IT技术 javascript jquery html forms
2021-02-10 19:10:51

如果我有这样的表格,

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

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

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

6个回答

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

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

<form action="submitscript.php" target="dummyframe">
    <!-- Form body here -->
</form>
请注意,它可能会将表单所在的页面重新加载到 iframe 中,如果您正在构建应用程序或大型网站,这可能会导致性能问题。
2021-03-19 19:10:51
美丽的答案!效果很好
2021-04-03 19:10:51
这很棒。但是,在提交表单后,我该怎么做呢?即表单的文本字段必须为空,焦点返回到第一个字段,等等。?
2021-04-06 19:10:51
有某种 javascript 可以做到这一点。只需更改<input type='submit'...<input type='reset'并添加onclick='document.forms["myForm"].submit();'>
2021-04-11 19:10:51

为了实现您想要的,您需要使用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");
        }
    });
}
出于某种原因,您的第二个解决方案不起作用,但我在上一条评论中发布的解决方案起作用了。我会将我的解决方案添加到您的帖子原因中,仅因为您我才能实现这一目标。
2021-03-19 19:10:51
第二个也必须工作,可能还有其他问题,但是如果您找到了解决方案,我们现在不需要走这条路!很高兴它有所帮助;)
2021-03-21 19:10:51
这很好用,问题是我不希望它以这种方式自动(总是)提交。我想要一个带有名称的函数来执行您在答案中发布的这些内容。所以我可以在需要的时候手动调用它,让它发布表单。如下所示,我可以给出要调用的函数的名称。 @Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
2021-04-01 19:10:51
这有效: function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
2021-04-05 19:10:51
谢谢这个答案还帮助我在提交后用自定义文本代替表单
2021-04-08 19:10:51

由于所有当前的答案都使用 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);
}
我向你倾斜我的帽子。我花了几个小时试图弄清楚如何让 jquery 使用 contentType=false 参数将表单发送到 nginx 后端,结果总是得到 415。这是我发现的唯一解决我的特定问题的解决方案。
2021-03-30 19:10:51
太感谢了!
2021-04-07 19:10:51

iFrame在您的页面底部放置一个 hidden并将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 仍然是可选的。
2021-03-22 19:10:51

好吧,我不会告诉你一个神奇的方法,因为没有。如果您为表单元素设置了 action 属性,它将重定向。

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

someFunction()你做任何你想做的事情时,(无论是否使用 AJAX),最后,你添加return false;告诉浏览器不要提交表单......

有一种神奇的方法可以做到这一点。设置目标属性,以便表单重定向到当前帧以外的其他地方。如果您在页面中为此类内容添加不可见的 iframe。这很简单。
2021-03-17 19:10:51