Mendapatkan Kesalahan “Pengiriman formulir dibatalkan karena formulir tidak terhubung”

156

Saya memiliki situs web lama dengan JQuery 1.7 yang berfungsi dengan benar hingga dua hari yang lalu. Tiba-tiba beberapa tombol saya tidak berfungsi lagi dan, setelah mengkliknya, saya mendapatkan peringatan ini di konsol:

Pengiriman formulir dibatalkan karena formulir tidak terhubung

Kode di belakang klik adalah sesuatu seperti ini:

 this.handleExcelExporter = function(href, cols) {
   var form = $('<form method="post"><input type="submit" /><input type="hidden" name="layout" /></form>').attr('action', href);
   $('input[name="layout"]', form).val(JSON.stringify(cols));
   $('input[type="submit"]', form).click();
 }

Tampaknya Chrome 56 tidak mendukung kode semacam ini lagi. Bukan? Jika ya pertanyaan saya adalah:

  1. Kenapa ini terjadi tiba-tiba? Tanpa peringatan penghinaan?
  2. Apa solusinya untuk kode ini?
  3. Apakah ada cara untuk memaksa chrome (atau browser lain) bekerja seperti sebelumnya tanpa mengubah kode apa pun?

PS Tidak berfungsi di versi firefox terbaru (tanpa pesan apa pun). Juga tidak berfungsi di IE 11.0 & Edge! (keduanya tanpa pesan apa pun)

Mahmoud Moravej
sumber
Saya menambahkan perbaikan dalam jawaban yang diterima untuk mencocokkan fakta bahwa formulir adalah objek jQuery. Catatan ini juga mempengaruhi .submit()penangan jQuery (selain .click()metode yang ditunjukkan di atas).
ryanm

Jawaban:

185

Jawaban cepat: tambahkan formulir ke badan.

document.body.appendChild(form);

Atau, jika Anda menggunakan jQuery seperti di atas: $(document.body).append(form);

Detail: Menurut standar HTML, jika formulir tidak terkait dengan konteks penelusuran (dokumen), pengiriman formulir akan dibatalkan.

HTML SPEC lihat 4.10.21.3.2

Di Chrome 56, spesifikasi ini diterapkan.

Perbedaan kode Chrome lihat @@ -347,9 +347,16 @@

PS tentang pertanyaan Anda # 1. Menurut pendapat saya, tidak seperti ajax, pengiriman formulir menyebabkan pemindahan halaman instan.
Jadi, menampilkan 'pesan peringatan yang sudah usang' hampir tidak mungkin.
Saya juga berpikir itu tidak dapat diterima bahwa perubahan serius ini tidak termasuk dalam daftar perubahan fitur. Fitur Chrome 56 - www.chromestatus.com/features#milestone%3D56

KyungHun Jeon
sumber
4
Baru saja bug ini dilaporkan oleh beberapa pengguna. Juga, beberapa pengguna lain tidak memiliki versi yang ditingkatkan, sehingga mereka dapat mengirimkan formulir tanpa masalah. Membuat bug lebih tidak konsisten. Terima kasih atas jawaban anda!
Ironicnet
Solusi yang diusulkan tidak bekerja untuk saya dalam kombinasi dengan penggunaan jQuery, seperti pada pertanyaan awal. Ini bekerja sebagai gantinya: $(document.body).append(form);
Chris
1
@ Chris Saya baru saja mengedit jawaban yang diterima, karena variabel bentuk adalah objek jQuery, bukan elemen bentuk DOM yang sebenarnya. Seperti yang digunakan form[0], itu akan menghasilkan kesalahan "Gagal menjalankan 'appendChild' pada 'Node': parameter 1 bukan tipe 'Node'." di Chrome. Jadi, ubah saja document.body.appendChild(form[0]).
ryanm
@ryanm, saya hanya seorang editor karena saya berkontribusi pada baris berikut $(document.body).append(form);. Anda dapat menambahkan solusi Anda ke jawaban yang diterima dengan mengeditnya atau bertanya kepada @KyungHun Jeon apakah dia ingin mengadopsi solusi Anda alih-alih miliknya.
Chris
@ Chris terima kasih! Saya pikir karena pertanyaannya adalah di jQuery, jawabannya harus terlalu (bisa membingungkan), tetapi hasil edit saya sepertinya ditolak. Hanya perlu dicatat untuk orang lain yang lewat document.body.appendChild(form[0])(sedikit lebih cepat) ATAU $(document.body).append(form).
ryanm
50

jika Anda melihat kesalahan ini di Bereaksi JS ketika Anda mencoba mengirimkan formulir dengan menekan enter, pastikan semua tombol Anda di formulir yang tidak mengirimkan formulir memiliki a type="button".

Jika Anda hanya memiliki satu buttondengan type="submit"menekan Enter akan mengirimkan formulir seperti yang diharapkan.

Referensi :
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-for-react-forms/ https://github.com/facebook/react/issues/2093

vaskort
sumber
6
juga hal yang harus diwaspadai dalam Bereaksi, <form>masih harus membuat di DOM setelah diklik. yaitu, ini akan gagal `{this.state.submitting? <div> Formulir sedang dikirimkan </div>: <formulir onSubmit = {() => this.setState ({submitting: true}) ...> <button ...> </form>} `Jadi ketika formulir dikirimkan, state.submittingdiatur, dan pesan "mengirim ..." merender alih-alih formulir, maka kesalahan ini terjadi. Memindahkan tag formulir di luar persyaratan memastikan bahwa selalu ada saat diperlukan.
Mike Ruhlin
Bagus untuk mengetahui. Saya kira Anda tidak perlu mengubah seluruh formelemen menjadi a div. Saya percaya bahwa jika Anda hanya mengubah konten formalih - alih mengganti elemen, itu akan berfungsi seperti yang diharapkan.
vaskort
Jadi, seperti yang dikatakan Max Williams, ini adalah kondisi balapan - browser memeriksa apakah form ada di sana, tetapi form sudah hilang.
pianoJames
preventDefault () menyebabkan lansiran ini dari Chrome
imbatman
12

tambahkan type type = "button" ke tombol pada siapa yang mengklik Anda melihat kesalahan, itu bekerja untuk saya.

Tayyab Mehar
sumber
Bekerja dengan baik untuk saya: thumbsup:
cederlof
11

Anda harus memastikan bahwa formulir ada di dokumen. Anda dapat menambahkan formulir ke tubuh.

Liu Tao
sumber
7
Saya punya ini dan ternyata ada onclick yang ditambahkan ke tombol remote form submit, yang menghapus elemen yang mengandung form. Jadi pada dasarnya ada kondisi ras antara formulir yang diajukan dan formulir yang dihapus.
Max Williams
4
Terima kasih @ Max Williams, komentar Anda membuat saya kembali ke jalur lebih dari jawaban yang diterima.
JirkaV
11

alternatifnya termasuk event.preventDefault (); di handleSubmit (acara) Anda {

lihat https://facebook.github.io/react/docs/forms.html

joncode
sumber
2
Tautan ke sumber daya eksternal dianjurkan, tetapi tolong tambahkan konteks di sekitar tautan sehingga sesama pengguna Anda akan mengetahui apa itu dan mengapa ada di sana. Selalu kutip bagian yang paling relevan dari tautan penting, jika situs target tidak dapat dijangkau atau offline secara permanen. Lihat bagaimana menulis jawaban yang bagus
Peter Reid
Menggunakan àntdformulir. Ini membantu.
Eduard
8

Saya melihat Anda menggunakan jQuery untuk inisialisasi formulir.

Ketika saya mencoba jawaban @KyungHun Jeon, itu tidak berhasil bagi saya yang menggunakan jQuery juga.

Jadi, saya mencoba menambahkan formulir ke tubuh dengan menggunakan cara jQuery:

$(document.body).append(form);

Dan itu berhasil!

Rizki Pratama
sumber
6

Suatu hal yang perlu diwaspadai jika Anda melihat ini di Bereaksi, adalah bahwa <form>masih harus membuat di DOM saat mengirimkan. yaitu, ini akan gagal

{ this.state.submitting ? 
     <div>Form is being submitted</div> :
     <form onSubmit={()=>this.setState({submitting: true}) ...>
         <button ...>
     </form>
}

Jadi ketika formulir dikirimkan, state.submittingdiatur dan pesan "yang mengirimkan ..." menjadikan alih-alih formulir, maka kesalahan ini terjadi.

Memindahkan tag formulir di luar persyaratan memastikan bahwa selalu ada ketika diperlukan, yaitu

<form onSubmit={...} ...>
  { this.state.submitting ? 
     <div>Form is being submitted</div> :
     <button ...>
  }
</form>
Mike Ruhlin
sumber
Kondisi balapan!
pianoJames
2

Saya menghadapi masalah yang sama di salah satu implementasi kami.

kami menggunakan jquery.forms.js. yang merupakan plugin formulir dan tersedia di sini. http://malsup.com/jquery/form/

kami menggunakan jawaban yang sama yang diberikan di atas dan ditempelkan

$(document.body).append(form);

dan itu berhasil. Terima kasih.

Abhinav Chawla
sumber
1

Bergantung pada jawaban dari KyungHun Jeon, tetapi appendChild mengharapkan dom dom, jadi tambahkan indeks ke objek jquery untuk mengembalikan simpul: document.body.appendChild(form[0])

moti irom
sumber
2
Maksudmu document.body.appendChild(form[0])?
efeder
1

Menambahkan untuk anak cucu karena ini tidak terkait dengan krom tetapi ini adalah utas pertama yang muncul di google saat mencari kesalahan pengiriman formulir ini.

Dalam kasus kami, kami melampirkan fungsi untuk mengganti div html saat ini dengan animasi "memuat" saat pengiriman - karena itu terjadi sebelum formulir dikirimkan, tidak ada lagi formulir atau data yang harus dikirim.

Kesalahan yang sangat jelas dalam retrospeksi tetapi jika ada orang yang berakhir di sini mungkin menghemat waktu di masa depan.

Matt H
sumber
1

Saya telah menerima kesalahan ini di react.js. Jika Anda memiliki tombol dalam bentuk yang Anda ingin bertindak seperti tombol dan tidak mengirimkan formulir, Anda harus memberikannya ketik = "tombol". Kalau tidak, ia mencoba mengirimkan formulir. Saya percaya vaskort menjawab ini dengan beberapa dokumentasi yang dapat Anda periksa.

Yesaya Larsen
sumber
Ini peringatan: Pengiriman formulir dibatalkan karena formulir tidak terhubung. Maaf karena lupa menambahkannya.
Isaiah Larsen
1
Saya dapat mengkonfirmasi ini. Saya mendapat peringatan yang sama di Bereaksi, Form submission canceled because the form is not connectedsetiap kali saya menekan tombol "Batalkan" formulir saya. Setelah menambahkan type="button"ke tombol "Batal", saya tidak lagi menerima peringatan. Terima kasih!
Ben
1

Saya dapat menyingkirkan pesan dengan menambahkan atribut type = "button" ke elemen tombol di vue.

Pasham Akhil Kumar Reddy
sumber
0

Anda juga dapat menyelesaikannya, dengan menerapkan satu tambalan di jquery-xxxjs setelah menambahkan "coba {rp;} catch (m) {}" baris 1833 kode ini:

if (r instanceof HTMLFormElement &&! r.parentNode) { r.style.display = "none"; document.body.append (r); r [p] (); }

Ini memvalidasi ketika formulir bukan bagian dari tubuh dan menambahkannya.

Gaytan
sumber
0

Saya perhatikan bahwa saya mendapatkan kesalahan ini, karena kode HTML saya tidak memiliki <body>tag.

Tanpa a <body>, ketika document.body.appendChild(form);pernyataan tidak memiliki objek tubuh untuk ditambahkan.

Gleno
sumber
-1

Saya melihat pesan ini menggunakan sudut, jadi saya hanya mengambil metode = "posting" dan tindakan = "" keluar, dan peringatan itu hilang.

omong kosong
sumber