ได้รับข้อผิดพลาด“ การส่งแบบฟอร์มถูกยกเลิกเนื่องจากไม่ได้เชื่อมต่อแบบฟอร์ม”


156

ฉันมีเว็บไซต์เก่าที่มี JQuery 1.7 ซึ่งทำงานได้อย่างถูกต้องจนถึงสองวันที่ผ่านมา ทันใดนั้นปุ่มบางปุ่มของฉันไม่ทำงานอีกต่อไปและหลังจากคลิกปุ่มเหล่านี้ฉันได้รับคำเตือนนี้ในคอนโซล:

การส่งแบบฟอร์มถูกยกเลิกเนื่องจากไม่ได้เชื่อมต่อแบบฟอร์ม

โค้ดที่อยู่หลังการคลิกนั้นเป็นดังนี้:

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

ดูเหมือนว่า Chrome 56 จะไม่สนับสนุนรหัสประเภทนี้อีกต่อไป ไม่ใช่เหรอ ถ้าใช่คำถามของฉันคือ:

  1. ทำไมสิ่งนี้จึงเกิดขึ้นโดยฉับพลัน? ไม่มีคำเตือนการเลิกใช้งานหรือไม่
  2. วิธีแก้ไขสำหรับรหัสนี้คืออะไร
  3. มีวิธีบังคับให้ chrome (หรือเบราว์เซอร์อื่น ๆ ) ทำงานเหมือนก่อนโดยไม่ต้องเปลี่ยนรหัสหรือไม่?

ป.ล. มันไม่ทำงานใน firefox รุ่นล่าสุดเช่นกัน (ไม่มีข้อความ) นอกจากนี้มันไม่ทำงานใน IE 11.0 & Edge! (ทั้งสองโดยไม่มีข้อความใด ๆ )


ฉันเพิ่มการแก้ไขในคำตอบที่ยอมรับเพื่อให้ตรงกับความจริงที่ว่าฟอร์มเป็นวัตถุ jQuery หมายเหตุสิ่งนี้ยังส่งผลต่อ.submit()ตัวจัดการjQuery (นอกเหนือจาก.click()วิธีที่ระบุไว้ข้างต้น)
ryanm

คำตอบ:


185

คำตอบด่วน: ต่อท้ายแบบฟอร์มต่อร่างกาย

document.body.appendChild(form);

หรือหากคุณใช้ jQuery ดังกล่าว: $(document.body).append(form);

รายละเอียด: ตามมาตรฐาน HTML หากแบบฟอร์มไม่เกี่ยวข้องกับบริบทการสืบค้น (เอกสาร) การส่งแบบฟอร์มจะถูกยกเลิก

HTML SPECดู 4.10.21.3.2

ใน Chrome 56 ข้อกำหนดนี้ถูกนำไปใช้

รหัส Chrome แตกต่างกันไปที่ @@ -347,9 +347,16 @@

ป.ล. เกี่ยวกับคำถาม # 1 ของคุณ ในความคิดของฉันไม่เหมือนอาแจ็กซ์การส่งแบบฟอร์มทำให้เกิดการย้ายหน้าทันที
ดังนั้นการแสดง 'ข้อความเตือนที่เลิกใช้งานแล้ว' จึงเป็นไปไม่ได้
ฉันยังคิดว่าไม่สามารถยอมรับได้ว่าการเปลี่ยนแปลงที่ร้ายแรงนี้ไม่รวมอยู่ในรายการการเปลี่ยนแปลงคุณสมบัติ คุณลักษณะของ Chrome 56 - www.chromestatus.com/features#milestone%3D56


4
เพิ่งมีข้อผิดพลาดนี้รายงานโดยผู้ใช้บางคน นอกจากนี้ผู้ใช้รายอื่นบางคนไม่มีรุ่นอัปเกรดดังนั้นพวกเขาสามารถส่งแบบฟอร์มโดยไม่มีปัญหา ทำให้บั๊กไม่สอดคล้องกันมากขึ้น ขอบคุณสำหรับคำตอบ!
Ironicnet

วิธีแก้ปัญหาที่เสนอไม่สามารถใช้งานร่วมกับการใช้ jQuery ได้เช่นเดียวกับคำถามเดิม สิ่งนี้ใช้ได้แทน: $(document.body).append(form);
Chris

1
@ Chris ฉันเพิ่งแก้ไขคำตอบที่ยอมรับเนื่องจากตัวแปรฟอร์มเป็นวัตถุ jQuery ไม่ใช่องค์ประกอบของฟอร์ม DOM จริง ในขณะที่ใช้form[0]งานอยู่มันจะสร้างข้อผิดพลาด "ไม่สามารถเรียกใช้ 'appendChild' บน 'Node': พารามิเตอร์ 1 ไม่ใช่ประเภท 'Node' ใน Chrome document.body.appendChild(form[0])ดังนั้นเพียงแค่เปลี่ยนไป
ryanm

@ryanm $(document.body).append(form);ผมเพียงแค่แก้ไขเท่าที่ผมมีส่วนบรรทัดต่อไปนี้ คุณสามารถเพิ่มโซลูชันของคุณไปยังคำตอบที่ยอมรับได้โดยแก้ไขหรือขอ @KyungHun Jeon ว่าเขาต้องการที่จะใช้โซลูชันของคุณแทนเขาหรือไม่
Chris

@Chris ขอบคุณ! ฉันคิดว่าตั้งแต่คำถามเป็น jQuery คำตอบควรจะเกินไป (อาจสับสน) แต่การแก้ไขของฉันดูเหมือนว่าจะถูกปฏิเสธ เพียงแค่ทราบแล้วสำหรับคนอื่น ๆ โดยที่จะสามารถdocument.body.appendChild(form[0])(เร็วขึ้นเล็กน้อย) $(document.body).append(form)OR
ไรอัน

50

ถ้าคุณจะเห็นข้อผิดพลาดในการตอบสนอง JS type="button"เมื่อคุณพยายามที่จะส่งแบบฟอร์มโดยการกดป้อนให้แน่ใจว่าทั้งหมดปุ่มของคุณในรูปแบบที่ไม่ได้ส่งแบบฟอร์มมี

หากคุณมีเพียงคนเดียวที่buttonมีtype="submit"การกด Enter จะส่งแบบฟอร์มตามที่คาดไว้

ข้อมูลอ้างอิง :
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-for-react-forms/ https://github.com/facebook/react/issues/2093


6
สิ่งที่ต้องระวังใน React <form>ยังคงต้องมีการเรนเดอร์ใน DOM หลังจากคลิกแล้ว เช่นนี้จะล้มเหลว `{this.state.submitting? <div> กำลังส่งแบบฟอร์ม </div>: <form onSubmit = {() => this.setState ({ส่ง: จริง}) ... > <ปุ่ม ... > </form>} `ดังนั้นเมื่อ ส่งแบบฟอร์มแล้วstate.submittingตั้งค่าและข้อความ "กำลังส่ง ... " แสดงแทนแบบฟอร์มจากนั้นข้อผิดพลาดนี้จะเกิดขึ้น การย้ายแท็กฟอร์มภายนอกเงื่อนไขทำให้มั่นใจได้ว่ามันจะอยู่ที่นั่นเสมอเมื่อจำเป็น
Mike Ruhlin

ดีที่รู้. ผมคิดว่าคุณจะได้ไม่ต้องเปลี่ยนทั้งองค์ประกอบไปform divฉันเชื่อว่าถ้าคุณเพียงแค่เปลี่ยนเนื้อหาของformแทนที่จะแทนที่องค์ประกอบมันจะทำงานได้ตามที่คาดไว้
vaskort

ดังนั้นแม็กซ์วิลเลียมส์จึงกล่าวว่าเป็นสภาวะการแข่งขัน - เบราว์เซอร์กำลังตรวจสอบว่าฟอร์มอยู่ที่นั่นหรือไม่ แต่ฟอร์มหายไปแล้ว
pianoJames

PreventDefault () ทำให้การแจ้งเตือนนี้จาก Chrome
imbatman

ลิงก์แรกใช้งานไม่ได้: web.archive.org/web/20170410070341/http://dzello.com/blog/2017/…
cmp

12

เพิ่ม attribute type = "button"ไปที่ปุ่มบนว่าใครคลิกคุณเห็นข้อผิดพลาดมันใช้งานได้สำหรับฉัน


ทำงานได้ดีสำหรับฉัน: thumbsup:
cederlof

11

คุณต้องทำให้แน่ใจว่าแบบฟอร์มนั้นอยู่ในเอกสาร คุณสามารถเพิ่มแบบฟอร์มต่อท้ายเนื้อหา


7
ฉันมีสิ่งนี้และมันกลับกลายเป็นว่ามีออนคลิกเพิ่มปุ่มส่งแบบฟอร์มระยะไกลซึ่งลบองค์ประกอบที่มีแบบฟอร์ม ดังนั้นโดยทั่วไปสภาพการแข่งขันระหว่างแบบฟอร์มที่ถูกส่งและแบบฟอร์มจะถูกลบออก
Max Williams

4
ขอบคุณ @ Max Williams ความคิดเห็นของคุณทำให้ฉันกลับมาติดตามมากกว่าคำตอบที่ยอมรับ
JirkaV

11

หรือรวมถึง event.preventDefault (); ใน handleSubmit ของคุณ (เหตุการณ์) {

ดูhttps://facebook.github.io/react/docs/forms.html


2
ลิงก์ไปยังแหล่งข้อมูลภายนอกได้รับการสนับสนุน แต่โปรดเพิ่มบริบทรอบ ๆ ลิงก์เพื่อให้ผู้ใช้ของคุณมีความคิดว่ามันคืออะไรและเพราะเหตุใด อ้างถึงส่วนที่เกี่ยวข้องที่สุดของลิงค์สำคัญเสมอในกรณีที่เว็บไซต์เป้าหมายไม่สามารถเข้าถึงหรือออฟไลน์อย่างถาวร ดูวิธีเขียนคำตอบที่ดี
Peter Reid

ใช้àntdแบบฟอร์ม สิ่งนี้ช่วยได้
Eduard

8

ฉันเห็นว่าคุณกำลังใช้ jQuery สำหรับการเริ่มต้นแบบฟอร์ม

เมื่อฉันลองตอบ @KyungHun Jeon มันก็ไม่ได้ผลสำหรับฉันที่ใช้ jQuery ด้วย

ดังนั้นฉันพยายามต่อท้ายแบบฟอร์มกับเนื้อหาโดยใช้วิธี jQuery:

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

และมันก็ใช้งานได้!


6

สิ่งที่ต้องระวังหากคุณเห็นสิ่งนี้ใน React คือ<form>ยังต้องแสดงใน DOM ขณะที่ส่ง นั่นคือสิ่งนี้จะล้มเหลว

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

ดังนั้นเมื่อส่งแบบฟอร์มให้state.submittingตั้งค่าและข้อความ "กำลังส่ง ... " วาทกรรมแทนแบบฟอร์มดังนั้นข้อผิดพลาดนี้จะเกิดขึ้น

การย้ายแท็กฟอร์มภายนอกเงื่อนไขทำให้มั่นใจได้ว่ามันจะอยู่ที่นั่นเสมอเมื่อจำเป็นเช่น

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

เงื่อนไขการแข่งขัน!
pianoJames

2

ฉันประสบปัญหาเดียวกันในการดำเนินการอย่างใดอย่างหนึ่งของเรา

เราใช้ jquery.forms.js ซึ่งเป็นปลั๊กอินของฟอร์มและมีให้ที่นี่ http://malsup.com/jquery/form/

เราใช้คำตอบเดียวกันที่ให้ไว้ข้างต้นและวาง

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

และมันก็ใช้ได้ดีขอบคุณ


1

ขึ้นอยู่กับคำตอบจาก KyungHun Jeon แต่ appendChild คาดหวังว่าโหนด dom ดังนั้นเพิ่มดัชนีไปยังวัตถุ jquery เพื่อส่งกลับโหนด: document.body.appendChild(form[0])


2
คุณหมายถึงdocument.body.appendChild(form[0])อะไร
efeder

1

การเพิ่มสำหรับลูกหลานเนื่องจากไม่ได้เกี่ยวข้องกับโครม แต่เป็นกระทู้แรกที่ปรากฏบน Google เมื่อค้นหาข้อผิดพลาดในการส่งแบบฟอร์มนี้

ในกรณีของเราเราแนบฟังก์ชันเพื่อแทนที่ div html ปัจจุบันด้วยภาพเคลื่อนไหว "loading" เมื่อส่ง - เนื่องจากมันเกิดขึ้นก่อนที่จะส่งแบบฟอร์มนั้นไม่มีรูปแบบหรือข้อมูลใด ๆ ที่จะส่งอีกต่อไป

ข้อผิดพลาดที่ชัดเจนมากในการหวนกลับ แต่ในกรณีที่ทุกคนลงเอยที่นี่อาจช่วยพวกเขาในอนาคต


1

ฉันได้รับข้อผิดพลาดนี้ใน react.js หากคุณมีปุ่มในแบบฟอร์มที่คุณต้องการทำตัวเหมือนปุ่มและไม่ส่งแบบฟอร์มคุณจะต้องให้ type = "button" มิฉะนั้นจะพยายามส่งแบบฟอร์ม ฉันเชื่อว่า vaskort ตอบคำถามนี้พร้อมเอกสารบางอย่างที่คุณสามารถตรวจสอบได้


มันเป็นคำเตือน: การส่งแบบฟอร์มถูกยกเลิกเนื่องจากไม่ได้เชื่อมต่อแบบฟอร์ม ขออภัยที่ลืมเพิ่ม
อิสยาห์ Larsen

1
ฉันยืนยันสิ่งนี้ได้ ฉันได้รับคำเตือนเดียวกันใน React Form submission canceled because the form is not connectedเมื่อใดก็ตามที่ฉันกดปุ่ม "ยกเลิก" ของแบบฟอร์ม หลังจากเพิ่มtype="button"ปุ่ม "ยกเลิก" ของฉันฉันไม่ได้รับคำเตือนอีกต่อไป ขอบคุณ!
เบ็น


0

คุณสามารถแก้ไขได้โดยใช้โปรแกรมปะแก้เพียงอันเดียวใน jquery-xxxjs เพียงเพิ่มหลังจาก "ลอง {rp;} catch (m) {}" บรรทัด 1833 โค้ดนี้:

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

สิ่งนี้จะตรวจสอบเมื่อฟอร์มไม่ได้เป็นส่วนหนึ่งของร่างกายและเพิ่มฟอร์มนั้น


0

ฉันสังเกตเห็นว่าฉันได้รับข้อผิดพลาดนี้เนื่องจากรหัส HTML ของฉันไม่มี<body>แท็ก

หากไม่มีคำสั่งa <body>เมื่อไม่มีdocument.body.appendChild(form);คำสั่ง body body ให้ต่อท้าย


-1

ฉันเห็นข้อความนี้ใช้มุมดังนั้นฉันเพิ่งใช้วิธี = "โพสต์" และการกระทำ = "" ออกและคำเตือนหายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.