Jeśli mam taki formularz,
<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>
jak mogę to przesłać bez przekierowywania do innego widoku przez JavaScript / jQuery?
Czytałem mnóstwo odpowiedzi ze Stack Overflow, ale wszystkie z nich przekierowują mnie do widoku zwróconego przez funkcję POST.
javascript
jquery
html
forms
Duke Nuke
źródło
źródło
Odpowiedzi:
Aby osiągnąć to, co chcesz, musisz użyć jQuery Ajax, jak poniżej:
$('#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 } }); });
Spróbuj też tego:
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 } }); }
Ostateczne rozwiązanie
To działało bez zarzutu. Nazywam tę funkcję from
Html.ActionLink(...)
function SubForm (){ $.ajax({ url: '/Person/Edit/@Model.Id/', type: 'post', data: $('#myForm').serialize(), success: function(){ alert("worked"); } }); }
źródło
@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"); } }); }
Możesz to osiągnąć, przekierowując formularz
action
do niewidocznego<iframe>
. Nie wymaga JavaScript ani żadnego innego typu skryptów.<iframe name="dummyframe" id="dummyframe" style="display: none;"></iframe> <form action="submitscript.php" target="dummyframe"> <!-- Form body here --> </form>
źródło
<input type='submit'...
, aby<input type='reset'
dodaćonclick='document.forms["myForm"].submit();'>
Umieść ukryty
iFrame
u dołu strony itarget
w swoim formularzu:<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>
Szybko i łatwo. Należy pamiętać, że chociaż
target
atrybut jest nadal szeroko obsługiwany (i obsługiwany w HTML5), został wycofany w HTML 4.01.Więc naprawdę powinieneś używać Ajax, aby być przyszłościowym.
źródło
target
jest całkowicie prawidłowe, więc AJAX jest nadal opcjonalny.Ponieważ wszystkie aktualne odpowiedzi używają jQuery lub trików z iframe, doszedłem do wniosku, że nie ma nic złego w dodaniu metody za pomocą zwykłego 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); }
źródło
Okej, nie powiem ci, jak to zrobić w magiczny sposób, ponieważ nie ma. Jeśli masz ustawiony atrybut akcji dla elementu formularza, przekieruje.
Jeśli nie chcesz, aby przekierowywał, po prostu nie ustawiaj żadnej akcji i ustaw
onsubmit="someFunction();"
W swoim
someFunction()
robisz, co chcesz (z AJAXem lub nie) i na końcu dodajesz,return false;
aby powiedzieć przeglądarce, aby nie wysyłała formularza ...źródło
Potrzebujesz Ajax, aby to się stało. Coś takiego:
$(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; }); });
źródło
Jednoliniowe rozwiązanie od 2020 r., Jeśli dane nie mają być wysyłane jako
multipart/form-data
lubapplication/x-www-form-urlencoded
:<form onsubmit='return false'> <!-- ... --> </form>
źródło
action="..."
, skutecznie zapobiega to zmianie strony, ale także zapobiega przesyłaniu danych przez sieć.Zobacz
post
funkcję jQuery .Utworzyłbym przycisk, ustawiłbym
onClickListener
($('#button').on('click', function(){});
) i wysłałbym dane w funkcji.Zobacz także
preventDefault
funkcję jQuery!źródło
Pożądany efekt można również osiągnąć, przenosząc przycisk przesyłania poza formularz, jak opisano tutaj:
Zapobiegaj przeładowywaniu strony i przekierowywaniu w formularzu przesłania ajax / jquery
Lubię to:
<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>
źródło
Używając tego fragmentu, możesz przesłać formularz i uniknąć przekierowań. Zamiast tego możesz przekazać funkcję sukcesu jako argument i robić, co chcesz.
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) }); }
A potem po prostu zrób:
var formElement = document.getElementById("yourForm"); submitForm(formElement, function() { console.log("Form submitted"); });
źródło
Jeśli kontrolujesz zaplecze, użyj czegoś takiego jak
response.redirect
zamiastresponse.send
.Możesz w tym celu utworzyć niestandardowe strony HTML lub po prostu przekierować do czegoś, co już masz.
W 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)
źródło