Hata Alma “Form bağlı olmadığı için form gönderimi iptal edildi”


156

İki gün öncesine kadar doğru çalışan JQuery 1.7 ile eski bir web sitem var. Birden düğmelerim artık çalışmıyor ve üzerlerine tıkladıktan sonra konsolda şu uyarıyı alıyorum:

Form bağlı olmadığı için form gönderimi iptal edildi

Tıklamanın arkasındaki kod şuna benzer:

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

Görünüşe göre Chrome 56 bu tür kodları desteklemiyor. Öyle değil mi? Evet ise sorum şu:

  1. Bu neden aniden oldu? Kullanımdan kaldırma uyarısı olmadan?
  2. Bu kod için geçici çözüm nedir?
  3. Herhangi bir kodu değiştirmeden krom (veya diğer tarayıcıları) daha önce olduğu gibi çalışmaya zorlamanın bir yolu var mı?

PS En son firefox sürümünde de (mesajsız) çalışmaz. Ayrıca IE 11.0 & Edge'de çalışmıyor! (her ikisi de mesajsız)


Formun bir jQuery nesnesi olduğu gerçeğiyle eşleşmesi için kabul edilen yanıta bir düzeltme ekledim. Bunun jQuery .submit()işleyicisini de etkilediğini unutmayın ( .click()yukarıda belirtilen yönteme ek olarak ).
ryanm

Yanıtlar:


185

Hızlı cevap: formu vücuda ekleyin.

document.body.appendChild(form);

Veya yukarıdaki gibi jQuery kullanıyorsanız: $(document.body).append(form);

Ayrıntılar: HTML standartlarına göre, form göz atma bağlamıyla (belge) ilişkili değilse, form gönderme işlemi iptal edilir.

HTML SPEC bkz. 4.10.21.3.2

Chrome 56'da bu spesifikasyon uygulandı.

Chrome kodu farkı bkz. @@ -347,9 +347,16 @@

PS, soru # 1 hakkında. Benim düşünceme göre, ajax'ın aksine, form gönderme anında sayfa hareketine neden olur.
Dolayısıyla, 'kullanımdan kaldırılmış uyarı mesajı' göstermek neredeyse imkansızdır.
Ayrıca, bu ciddi değişikliğin özellik değişiklik listesinde yer almasının kabul edilemez olduğunu düşünüyorum. Chrome 56 özellikleri - www.chromestatus.com/features#milestone%3D56


4
Bu hata bazı kullanıcılar tarafından bildirildi. Ayrıca, bazı diğer kullanıcılar yükseltilmiş sürüme sahip değildi, bu yüzden formu sorunsuz bir şekilde gönderebilirler. Hatayı daha tutarsız hale getirmek. Cevabınız için teşekkürler!
Ironicnet

Önerilen çözüm, orijinal sorudaki gibi jQuery kullanımı ile birlikte benim için çalışmadı. Bunun yerine şöyle çalıştı: $(document.body).append(form);
Chris

1
@Chris Kabul edilen yanıtı düzenledim, çünkü form değişkeni gerçek DOM form öğesi değil, bir jQuery nesnesi. Kullanıldığı için, form[0]"Düğüm" üzerinde 'appendChild' çalıştırılamadı: parametre 1 "Düğüm" türünde değil. " Chrome'da. Böylece, sadece değiştirin document.body.appendChild(form[0]).
ryanm

@ryanm, aşağıdaki satıra katkıda bulunduğum için sadece bir editörüm $(document.body).append(form);. Çözümünüzü kabul ederek yanıtınızı düzenleyerek veya @KyungHun Jeon'a çözümünüzü onun yerine benimsemek isteyip istemediğini sorabilirsiniz.
Chris

@Chris teşekkürler! Soru jQuery'de olduğundan, cevabın da (kafa karıştırıcı olabilir) olduğunu düşündüm, ancak düzenlemem reddedilmiş gibi görünüyor. Sadece bir not daha sonra diğer yolcular için document.body.appendChild(form[0])(biraz daha hızlı) VEYA olabilir $(document.body).append(form).
ryanm

50

formu enter tuşuna basarak göndermeye çalıştığınızda React JS'de bu hatayı görüyorsanız, formu göndermeyen tüm düğmelerinizde a işareti bulunduğundan emin olun type="button".

Yalnızca bir varsa buttonile type="submit"beklendiği gibi formu gönderecektir Enter tuşuna basarak.

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


6
Ayrıca React'de dikkat edilmesi gereken bir şey, <form>yine de tıklandıktan sonra DOM'da işlemek zorunda. yani, bu başarısız olur `{this.state.submitting? <div> Form gönderiliyor </div>: <form onSubmit = {() => this.setState ({gönderme: true}) ...> <düğme ...> </form>} ` form gönderilir, state.submittingayarlanır ve form yerine "gönderiliyor ..." iletisi görüntülenir, ardından bu hata oluşur. Form etiketini koşullu olarak taşımak, gerektiğinde her zaman orada olmasını sağladı.
Mike Ruhlin

Bilmek güzel. Sanırım tüm formöğeyi a olarak değiştirmek zorunda değilsiniz div. formÖğeyi değiştirmek yerine sadece içeriğini değiştirirseniz, beklendiği gibi çalışacağına inanıyorum.
vaskort

Max Williams'ın dediği gibi, bu bir yarış koşulu - tarayıcı formun orada olup olmadığını kontrol ediyor, ancak form zaten gitti.
pianoJames

preventDefault (), Chrome'dan bu uyarıya neden oluyor
imbatman


12

özniteliği türünü ekleyin = "düğme" hatayı kimin tıkladığını görürsünüz, benim için çalıştı.


Benim için iyi çalışıyor: thumbsup:
cederlof

11

Formun belgede olduğundan emin olmalısınız. Formu gövdeye ekleyebilirsiniz.


7
Bunu vardı ve formun içeren öğeyi kaldırarak uzak form gönderme düğmesine eklenen bir onclick olduğu ortaya çıktı. Dolayısıyla, esas olarak, gönderilen form ile kaldırılan form arasında bir yarış koşulu vardı.
Max Williams

4
Teşekkürler @Max Williams, yorumunuz beni kabul edilen cevaptan daha fazla takip ediyor.
JirkaV

11

alternatif olarak event.preventDefault (); sapındaSubmit (etkinlik) {

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


2
Dış kaynaklara bağlantılar teşvik edilir, ancak lütfen kullanıcılarınızın ne olduğunu ve neden orada olduğunu bilmeleri için bağlantının çevresine bağlam ekleyin. Hedef siteye erişilemiyorsa veya kalıcı olarak çevrimdışı olursa, her zaman önemli bir bağlantının en alakalı kısmını belirtin. İyi bir cevap yazmayı
Peter Reid

àntdFormları kullanma . Bu yardımcı oldu.
Eduard

8

Form başlatma için jQuery kullandığınızı görüyorum.

@KyungHun Jeon'un cevabını denediğimde, jQuery kullanan da benim için çalışmıyor.

Böylece, jQuery yolunu kullanarak formu vücuda eklemeyi denedim:

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

Ve işe yaradı!


6

Bunu React'te görürseniz dikkat etmeniz gereken bir şey, <form>gönderirken DOM'da hala işlemek zorunda olmasıdır. yani, bu başarısız olacak

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

Yani form gönderildiğinde, state.submitting ayarlanır ve form yerine "gönderiliyor ..." iletisi görüntülenirse, bu hata oluşur.

Form etiketini koşullu olarak taşımak, gerektiğinde her zaman orada olmasını sağladı, yani

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

Yarış koşulları!
pianoJames

2

Uygulamamızın birinde de aynı sorunla karşılaştım.

jquery.forms.js kullanıyorduk. Bu bir form eklentisidir ve burada mevcuttur. http://malsup.com/jquery/form/

Yukarıda verilen aynı cevabı kullandık ve yapıştırdık

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

ve işe yaradı.


1

KyungHun Jeon'un cevabına bağlı olarak, ancak appendChild bir dom düğümü bekliyor, bu nedenle düğümü döndürmek için jquery nesnesine bir dizin ekleyin: document.body.appendChild(form[0])


2
Yani document.body.appendChild(form[0])?
efeder

1

Bu, kromla ilgili olmadığından gelecek kuşaklar için ekleme yapmak, ancak bu form gönderme hatasını ararken Google'da gösterilen ilk iş parçacığıydı.

Bizim durumumuzda, mevcut div html'yi gönderimde "yükleme" animasyonu ile değiştirmek için bir işlev ekledik - form gönderilmeden önce gerçekleştiği için artık gönderilecek herhangi bir form veya veri yoktu.

Geçmişe bakıldığında çok bariz bir hata var, ancak burada kimse biterse gelecekte biraz zaman kazanabilir.


1

Bu hatayı reakt.js'de aldım. Formda düğme gibi davranmasını istediğiniz ve düğmeyi göndermediğiniz bir düğmeniz varsa, ona type = "button" vermelisiniz. Aksi takdirde formu göndermeye çalışır. Vaskort'un bunu kontrol edebileceğiniz bazı belgelerle yanıtladığını düşünüyorum.


Bu bir uyarıdır: Form bağlı olmadığından form gönderimi iptal edildi. Eklemeyi unuttuğum için üzgünüm.
Isaiah Larsen

1
Bunu onaylayabilirim. Aynı uyarıyı Formumun Form submission canceled because the form is not connected"İptal" düğmesine her bastığımda React'te aldım. type="button""İptal" düğmesine ekledikten sonra artık uyarı almıyorum. Teşekkürler!
Ben


0

Ayrıca, jquery-xxxjs içine tek bir düzeltme eki uygulayarak çözebilirsiniz, sadece "try {rp;} catch (m) {}" satır 1833'ten sonra bu kodu ekleyin:

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

Bu, bir form vücudun bir parçası olmadığında doğrular ve ekler.


0

HTML kodumun <body>etiketi olmadığından bu hatayı aldığımı fark ettim .

A olmadan <body>, document.body.appendChild(form);ifadenin eklenecek bir gövde nesnesi olmadığında.


-1

Açısal kullanarak bu mesajı gördüm, bu yüzden sadece method = "post" ve action = "" çıktım ve uyarı gitti.

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.