180 votes

Obtenir une erreur "L'envoi du formulaire a été annulé car le formulaire n'est pas connecté"

J'ai un ancien site web avec JQuery 1.7 qui fonctionnait correctement jusqu'à il y a deux jours. Soudainement, certains de mes boutons ne fonctionnent plus et, après avoir cliqué dessus, j'obtiens cet avertissement dans la console :

La soumission du formulaire a été annulée car le formulaire n'est pas connecté

Le code derrière le clic ressemble à ceci :

 this.handleExcelExporter = function(href, cols) {
   var form = $('').attr('action', href);
   $('input[name="layout"]', form).val(JSON.stringify(cols));
   $('input[type="submit"]', form).click();
 }

Il semble que Chrome 56 ne prend plus en charge ce type de code. N'est-ce pas ? Si oui, ma question est la suivante :

  1. Pourquoi cela s'est-il produit soudainement ? 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 modifier le code ?

P.S. Cela ne fonctionne pas non plus dans la dernière version de Firefox (sans aucun message). Cela ne fonctionne pas non plus dans IE 11.0 & Edge ! (tous deux sans aucun message)

0 votes

J'ai ajouté une correction dans la réponse acceptée pour correspondre au fait que le formulaire est un objet jQuery. Notez que cela affecte également le gestionnaire jQuery .submit() (en plus de la méthode .click() ci-dessus indiquée).

200voto

KyungHun Jeon Points 1592

Réponse rapide : ajoutez le formulaire au body.

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), l'envoi du formulaire sera interrompu.

SPEC HTML voir 4.10.21.3.2

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

Différence de code Chrome voir @@ -347,9 +347,16 @@

P.S à propos de votre question #1. À mon avis, contrairement à ajax, l'envoi du formulaire entraîne un déplacement instantané de la page.
Ainsi, afficher un 'message d'avertissement obsolète' est presque impossible.
Je pense aussi qu'il est inacceptable que ce changement majeur ne soit pas inclus dans la liste des changements de fonctionnalités. Fonctionnalités Chrome 56 - www.chromestatus.com/features#milestone%3D56

4 votes

Vient d'être signalé ce bogue par certains utilisateurs. De plus, certains autres utilisateurs n'avaient pas la version mise à jour, donc ils ont pu soumettre le formulaire sans problèmes. Rendre le bogue plus inconsistant. Merci pour votre réponse!

0 votes

La solution proposée n'a pas fonctionné pour moi en combinaison avec l'utilisation de jQuery, comme dans la question originale. Cela a fonctionné à la place : $(document.body).append(form);

1 votes

@Chris je viens de modifier la réponse acceptée, car la variable form est un objet jQuery, et non l'élément de formulaire DOM réel. Comme elle utilisait form[0], cela produirait une erreur "Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'." dans Chrome. Ainsi, il suffit de changer en document.body.appendChild(form[0]).

87voto

vaskort Points 1000

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

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

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

8 votes

Aussi une chose à surveiller dans React, le

doit toujours être rendu dans le DOM après avoir été cliqué. c'est-à-dire, cela échouera `{ this.state.submitting ?

Le formulaire est en cours de soumission

this.setState({submitting: true}) ...> }` Donc lorsque le formulaire est soumis, state.submitting est défini et le message "en cours de soumission..." s'affiche au lieu du formulaire, puis cette erreur se produit. Placer la balise du formulaire en dehors de la condition a permis de s'assurer qu'elle était toujours présente lorsqu'elle était nécessaire.

0 votes

Agréable à savoir. Je suppose que vous n'avez pas à changer l'ensemble de l'élément form en un div. Je crois que si vous changez simplement le contenu du form au lieu de remplacer l'élément, cela fonctionnera comme prévu.

0 votes

Donc, comme l'a dit Max Williams, c'est une condition de course - le navigateur vérifie si le formulaire est là, mais le formulaire est déjà parti.

18voto

joncode Points 81

Inclure alternativement event.preventDefault();dans votre handleSubmit(event) {

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

2 votes

Les liens vers des ressources externes sont encouragés, mais veuillez ajouter du contexte autour du lien pour que vos collègues utilisateurs aient une idée de ce qu'il contient et pourquoi il est là. Citez toujours la partie la plus pertinente d'un lien important, au cas où le site cible deviendrait inaccessible ou disparaîtrait définitivement. Consultez comment rédiger une bonne réponse

0 votes

En utilisant les formulaires àntd. Cela a aidé.

11voto

Liu Tao Points 111

Vous devez vous assurer que le formulaire se trouve dans le document. Vous pouvez ajouter le formulaire au corps du document.

7 votes

J'avais cela et il s'est avéré qu'un onclick avait été ajouté au bouton de soumission du formulaire distant, ce qui a supprimé l'élément contenant le formulaire. Il y avait donc essentiellement une condition de course entre la soumission du formulaire et sa suppression.

4 votes

Merci @Max Williams, votre commentaire m'a remis sur la bonne voie plus que la réponse acceptée.

9voto

Rizki Pratama Points 340

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

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

Donc, j'ai essayé d'ajouter le formulaire au corps en utilisant la méthode jQuery:

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

Et ça a marché!

0 votes

Si vous n'avez pas trouvé le formulaire, essayez ceci $(document.body).append($('form'));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X