Yönlendirme olmadan bir HTML formu nasıl gönderilir


100

Böyle bir formum varsa

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

JavaScript / jQuery ile başka bir görünüme yönlendirmeden nasıl gönderebilirim?

Stack Overflow'dan çok sayıda yanıt okudum, ancak hepsi beni POST işlevi tarafından döndürülen görünüme yönlendiriyor.


Bir XHR isteği (AJAX) istiyorsun
Sterling Archer

2
XHR / AJAX bir yoldur - gönderiyi gönderir ve yanıtı perde arkasından alır, böylece tarayıcı bulunduğu sayfadan asla ayrılmaz. Başka bir yol da, gönderiyi işledikten sonra hangi sunucu teknolojisini kullandığınıza bağlı olarak sunucu tarafı yeniden yönlendirmedir.
Stephen P

@StephenP ASP.NET MVC 5.1 kullanıyorum.
Duke Nuke

@Duke, tek söylediğim, birden fazla yaklaşım olduğu (ajax'a karşı sunucu yönlendirme) ve seçiminizin ihtiyaçlarınıza bağlı olduğu. Modern siteler büyük olasılıkla ajax yapmak isteyecektir. Not ayrıca tüm bu cevaplar söylediklerini sen lüzum jQuery harika ama orada - jQuery vardır Ben gerçekten jQuery kendim kullanmak, buna rağmen başka yollar ... ajax yapmak aslında.
Stephen P

1
Benim yöntemim basit, temiz ve zarif ve sadece 2 satır kod. Komut dosyası kullanmaz ve JavaScript kapalı olsa bile HTML4 ve üzerinde çalışır.
Issa Chanzi

Yanıtlar:


75

İstediğinizi elde etmek için aşağıdaki gibi jQuery Ajax kullanmanız gerekir :

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

Ayrıca şunu da deneyin:

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

Son çözüm

Bu kusursuz çalıştı. Ben bu işleviHtml.ActionLink(...)

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

Bu harika çalıştı, sorun şu ki, otomatik olarak (her zaman) bu şekilde gönderilmesini istemiyorum. Cevabınızda gönderdiğiniz bu şeyleri yapmak için isimli bir işleve sahip olmak istiyorum. Böylece, istediğimde formu göndermesini sağlamak için manuel olarak çalıştırabilirim. Aşağıdaki gibi çağrılacak fonksiyonun adını verebilirim. @Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
Duke Nuke

Bu işe yaradı:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
Duke Nuke

Nedense ikinci çözümünüz işe yaramadı ama son yorumda yayınladığım çözüm işe yaradı. Çözümümü gönderinize ekleyeceğim çünkü sadece sizin sayenizde bunu başarabildim.
Duke Nuke

1
ikincisi de işe yaramalı, başka bir şey olabilir, ancak çözümü bulduysanız, şu anda o yoldan gitmemize gerek yok! yardımcı olmasına sevindim;)
Amin Jafari

Teşekkürler, bu cevap, gönderildikten sonra formun yerine özel bir metin koymama da yardımcı oldu
Anupam

123

Bunu, formları actiongörünmez olana yönlendirerek başarabilirsiniz <iframe>. Herhangi bir JavaScript veya başka tür bir komut dosyası gerektirmez.

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

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

1
Bu harika. Ama form gönderildikten sonra nasıl bir şey yapabilirim? Örneğin, formun metin alanlarının boş olması gerekecek, odak ilk alana geri dönecek, vb.?
Pranjal Choladhara

2
Bunu yapabilen bir tür javascript var. Sadece değiştirmek <input type='submit'...için <input type='reset've ekleyinonclick='document.forms["myForm"].submit();'>
Issa Chanzi

Güzel cevap! Harika çalışıyor
Cybrus

Dikkatli olun, formunuzun bulunduğu sayfayı iframe'e yeniden yükleme olasılığı yüksektir, bu da bir uygulama veya büyük bir web sitesi oluşturuyorsanız performans sorunlarına neden olabilir.
Alexandre Daubricourt

24

iFrameSayfanızın altına ve formunuza bir gizli yerleştirin 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>

Çabuk ve kolay. Ederken unutmayın targetözellik hala yaygın olarak desteklenen (ve HTML5 desteklenir) olup, bu HTML 4.01 kullanımdan kaldırıldı.

Öyleyse, gerçekten geleceğe yönelik Ajax kullanmalısınız.


MDN'ye göre, bu davranış targettamamen geçerlidir, bu nedenle AJAX hala isteğe bağlıdır.
Daniel De León

22

Tüm mevcut yanıtlar jQuery veya iframe ile ilgili hileler kullandığından, yalnızca düz JavaScript ile yöntem eklemenin hiçbir zararı olmadığını anladı:

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
Çok teşekkür ederim!
Joshua Evans

Sana şapka çıkarıyorum. Jquery'nin contentType = false parametresiyle bir formun bir nginx arka ucuna gönderilmesini ve sonuç olarak her zaman 415'in nasıl alınacağını anlamaya çalışırken saatler harcadım. Bu, özel sorunumu çözen bulduğum tek çözümdü.
user12066

8

Tamam, bunu yapmanın sihirli bir yolunu size söylemeyeceğim çünkü yok. Bir form öğesi için ayarlanmış bir eylem özniteliğiniz varsa , yeniden yönlendirecektir.

Yönlendirmesini istemiyorsanız, herhangi bir işlem ayarlamayın ve onsubmit="someFunction();"

Siz someFunction()istediğinizi yaparsınız (AJAX ile veya değil) ve sonunda, return false;tarayıcıya formu göndermemesini söylemek için eklersiniz ...


1
Bunu yapmanın sihirli bir yolu var. Formun geçerli çerçeveden başka bir yere yönlendirilmesi için bir hedef niteliği ayarlayın. Sayfalarınıza bunun gibi şeyler için görünmez bir iframe eklerseniz. Oldukça basit.
Issa Chanzi

5

Bunun gerçekleşmesi için Ajax'a ihtiyacınız var. Bunun gibi bir şey:

$(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
Bu kaynak kodunu girmemenizin belirli bir nedeni var mı? C'nin icat edilmesinden önceki altmışların koduna benziyor. Uzun zamandır bunun üstesinden geldiğimizi sanıyordum.
Alfe

3

Verilerinizin multipart/form-dataveya şu şekilde gönderilmesi amaçlanmadıysa, 2020 itibariyle tek satırlık çözüm application/x-www-form-urlencoded:

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

3
Bunu OP'ler ile birleştirirseniz action="...", bu, sayfa geçişini etkili bir şekilde önler, ancak aynı zamanda ağ üzerinden veri gönderilmesini de engeller.
Kev

@Kev Verilerimi kişisel olarak JS XHR ile gönderiyorum, bu yüzden sayfa yeniden yönlendirme istemiyorum, çünkü bu bir JS uygulaması
Alexandre Daubricourt

@Kev Üzgünüm bundan bahsetmeliydim
Alexandre Daubricourt

2

JQuery'nin postişlevine bakın .

Bir düğme oluşturup bir onClickListener( $('#button').on('click', function(){});) belirleyip verileri işlevde gönderirdim.

Ayrıca preventDefaultjQuery'nin işlevine bakın !


1

İstenilen etki, gönder düğmesini burada açıklandığı gibi formun dışına taşıyarak da elde edilebilir:

Sayfanın yeniden yüklenmesini önleyin ve form gönderme ajax / jquery üzerinde yönlendirme

Bunun gibi:

<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

Bu pasajı kullanarak formu gönderebilir ve yeniden yönlendirmeyi önleyebilirsiniz. Bunun yerine başarı işlevini bağımsız değişken olarak aktarabilir ve istediğinizi yapabilirsiniz.

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

Ve sonra şunu yapın:

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

0

Arka ucu kontrol ediyorsanız, response.redirectbunun yerine gibi bir şey kullanın response.send.

Bunun için özel HTML sayfaları oluşturabilir veya sadece sahip olduğunuz bir şeye yeniden yönlendirebilirsiniz.

Express.js'de:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.