So senden Sie ein HTML-Formular ohne Umleitung

90

Wenn ich ein solches Formular habe,

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

Wie kann ich es einreichen, ohne von JavaScript / jQuery zu einer anderen Ansicht umzuleiten?

Ich habe viele Antworten von Stack Overflow gelesen, aber alle leiten mich zu der Ansicht weiter, die von der POST-Funktion zurückgegeben wird.

Herzog Nuke
quelle
Sie möchten eine XHR-Anfrage (AJAX)
Sterling Archer
2
XHR / AJAX ist eine Möglichkeit - es sendet den Beitrag und erhält die Antwort hinter den Kulissen, sodass der Browser die Seite, auf der er sich befindet, nie verlässt. Eine andere Möglichkeit ist eine serverseitige Umleitung nach der Verarbeitung des Beitrags, die davon abhängt, welche Servertechnologie Sie verwenden.
Stephen P
@StephenP Ich verwende ASP.NET MVC 5.1.
Duke Nuke
@Duke, alles was ich sage ist, dass es mehr als einen Ansatz gibt (Ajax vs. Server-Redirect) und Ihre Wahl hängt von Ihren Anforderungen ab. Moderne Websites werden höchstwahrscheinlich Ajax machen wollen. Beachten Sie auch, dass all diese Antworten besagen, dass Sie jQuery benötigen - jQuery ist großartig, aber es gibt tatsächlich andere Möglichkeiten, Ajax zu machen ... obwohl ich jQuery tatsächlich selbst verwenden würde.
Stephen P
1
Mein Weg ist einfach, sauber und elegant, und es sind nur 2 Codezeilen. Es verwendet keine Skripte und funktioniert in HTML4 und höher, auch wenn JavaScript deaktiviert ist.
Issa Chanzi

Antworten:

69

Um das zu erreichen, was Sie wollen, müssen Sie jQuery Ajax wie folgt verwenden:

$('#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
        }
    });
});

Versuchen Sie auch dieses:

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

Endgültige Lösung

Das hat einwandfrei funktioniert. Ich rufe diese Funktion von aufHtml.ActionLink(...)

function SubForm (){
    $.ajax({
        url: '/Person/Edit/@Model.Id/',
        type: 'post',
        data: $('#myForm').serialize(),
        success: function(){
            alert("worked");
        }
    });
}
Amin Jafari
quelle
Das hat gut funktioniert, das Problem ist, dass ich nicht möchte, dass es automatisch (immer) auf diese Weise gesendet wird. Ich hätte gerne eine Funktion mit einem Namen, um diese Dinge zu tun, die Sie in Ihrer Antwort gepostet haben. So kann ich es manuell aufrufen, wenn ich möchte, damit es das Formular veröffentlicht. Wie unten kann ich den Namen der aufzurufenden Funktion angeben. @Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
Duke Nuke
Dies funktionierte:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
Duke Nuke
Aus irgendeinem Grund hat Ihre zweite Lösung nicht funktioniert, aber die, die ich im letzten Kommentar gepostet habe. Ich werde meine Lösung nur deshalb zu Ihrer Post hinzufügen, weil ich dies erreichen konnte.
Duke Nuke
1
Der zweite muss auch funktionieren, vielleicht steckt noch etwas anderes dahinter, aber wenn Sie die Lösung gefunden haben, müssen wir diesen Weg jetzt nicht gehen! froh, dass es geholfen hat;)
Amin Jafari
Dank dieser Antwort konnte ich auch nach der Übermittlung einen benutzerdefinierten Text anstelle des Formulars einfügen
Anupam
113

Sie können dies erreichen, indem Sie die Formulare actionauf ein unsichtbares umleiten <iframe>. Es ist kein JavaScript oder eine andere Art von Skripten erforderlich.

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

<form action="submitscript.php" target="dummyframe">
    <!-- Form body here -->
</form>
Issa Chanzi
quelle
1
Das ist toll. Aber wie kann ich etwas tun, nachdem das Formular gesendet wurde? dh die Textfelder des Formulars müssen leer sein, der Fokus geht zurück auf das erste Feld usw.?
Pranjal Choladhara
1
Es gibt eine Art Javascript, das das kann. Ändern Sie einfach das <input type='submit'...zu <input type='reset'und fügen Sie hinzuonclick='document.forms["myForm"].submit();'>
Issa Chanzi
Schöne Antwort! Funktioniert großartig
Cybrus
Seien Sie vorsichtig, es ist wahrscheinlich, dass die Seite, auf der sich Ihr Formular befindet, erneut in den Iframe geladen wird. Dies kann zu Leistungsproblemen führen, wenn Sie eine App oder eine große Website erstellen.
Alexandre Daubricourt
21

Platzieren Sie ein verstecktes iFrameam Ende Ihrer Seite und targetes in Ihrem Formular:

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

Schnell und einfach. Beachten Sie, dass das targetAttribut zwar weitgehend unterstützt wird (und in HTML5 unterstützt wird), in HTML 4.01 jedoch veraltet ist.

Sie sollten Ajax also wirklich zukunftssicher verwenden.

Steven Black
quelle
Laut MDN ist dieses Verhalten für das targetvollständig gültig, sodass AJAX weiterhin optional ist.
Daniel De León
17

Da alle aktuellen Antworten jQuery oder Tricks mit iframe verwenden, kann das Hinzufügen einer Methode mit einfachem JavaScript nicht schaden:

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);
}
Ethuil UI
quelle
2
Ich danke dir sehr!
Joshua Evans
Ich tippe meinen Hut auf dich. Ich habe stundenlang versucht herauszufinden, wie man jquery dazu bringt, ein Formular mit dem Parameter contentType = false an ein Nginx-Backend zu senden, und als Ergebnis immer eine 415 erhalten. Dies war die einzige Lösung, die mein spezielles Problem löste.
user12066
7

Okay, ich werde dir keine magische Art sagen, es zu tun, weil es keine gibt. Wenn Sie ein Aktionsattribut für ein Formularelement festgelegt haben, wird es umgeleitet.

Wenn Sie nicht möchten, dass es umgeleitet wird, legen Sie einfach keine Aktion fest und legen Sie fest onsubmit="someFunction();"

Wenn someFunction()Sie tun, was Sie wollen (mit oder ohne AJAX) und am Ende hinzufügen return false;, fügen Sie hinzu , um den Browser anzuweisen, das Formular nicht zu senden ...

Anshu Dwibhashi
quelle
1
Es gibt eine magische Art, dies zu tun. Legen Sie ein Zielattribut fest, damit das Formular an eine andere Stelle als den aktuellen Frame umgeleitet wird. Wenn Sie auf Ihren Seiten einen unsichtbaren Iframe für solche Dinge hinzufügen. Es ist ziemlich einfach.
Issa Chanzi
5

Sie brauchen Ajax, um dies zu erreichen. Etwas wie das:

$(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;
    });
});
Bojan Petkovski
quelle
5
Gibt es einen bestimmten Grund, warum Sie diesen Quellcode nicht einrücken? Es sieht aus wie Code aus den sechziger Jahren, bevor C erfunden wurde. Ich dachte, wir wären lange darüber hinweg.
Alfe
3

Einzeilige Lösung ab 2020, wenn Ihre Daten nicht als multipart/form-dataoder gesendet werden sollen application/x-www-form-urlencoded:

<form onsubmit='return false'>
    <!-- ... -->           
</form>
Alexandre Daubricourt
quelle
2
Wenn Sie dies mit den OPs kombinieren action="...", wird der Seitenwechsel effektiv verhindert, aber auch, dass Daten über das Netzwerk gesendet werden.
Kev
@Kev Ich persönlich sende meine Daten über JS XHR, deshalb möchte ich keine Seitenumleitung, da es sich um eine JS-App handelt
Alexandre Daubricourt
@ Kevin Entschuldigung, ich hätte das erwähnen sollen
Alexandre Daubricourt
2

Siehe jQuerys postFunktion.

Ich würde eine Schaltfläche erstellen und ein onClickListener( $('#button').on('click', function(){});) setzen und die Daten in der Funktion senden.

Siehe auch die preventDefaultFunktion von jQuery!

Nagy Vilmos
quelle
1

Der gewünschte Effekt kann auch erzielt werden, indem Sie die Senden-Schaltfläche außerhalb des Formulars bewegen, wie hier beschrieben:

Verhindern Sie das erneute Laden und Umleiten von Seiten auf dem Formular. Senden Sie ajax / jquery

So was:

<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>
John
quelle
1

Mit diesem Snippet können Sie das Formular senden und eine Umleitung vermeiden. Stattdessen können Sie die Erfolgsfunktion als Argument übergeben und tun, was Sie wollen.

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

Und dann einfach:

var formElement = document.getElementById("yourForm");
submitForm(formElement, function() {
    console.log("Form submitted");
});
jmojico
quelle
0

Wenn Sie das Backend steuern, verwenden Sie etwas wie response.redirectanstelle von response.send.

Sie können hierfür benutzerdefinierte HTML-Seiten erstellen oder einfach zu etwas umleiten, das Sie bereits haben.

In 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)
etw3
quelle