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

Duk*_*uke 81 html javascript forms jquery

如果我有这样的形式:

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>
Run Code Online (Sandbox Code Playgroud)

如何在不通过JavaScript/Jquery重定向到另一个视图的情况下提交它?我从StackOverflow中读到了很多答案,但所有答案都将我重定向到POST函数返回的视图.

Iss*_*nzi 96

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

<iframe width="0" height="0" border="0" name="dummyframe" id="dummyframe"></iframe>

<form action="submitscript.php" target="dummyframe">
    <!-- form body here -->
</form>
Run Code Online (Sandbox Code Playgroud)

如果你真的很狡猾,你可以在CSS中修补position=absolutez-index重视,以确保框架不会渲染.如果这很重要,那么无论如何你最好还是使用AJAX.

  • 有某种 javascript 可以做到这一点。只需将 `&lt;input type='submit'...` 更改为 `&lt;input type='reset'` 并添加 `onclick='document.forms["myForm"].submit();'&gt;` (4认同)
  • 这是一个很好的答案,并且工作得很好. (2认同)

Ami*_*ari 62

为了实现你想要的,你需要使用jquery ajax,如下所示:

$('#myForm').submit(function(e){
    e.preventDefault();
    $.ajax({
        url:'/Car/Edit/17/',
        type:'post',
        data:$('#myForm').serialize(),
        success:function(){
            //whatever you wanna do after the form is successfully submitted
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

更新:(根据以下评论)

试试这个:

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 wanna do after the form is successfully submitted
       }
   });
}
Run Code Online (Sandbox Code Playgroud)

更新2(OP增加了这部分,因为这是他的最终解决方案)

这完美无瑕.我叫这个函数Html.ActionLink(...)

function SubForm (){
    $.ajax({
        url:'/Person/Edit/@Model.Id/',
        type:'post',
        data:$('#myForm').serialize(),
        success:function(){
            alert("worked");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


Eth*_* UI 38

由于所有当前的答案都使用 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢! (3认同)
  • 我向你致敬。我花了几个小时试图弄清楚如何让 jquery 使用 contentType=false 参数将表单发送到 nginx 后端,并且总是得到 415 结果。这是我发现的唯一可以解决我的特定问题的解决方案。 (2认同)

小智 21

将隐藏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>
Run Code Online (Sandbox Code Playgroud)

快捷方便.请记住,虽然该target属性仍然得到广泛支持(并且在HTML5中受支持),但在HTML 4.01中已弃用.所以你真的应该使用ajax来面向未来.


Ans*_*shi 6

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

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

someFunction()你做任何你想做的事情(用AJAX或不用),在结尾,你添加return false;告诉浏览器不要提交表格...


Ale*_*urt 6

自 2020 年起的单行解决方案,如果您的数据不打算作为multipart/form-data或发送application/x-www-form-urlencoded

<form onsubmit='return false'>
    <!-- ... -->           
</form>
Run Code Online (Sandbox Code Playgroud)

  • 如果将此与OP的`action =“...”`结合起来,这可以有效地防止页面切换,但也可以防止通过网络提交数据。 (5认同)

Boj*_*ski 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;
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 不缩进这个源代码有什么特别的原因吗?它看起来像 C 被发明之前 60 年代的代码。我以为我们已经结束了很长时间。 (6认同)