Nhận lỗi Gửi biểu mẫu bị hủy vì biểu mẫu không được kết nối


156

Tôi có một trang web cũ với JQuery 1.7 hoạt động chính xác cho đến hai ngày trước. Đột nhiên một số nút của tôi không hoạt động nữa và sau khi nhấp vào chúng, tôi nhận được cảnh báo này trong bảng điều khiển:

Gửi biểu mẫu bị hủy vì biểu mẫu không được kết nối

Mã đằng sau nhấp chuột là một cái gì đó như thế này:

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

Có vẻ như Chrome 56 không còn hỗ trợ loại mã này nữa. Phải không? Nếu có, câu hỏi của tôi là:

  1. Tại sao điều này xảy ra đột ngột? Nếu không có bất kỳ cảnh báo khấu hao?
  2. Cách giải quyết cho mã này là gì?
  3. Có cách nào để buộc chrome (hoặc các trình duyệt khác) hoạt động như trước mà không thay đổi bất kỳ mã nào không?

PS Nó không hoạt động trong phiên bản firefox mới nhất (không có bất kỳ tin nhắn nào). Ngoài ra, nó không hoạt động trong IE 11.0 & Edge! (cả hai đều không có tin nhắn nào)


Tôi đã thêm một bản sửa lỗi trong câu trả lời được chấp nhận để phù hợp với thực tế là biểu mẫu đó là một đối tượng jQuery. Lưu ý điều này cũng ảnh hưởng đến .submit()trình xử lý jQuery (ngoài .click()phương thức được chỉ ra ở trên).
ryanm

Câu trả lời:


185

Trả lời nhanh: nối các hình thức vào cơ thể.

document.body.appendChild(form);

Hoặc, nếu bạn đang sử dụng jQuery như trên: $(document.body).append(form);

Chi tiết: Theo tiêu chuẩn HTML, nếu biểu mẫu không được liên kết với bối cảnh duyệt web (tài liệu), việc gửi biểu mẫu sẽ bị hủy bỏ.

HTML Đặc biệt xem 4.10.21.3.2

Trong Chrome 56, thông số này đã được áp dụng.

Mã Chrome khác nhau xem @@ -347,9 +347,16 @@

PS về câu hỏi của bạn # 1. Theo tôi, không giống như ajax, việc gửi biểu mẫu gây ra việc di chuyển trang ngay lập tức.
Vì vậy, hiển thị 'thông điệp cảnh báo không dùng nữa' là gần như không thể.
Tôi cũng nghĩ rằng không thể chấp nhận được rằng thay đổi nghiêm trọng này không có trong danh sách thay đổi tính năng. Các tính năng của Chrome 56 - www.chromestatus.com/features#milestone%3D56


4
Chỉ có lỗi này được báo cáo bởi một số người dùng. Ngoài ra, một số người dùng khác không có phiên bản nâng cấp, vì vậy họ có thể gửi biểu mẫu mà không gặp sự cố. Làm cho lỗi không nhất quán hơn. Cảm ơn câu trả lời của bạn!
Ironicnet

Giải pháp đề xuất không phù hợp với tôi khi kết hợp với việc sử dụng jQuery, như trong câu hỏi ban đầu. Điều này hoạt động thay thế: $(document.body).append(form);
Chris

1
@Chris Tôi vừa chỉnh sửa câu trả lời được chấp nhận, vì biến biểu mẫu là một đối tượng jQuery, không phải là thành phần biểu mẫu DOM thực tế. Khi sử dụng form[0], nó sẽ tạo ra lỗi "Không thể thực thi 'appendChild' trên 'Nút': tham số 1 không thuộc loại 'Nút'." trong Chrome. Như vậy, chỉ cần thay đổi thành document.body.appendChild(form[0]).
ryanm

@ryanm, tôi chỉ là một biên tập viên khi tôi đóng góp dòng sau $(document.body).append(form);. Bạn được hoan nghênh thêm giải pháp của bạn vào câu trả lời được chấp nhận bằng cách chỉnh sửa hoặc hỏi @KyungHun Jeon nếu anh ấy muốn áp dụng giải pháp của bạn thay vì giải pháp của mình.
Chris

@Chris cảm ơn! Tôi đã tìm ra vì câu hỏi là trong jQuery, câu trả lời cũng vậy (có thể gây nhầm lẫn), nhưng chỉnh sửa của tôi có vẻ như đã bị từ chối. Chỉ cần một lưu ý sau đó cho những người qua đường khác là nó có thể document.body.appendChild(form[0])(nhanh hơn một chút) HOẶC $(document.body).append(form).
ryanm

49

nếu bạn gặp lỗi này trong React JS khi bạn cố gắng gửi biểu mẫu bằng cách nhấn enter, hãy đảm bảo tất cả các nút của bạn ở dạng không gửi biểu mẫu có a type="button".

Nếu bạn chỉ có một có buttonvới type="submit"nhấn Enter sẽ gửi biểu mẫu như mong đợi.

Tài liệu tham khảo :
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-for-react-forms/ https://github.com/facebook/react/issues/2093


6
cũng là một điều cần chú ý trong React, <form>vẫn phải kết xuất trong DOM sau khi nhấp vào. tức là, điều này sẽ thất bại `{this.state.submmit? <div> Biểu mẫu đang được gửi </ div>: <biểu mẫu trênSubmit = {() => this.setState ({submit: true}) ...> <nút ...> </ form>} `Vì vậy, khi biểu mẫu được gửi, state.submittingđược đặt và thông báo "gửi ..." hiển thị thay vì biểu mẫu, sau đó lỗi này xảy ra. Di chuyển thẻ biểu mẫu bên ngoài điều kiện đảm bảo rằng nó luôn ở đó khi cần.
Mike Ruhlin

Rất vui được biết. Tôi đoán bạn không phải thay đổi toàn bộ thành formphần a div. Tôi tin rằng nếu bạn chỉ thay đổi nội dung của formthay vì thay thế phần tử thì nó sẽ hoạt động như mong đợi.
vaskort

Vì vậy, như Max Williams đã nói, đó là một điều kiện cuộc đua - trình duyệt đang kiểm tra xem biểu mẫu có ở đó không, nhưng biểu mẫu đã biến mất.
pianoJames



12

thêm thuộc tính type = "button" vào nút khi ai nhấp vào bạn sẽ thấy lỗi, nó hoạt động với tôi.


Làm việc tốt cho tôi: thumbsup:
cederlof

11

Bạn phải đảm bảo rằng mẫu có trong tài liệu. Bạn có thể nối các hình thức vào cơ thể.


7
Tôi đã có cái này và hóa ra có một onclick được thêm vào nút gửi biểu mẫu từ xa, loại bỏ phần tử chứa biểu mẫu. Vì vậy, về cơ bản có một điều kiện cuộc đua giữa mẫu được gửi và mẫu bị xóa.
Max Williams

4
Cảm ơn @Max Williams, bình luận của bạn đưa tôi trở lại theo dõi nhiều hơn câu trả lời được chấp nhận.
JirkaV

11

cách khác bao gồm event.preventDefault (); trong tay cầm của bạnSubmit (sự kiện) {

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


2
Liên kết đến các tài nguyên bên ngoài được khuyến khích, nhưng vui lòng thêm ngữ cảnh xung quanh liên kết để người dùng đồng nghiệp của bạn sẽ có một số ý tưởng về nó là gì và tại sao nó ở đó. Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang đích không thể truy cập được hoặc ngoại tuyến vĩnh viễn. Xem cách viết câu trả lời hay
Peter Reid

Sử dụng àntdcác hình thức. Điều này đã giúp.
Eduard

8

Tôi thấy bạn đang sử dụng jQuery để khởi tạo biểu mẫu.

Khi tôi thử câu trả lời của @KyungHun Jeon, tôi cũng không sử dụng jQuery.

Vì vậy, tôi đã thử gắn biểu mẫu vào phần thân bằng cách sử dụng cách jQuery:

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

Va no đa hoạt động!


6

Một điều cần chú ý nếu bạn thấy điều này trong React, đó là <form>vẫn phải hiển thị trong DOM trong khi gửi. tức là, điều này sẽ thất bại

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

Vì vậy, khi biểu mẫu được gửi, state.submittingđược đặt và thông báo "gửi ..." hiển thị thay vì biểu mẫu, thì lỗi này xảy ra.

Di chuyển thẻ biểu mẫu bên ngoài điều kiện đảm bảo rằng nó luôn ở đó khi cần, tức là

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

Điều kiện cuộc đua!
pianoJames 16/11/18

2

Tôi đã đối mặt với cùng một vấn đề trong một trong những thực hiện của chúng tôi.

chúng tôi đã sử dụng jquery.forms.js. đó là một plugin hình thức và có sẵn ở đây.http://malsup.com/jquery/form/

chúng tôi đã sử dụng cùng một câu trả lời được cung cấp ở trên và dán

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

và nó đã làm việc. Cảm ơn.


1

Tùy thuộc vào câu trả lời từ KyungHun Jeon, nhưng appendChild mong đợi một nút dom, vì vậy hãy thêm một chỉ mục vào đối tượng jquery để trả về nút: document.body.appendChild(form[0])


2
Ý bạn là document.body.appendChild(form[0])sao?
efeder

1

Thêm cho hậu thế vì điều này không liên quan đến chrome nhưng đây là chủ đề đầu tiên xuất hiện trên google khi tìm kiếm lỗi gửi biểu mẫu này.

Trong trường hợp của chúng tôi, chúng tôi đã đính kèm một chức năng để thay thế div html hiện tại bằng hình ảnh động "đang tải" khi gửi - vì nó xuất hiện trước khi biểu mẫu được gửi, không còn bất kỳ biểu mẫu hoặc dữ liệu nào để gửi.

Lỗi rất rõ ràng khi nhìn lại nhưng trong trường hợp bất kỳ ai kết thúc ở đây, nó có thể giúp họ tiết kiệm thời gian trong tương lai.


1

Tôi đã nhận được lỗi này trong Reac.js. Nếu bạn có một nút ở dạng mà bạn muốn hoạt động như một nút và không gửi biểu mẫu, bạn phải cung cấp cho nó loại = "nút". Nếu không, nó cố gắng gửi biểu mẫu. Tôi tin rằng vaskort đã trả lời điều này với một số tài liệu bạn có thể kiểm tra.


Đó là một cảnh báo: Gửi biểu mẫu bị hủy vì biểu mẫu không được kết nối. Xin lỗi vì đã quên để thêm điều đó.
Ê-sai Larsen

1
Tôi có thể xác nhận điều này. Tôi đã nhận được cảnh báo tương tự trong React, Form submission canceled because the form is not connectedbất cứ khi nào tôi nhấn nút "Hủy" của biểu mẫu. Sau khi thêm type="button"vào nút "Hủy", tôi không còn nhận được cảnh báo nữa. Cảm ơn!
Ben

1

Tôi đã có thể loại bỏ tin nhắn bằng cách thêm thuộc tính type = "button" vào thành phần nút trong vue.


0

Bạn cũng có thể giải quyết nó, bằng cách áp dụng một bản vá duy nhất trong jquery-xxxjs chỉ cần thêm sau "thử {rp;} Catch (m) {}" dòng 1833 mã này:

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

Điều này xác nhận khi một hình thức không phải là một phần của cơ thể và thêm nó.


-1

Tôi thấy thông báo này sử dụng angular, vì vậy tôi mới lấy phương thức = "post" và action = "", và cảnh báo đã biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.