Obtenir une erreur " soumission de formulaire annulée car le formulaire n'est pas connecté"

J'ai un ancien site Web avec JQuery 1.7 qui fonctionne correctement jusqu'à il y a deux jours. Soudain, certains de mes boutons ne fonctionnent plus et, après avoir cliqué dessus, je reçois cet avertissement dans la console:

Envoi de formulaire annulé parce que le formulaire n'est pas connecté

Le code derrière le clic est quelque chose comme ceci:

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

Il semble que Chrome 56 ne supporte plus ce type de code. N'est-ce pas? Si oui ma question Est:

  1. pourquoi cela arrivé tout d'un coup? Sans aucun avertissement de dépréciation?
  2. Quelle est la solution de contournement pour ce code?
  3. Existe-t-il un moyen de forcer chrome (ou d'autres navigateurs) à fonctionner comme avant sans changer de code?

P. S. Cela ne fonctionne pas non plus dans la dernière version de firefox (sans aucun message). En outre, il ne fonctionne pas dans IE 11.0 et Edge! (les deux sans aucun message)

110
demandé sur tanguy_k 2017-02-05 18:28:44

9 réponses

Réponse rapide: ajoutez le formulaire au corps.

document.body.appendChild(form);

Ou, si vous utilisez jQuery comme ci-dessus: $(document.body).append(form);

Détails : Selon les normes HTML, si le formulaire n'est pas associé au contexte de navigation(document), la soumission du formulaire sera annulée.

Spécifications HTML voir 4.10.21.3.2

Dans Chrome 56, cette spécification a été appliquée.

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

P. S sur votre question # 1. À mon avis, contrairement à ajax, la soumission de formulaire provoque un déplacement de page instantané.
Donc, montrer 'message d'avertissement obsolète' est presque impossible.
Je pense aussi qu'il est inacceptable que ce changement sérieux ne soit pas inclus dans la liste des changements de fonctionnalités. Chrome 56 caractéristiques - www.chromestatus.com/features#milestone%3D56

146
répondu KyungHun Jeon 2017-06-21 08:48:49

Vous devez Vous assurer que le formulaire est dans le document. Vous pouvez ajouter le formulaire au corps.

10
répondu Liu Tao 2017-02-08 02:09:24

Je vois que vous utilisez jQuery pour l'initialisation du formulaire.

Quand j'essaie la réponse de @KyungHun Jeon, cela ne fonctionne pas pour moi qui utilise jQuery aussi.

Donc, j'ai essayé d'ajouter le formulaire au corps en utilisant la manière jQuery:

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

Et ça a marché!

8
répondu Rizki Pratama 2017-02-10 03:12:05

Si vous voyez cette erreur dans React JS lorsque vous essayez de soumettre le formulaire en appuyant sur Entrée, assurez-vous que tous vos boutons du formulaire qui ne le soumettent pas ont un type="button".

Si vous n'avez qu'un seul button avec type="submit" en appuyant sur Entrée, soumettez le formulaire comme prévu.

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

7
répondu vaskort 2018-01-26 14:45:08

Vous pouvez également inclure événement.preventDefault(); dans votre handleSubmit (événement) {

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

6
répondu joncode 2017-06-13 14:29:54

En fonction de la réponse de KyungHun Jeon, mais l'appendChild attend un nœud dom, alors ajoutez un index à l'objet jquery pour renvoyer le nœud: document.body.appendChild(form[0])

1
répondu moti irom 2017-02-12 09:13:03

J'ai fait face au même problème dans l'une de nos implémentations.

Nous utilisions jquery.forme.js. qui est un plugin de formulaires et disponible ici. http://malsup.com/jquery/form/

, Nous avons utilisé la même réponse fournie ci-dessus et collé

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

Et ça a marché.Grâce.

1
répondu Abhinav Chawla 2017-03-17 07:56:07

Vous pouvez également le résoudre, en appliquant un seul patch dans le jquery-x.x.x.js il suffit d'ajouter après " try { rp;} catch (m) {}" ligne 1833 ce code:

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

Ceci valide lorsqu'un formulaire ne fait pas partie du corps et l'ajoute.

0
répondu Gaytan 2018-02-07 18:06:23

J'ai vu ce message à l'aide angulaire, donc j'ai juste pris method="post" et action="", et l'avertissement avait disparu.

-1
répondu heavyrick 2017-03-03 01:55:44