Getting Error "Form submission canceled because the form is not connected"
Asked Answered
P

22

215

I have an old website with JQuery 1.7 which works correctly till two days ago. Suddenly some of my buttons do not work anymore and, after clicking on them, I get this warning in the console:

Form submission canceled because the form is not connected

The code behind the click is something like this:

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

It seems that Chrome 56 doesn't support this kind of code anymore. Isn't it? If yes my question is:

  1. Why did this happened suddenly? Without any deprecation warning?
  2. What is the workaround for this code?
  3. Is there a way to force chrome (or other browsers) to work like before without changing any code?

P.S. It doesn't work in the latest firefox version either (without any message). Also it does not work in IE 11.0 & Edge! (both without any message)

Poltergeist answered 5/2, 2017 at 15:28 Comment(0)
W
212

Quick answer : append the form to the body.

document.body.appendChild(form);

Or, if you're using jQuery as above

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

Details : According to the HTML standards, if the form is not associated to the browsing context(document), the form submission will be aborted.

HTML SPEC see 4.10.21.3.2

In Chrome 56, this spec was applied.

Chrome code diff see @@ -347,9 +347,16 @@

P.S about your question #1. In my opinion, unlike ajax, form submission causes instant page move.
So, showing 'deprecated warning message' is almost impossible.
I also think it's unacceptable that this serious change is not included in the feature change list. Chrome 56 features - www.chromestatus.com/features#milestone%3D56

Whose answered 7/2, 2017 at 4:39 Comment(5)
Just had this bug reported by some users. Also, some other users didn't had the upgraded version, so they could submit the form without problems. Making the bug more inconsistent. Thanks for your answer!Jeannajeanne
The proposed solution didn't work for me in combination with the use of jQuery, as in the original question. This worked instead: $(document.body).append(form);Cotinga
@Cotinga I just edited the accepted answer, since the form variable is a jQuery object, not the actual DOM form element. As it was using form[0], it would produce an error "Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'." in Chrome. Thus, just change to document.body.appendChild(form[0]).Jarredjarrell
@ryanm, I am just an editor as I contributed the following line $(document.body).append(form);. You're welcome add your solution to the accepted answer by editing it or asking @KyungHun Jeon if he want's to adopt your solution instead of his.Cotinga
@Cotinga thanks! I figured since the question was in jQuery, the answer should be too (can be confusing), but my edit looks like it was rejected. Just a note then for other passers by that it can be document.body.appendChild(form[0]) (slightly faster) OR $(document.body).append(form).Jarredjarrell
C
129

if you are seeing this error in React JS when you try to submit the form by pressing enter, make sure all your buttons in the form that do not submit the form have a type="button".

If you have only one button with type="submit" pressing Enter will submit the form as expected.

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

Coyote answered 16/12, 2017 at 18:0 Comment(7)
also a thing to look out for in React, the <form> still has to render in the DOM after it's clicked. i.e, this will fail ` { this.state.submitting ? <div>Form is being submitted</div> : <form onSubmit={()=>this.setState({submitting: true}) ...> <button ...> </form> } ` So when the form is submitted, state.submitting gets set and the "submitting..." message renders instead of the form, then this error happens. Moving the form tag outside the conditional ensured that it was always there when needed.Shook
Nice to know. I guess you don't have to change the whole form element to a div. I believe that if you just change the contents of the form instead of replacing the element it it will work as expected.Coyote
So, like Max Williams said, it's a race condition - the browser is checking if the form is there, but the form is already gone.Rabies
preventDefault() causes this alert from ChromeOphicleide
First link is broken: web.archive.org/web/20170410070341/http://dzello.com/blog/2017/…Yurikoyursa
Thanks a lot! I have been trying to load a new page after axios.post request and clicking the button would just refresh the page before the requests could happen!Sherrill
I know this fact and I still miss it from time to time. Thanks!Lodgment
G
31

add attribute type="button" to the button on who's click you see the error, it worked for me.

Gahnite answered 25/1, 2019 at 12:4 Comment(0)
G
23

alternatively include event.preventDefault(); in your handleSubmit(event) {

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

Gabi answered 13/6, 2017 at 14:29 Comment(2)
Links to external resources are encouraged, but please add context around the link so your fellow users will have some idea what it is and why it’s there. Always quote the most relevant part of an important link, in case the target site is unreachable or goes permanently offline. See how to write a good answerKorman
Using àntd forms. This helped.Nusku
A
15

I have found this problem in my React project.

The problem was,

  • I have set the button type 'submit'
  • I have set an onClick handler on the button

So, while clicking on the button, the onclick function is firing and the form is NOT submitting, and the console is printing -

Form submission canceled because the form is not connected

The simple fix is:

  • Use onSubmit handler on the form
  • Remove the onClick handler form the button itself, keep the type 'Submit'
Arrow answered 29/1, 2021 at 2:10 Comment(0)
M
11

You must ensure that the form is in the document. You can append the form to the body.

Milan answered 6/2, 2017 at 3:20 Comment(2)
I had this and it turned out there was an onclick added to the remote form submit button, which removed the form's containing element. So there was basically a race condition between the form being submitted and the form being removed.Odel
Thanks @Max Williams, your comment put me back on track more than the accepted answer.Aegrotat
O
9

I see you are using jQuery for the form initialization.

When I try @KyungHun Jeon's answer, it doesn't work for me that use jQuery too.

So, I tried appending the form to the body by using the jQuery way:

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

And it worked!

Oregon answered 10/2, 2017 at 2:40 Comment(1)
if you couldn't find the form try this $(document.body).append($('form'));Civic
T
7
<button type="button">my button</button>

we have to add attribute above in our button element

Touzle answered 1/9, 2020 at 7:3 Comment(0)
S
6

A thing to look out for if you see this in React, is that the <form> still has to render in the DOM while it's submitting. i.e, this will fail

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

So when the form is submitted, state.submitting gets set and the "submitting..." message renders instead of the form, then this error happens.

Moving the form tag outside the conditional ensured that it was always there when needed, i.e.

<form onSubmit={...} ...>
  { this.state.submitting ? 
     <div>Form is being submitted</div> :
     <button ...>
  }
</form>
Shook answered 18/10, 2018 at 16:26 Comment(1)
Race conditions!Rabies
A
2

I faced the same issue in one of our implementation.

we were using jquery.forms.js. which is a forms plugin and available here. http://malsup.com/jquery/form/

we used the same answer provided above and pasted

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

and it worked.Thanks.

Amelioration answered 17/3, 2017 at 7:56 Comment(0)
R
2

I was able to get rid of the message by using adding the attribute type="button" to the button element in vue.

Ramification answered 23/6, 2020 at 9:42 Comment(0)
K
2

An example of Mike Ruhlin's answer, I was redirecting with react-router-dom Redirect on form submission.

Placing e.preventDefault() into my submit function removed the warning for me

const Form = () => {

    const [submitted, setSubmitted] = useState(false);
    const submit = e => {
      e.preventDefault();
      setSubmitted(true);
    }

    if (submitted) {
        return <Redirect push to={links.redirectUrl} />
    };

    return (
          <form onSubmit={e => submit(e)}>
          ...
          </form>

    );
};

export default Form;
Kenishakenison answered 16/6, 2021 at 19:53 Comment(0)
A
1

Depending on the answer from KyungHun Jeon, but the appendChild expect a dom node, so add a index to jquery object to return the node: document.body.appendChild(form[0])

Apportion answered 9/2, 2017 at 12:35 Comment(1)
You mean document.body.appendChild(form[0]) ?Macready
H
1

Adding for posterity since this isn't chrome related but this was the first thread that showed up on google when searching for this form submission error.

In our case we attached a function to replace the current div html with a "loading" animation on submission - since it occurred before the form was submitted there was no longer any form or data to submit.

Very obvious error in retrospect but in case anyone ends up here it might save them some time in the future.

Hearten answered 5/1, 2019 at 15:47 Comment(0)
L
1

I have received this error in react.js. If you have a button in the form that you want to act like a button and not submit the form, you must give it type="button". Otherwise it tries to submit the form. I believe vaskort answered this with some documentation you can check out.

Litter answered 4/10, 2019 at 20:48 Comment(2)
It's a warning: Form submission canceled because the form is not connected. Sorry for forgetting to add that.Litter
I can confirm this. I got the same warning in React, Form submission canceled because the form is not connected whenever I pressed my form's "Cancel" button. After adding type="button" to my "Cancel" button, I no longer receive the warning. Thanks!Whortleberry
U
1

if using react and something like formik, the issue seems to be in the onClick handlers in the submit button

Us answered 14/6, 2022 at 12:59 Comment(0)
P
0

You can also solve it, by applying a single patch in the jquery-x.x.x.js just add after " try { rp; } catch (m) {}" line 1833 this code:

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

This validates when a form is not part of the body and adds it.

Piscatory answered 7/2, 2018 at 18:6 Comment(0)
I
0

I noticed that I was getting this error, because my HTML code did not have <body> tag.

Without a <body>, when document.body.appendChild(form); statement did not have a body object to append.

Interlunar answered 23/7, 2020 at 16:2 Comment(0)
W
0

The <form> must be there existing in the DOM in first load, not 'display: none' or conditionally available only in the DOM. If the form (like a modal window) the logic must be 'visibility: hidden' instead of 'display: none' on your CSS, or else when that form send a 'POST' or 'GET', etc.. that error will appear. In my personal experience. I'm using Svelte.

Worthless answered 12/5, 2023 at 14:57 Comment(0)
L
0

In case this helps anyone else: in my case (ReactJS with C# MVC backend), the issue ended up being a missing anti-forgery token. The server built a new viewmodel and redirected to the same page but with no anti-forgery token. Once it was added, the issue was solved.

Lasagne answered 4/1 at 20:33 Comment(0)
O
-1

I saw this message using angular, so i just took method="post" and action="" out, and the warning was gone.

Outrigger answered 3/3, 2017 at 1:55 Comment(0)
D
-1
  1. Your button has to be in the context of Form tag
  2. button type="submit"
  3. I was also facing the same issue , I removed onClick={onSubmit} form the button tag (I used Formik here)
Delladelle answered 28/10, 2022 at 7:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.