Bagaimana cara mengirimkan formulir HTML tanpa pengalihan

100

Jika saya memiliki bentuk seperti ini,

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

bagaimana cara mengirimkannya tanpa mengalihkan ke tampilan lain dengan JavaScript / jQuery?

Saya membaca banyak jawaban dari Stack Overflow, tetapi semuanya mengarahkan saya ke tampilan yang dikembalikan oleh fungsi POST.

Duke Nuke
sumber
Anda menginginkan permintaan XHR (AJAX)
Sterling Archer
2
XHR / AJAX adalah salah satu caranya - ia mengirimkan kiriman dan mendapat respons di balik layar, sehingga browser tidak pernah meninggalkan halaman tempat ia aktif. Cara lain adalah pengalihan sisi server setelah memproses postingan, yang bergantung pada teknologi server yang Anda gunakan.
Stephen P
@ StephenP Saya menggunakan ASP.NET MVC 5.1.
Duke Nuke
@Duke, yang saya katakan adalah ada lebih dari satu pendekatan (ajax vs. server-redirect) dan pilihan Anda tergantung pada kebutuhan Anda. Situs modern kemungkinan besar ingin melakukan ajax. Perhatikan juga bahwa semua jawaban ini mengatakan Anda perlu jQuery - jQuery besar, tetapi ada yang , pada kenyataannya, cara lain untuk melakukan ajax ... meskipun aku memang akan menggunakan jQuery sendiri.
Stephen P
1
Cara saya sederhana, bersih dan elegan, dan hanya terdiri dari 2 baris kode. Ia tidak menggunakan skrip, dan bekerja di HTML4 dan di atasnya, bahkan jika JavaScript dimatikan.
Issa Chanzi

Jawaban:

75

Untuk mencapai apa yang Anda inginkan, Anda perlu menggunakan jQuery Ajax seperti di bawah ini:

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

Coba juga yang ini:

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

Solusi akhir

Ini bekerja dengan sempurna. Saya menyebut fungsi ini dariHtml.ActionLink(...)

function SubForm (){
    $.ajax({
        url: '/Person/Edit/@Model.Id/',
        type: 'post',
        data: $('#myForm').serialize(),
        success: function(){
            alert("worked");
        }
    });
}
Amin Jafari
sumber
Ini bekerja dengan baik, masalahnya adalah saya tidak ingin otomatis (selalu) dikirimkan dengan cara ini. Saya ingin memiliki fungsi dengan nama untuk melakukan hal-hal yang Anda posting di jawaban Anda. Jadi saya bisa memanggilnya secara manual jika saya mau, untuk membuatnya memposting formulir. Seperti di bawah ini saya dapat memberikan nama fungsi yang akan dipanggil. @Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
Duke Nuke
Ini berhasil:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
Duke Nuke
Untuk beberapa alasan solusi kedua Anda tidak berfungsi, tetapi yang saya posting di komentar terakhir berhasil. Saya akan menambahkan solusi saya ke posting Anda karena hanya karena Anda saya bisa mencapai ini.
Duke Nuke
1
yang kedua harus berfungsi juga, mungkin ada hal lain untuk itu, tetapi jika Anda menemukan solusinya, kami tidak perlu menempuh jalan itu sekarang! senang itu membantu;)
Amin Jafari
Terima kasih , jawaban ini juga membantu saya menempatkan teks khusus sebagai pengganti formulir setelah pengiriman
Anupam
123

Anda dapat mencapainya dengan mengalihkan formulir actionke tak terlihat <iframe>. Itu tidak memerlukan JavaScript atau jenis skrip lainnya.

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

<form action="submitscript.php" target="dummyframe">
    <!-- Form body here -->
</form>
Issa Chanzi
sumber
1
Ini bagus. Tapi bagaimana saya bisa melakukan sesuatu, setelah formulir dikirimkan? yaitu bidang teks formulir harus kosong, fokus kembali ke bidang pertama, dll.?
Pranjal Choladhara
2
Ada beberapa jenis javascript yang bisa melakukan itu. Ubah saja <input type='submit'...menjadi <input type='reset'dan tambahkanonclick='document.forms["myForm"].submit();'>
Issa Chanzi
Jawaban yang bagus! Berfungsi bagus
Cybrus
Hati-hati, kemungkinan akan memuat ulang halaman formulir Anda ke dalam iframe, yang dapat menyebabkan masalah kinerja jika Anda membuat aplikasi atau situs web besar.
Alexandre Daubricourt
24

Tempatkan tersembunyi iFramedi bagian bawah halaman Anda dan targetdi formulir Anda:

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

Cepat dan mudah. Perlu diingat bahwa saat filetarget atribut ini masih didukung secara luas (dan didukung di HTML5), atribut sudah tidak digunakan lagi di HTML 4.01.

Jadi, Anda benar-benar harus menggunakan Ajax untuk memastikan masa depan.

Steven Black
sumber
Menurut MDN, perilaku targetini sepenuhnya valid, jadi AJAX masih opsional.
Daniel De León
22

Karena semua jawaban saat ini menggunakan jQuery atau trik dengan iframe, saya pikir tidak ada salahnya menambahkan metode hanya dengan JavaScript biasa:

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
sumber
2
Terima kasih banyak!
Joshua Evans
Aku tip topiku untukmu. Saya telah menghabiskan waktu berjam-jam mencoba mencari cara untuk membuat jquery mengirim formulir ke backend nginx dengan parameter contentType = false dan selalu mendapatkan 415 sebagai hasilnya. Ini adalah satu-satunya solusi yang saya temukan yang memecahkan masalah khusus saya.
pengguna12066
8

Oke, saya tidak akan memberi tahu Anda cara ajaib untuk melakukannya karena memang tidak ada. Jika Anda memiliki atribut tindakan yang ditetapkan untuk elemen formulir, itu akan mengalihkan.

Jika Anda tidak ingin mengalihkan, jangan setel tindakan dan set apa pun onsubmit="someFunction();"

Dalam Anda, someFunction()Anda melakukan apa pun yang Anda inginkan, (dengan AJAX atau tidak) dan pada akhirnya, Anda menambahkan return false;untuk memberi tahu browser untuk tidak mengirimkan formulir ...

Anshu Dwibhashi
sumber
1
Ada cara ajaib untuk melakukannya. Tetapkan atribut target sehingga formulir dialihkan ke tempat lain selain bingkai saat ini. Jika Anda menambahkan iframe tak terlihat untuk hal-hal seperti ini di halaman Anda. Sangat sederhana.
Issa Chanzi
5

Anda membutuhkan Ajax untuk mewujudkannya. Sesuatu seperti ini:

$(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
sumber
5
Apakah ada alasan khusus mengapa Anda tidak memasukkan kode sumber ini? Sepertinya kode dari tahun enam puluhan sebelum C ditemukan. Aku pikir kita sudah lama melupakan ini.
Alfe
3

Solusi satu baris mulai 2020, jika data Anda tidak dimaksudkan untuk dikirim sebagai multipart/form-dataatau application/x-www-form-urlencoded:

<form onsubmit='return false'>
    <!-- ... -->           
</form>
Alexandre Daubricourt
sumber
3
Jika Anda menggabungkan ini dengan OP action="...", ini secara efektif mencegah peralihan halaman, tetapi juga mencegah data dikirim melalui jaringan.
Kev
@Kev Saya pribadi mengirim data saya melalui JS XHR, itulah mengapa saya tidak ingin pengalihan halaman, karena ini adalah aplikasi JS
Alexandre Daubricourt
@Kev Maaf saya harus menyebutkan bahwa
Alexand Daubricourt
2

Lihat jQuery's post fungsi .

Saya akan membuat tombol, dan mengatur onClickListener( $('#button').on('click', function(){});), dan mengirim data ke dalam fungsi.

Juga, lihat preventDefaultfungsi dari jQuery!

Nagy Vilmos
sumber
1

Efek yang diinginkan juga dapat dicapai dengan menggerakkan tombol kirim di luar formulir seperti yang dijelaskan di sini:

Cegah halaman memuat ulang dan redirect pada form submit ajax / jquery

Seperti ini:

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

Dengan menggunakan potongan ini, Anda dapat mengirimkan formulir dan menghindari pengalihan. Sebagai gantinya Anda bisa melewatkan fungsi sukses sebagai argumen dan melakukan apapun yang Anda inginkan.

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

Dan kemudian lakukan saja:

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

Jika Anda mengontrol bagian belakang, gunakan sesuatu seperti, response.redirectbukan response.send.

Anda dapat membuat halaman HTML khusus untuk ini atau hanya mengarahkan ke sesuatu yang sudah Anda miliki.

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