Je cherche à effectuer un poste de formulaire de base, mais ce qui suit soumet au serveur deux fois à Chrome et Safari (mais se comporte comme prévu dans Firefox):
<script type="text/javascript"> $(document).ready(function() { $("#create-deck-form").submit(function(event){ if($("#deck-name-field").val() == "") { event.preventDefault(); alert("deck name required"); } }); }); </script>
4 Réponses :
pouvez-vous essayer renvoyer false; code> après votre alerte et supprimer
événement.preventDefault (); code>. Peut-être que vous avez également besoin
retour vrai; code> dans votre clause d'autre. Je crois que j'ai cela travaillant quelque part. P>
Merci, koen. Lorsque la validation échoue, le comportement est tout bon (et oui, soit Event.PreventDefault (); ou retourne faux; Effectuer comme prévu). Partout où la validation passe le formulaire est soumise deux fois. C'est le cas où le comportement par défaut est explicitement appelé (à l'aide d'une clause d'autre pour retourner vrai) ou appelé implicitement en n'empêchant pas la valeur par défaut / retourner Faux (comme dans les extraits de code ci-dessus).
Avez-vous essayé d'utiliser une méthode non anonyme (définissez-la avec un nom) et l'utiliser comme attribut, par exemple:
Bien sûr, @koen, merci. N'était-ce pas la soumission de formulaire qui cause le problème, à partir duquel les frissons pouvaient être démarrés.
Je ne suis pas sûr à 100%, mais essayez celui-ci s'il vous plaît:
$("#create-deck-form").attr('onsubmit')
YEP à peu près sûr que vous devez retourner faux pour arrêter l'événement par défaut du navigateur.
Merci Andy et Tom. Je pense avoir peut-être confondu la question en mentionnant la validation. Où la validation échoue, je vais bien (Event.PreventDefault équivaut à renvoyer false et toutes les deux bien) C'est lorsque le formulaire ne soumet aucun problème de validation que j'ai des problèmes. Ainsi, comme je l'affiche ci-dessus dans la première extrait de code, la soumission de formulaire de base sans validation ni implication JS soumet au serveur deux fois. Super idée de la vérification de tous les gestionnaires de voyous associés au formulaire, Andy, je vais essayer.
@meg: pas exactement, retourner false code> à partir d'un gestionnaire d'événements déclenche les deux,
préventiveDefault code> plus
stoppropagation code>.
@Andy, je peux confirmer qu'il n'y a pas de gestionnaires inattendus liés à la forme. @jandy, je vois! Merci beaucoup. Je ne sais pas comment cela aide avec mon problème actuel. Dans mon cas, je reçois le comportement imprévu lorsque la validation passe et donc aucun code empêchant le comportement par défaut, ni le retour de faux n'est touché.
OK, je ne sais pas combien cela aidera, mais essayez de supprimer l'entrée de soumission et de soumettre le formulaire via JavaScript. Donc, par exemple au lieu d'écouter l'ONSUBMIT, vous pouvez essayer p> maintenant que vous devez travailler aussi. . Mais de cette façon, vous pouvez déboguer là où vous êtes problématique est ... Cela ne devrait soumettre qu'une fois ... bonne chance! p> p>
Merci Javadrinker, j'ai effectivement tenté cette approche en vain. J'ai creusé et ça peut être quelque chose de beaucoup plus profondément dans mon application. J'espère résoudre aujourd'hui et poster la résolution.
Ceci peut-être une question muette mais: comment déterminez-vous que votre formulaire est soumis deux fois? Je veux dire, quel est le résultat de cette "double soumission"?
Je peux voir dans ma console imprimer qu'il existe deux demandes au serveur et il y a un deuxième pont visible dans le magasin de données. Il ne s'agit pas de la soumission de formulaire, mais c'est là que le comportement pourrait être lancé - Herring rouge!
Je semble avoir le même problème, avez-vous le code (ou une description globale) de votre solution, comment avez-vous redirigé le get après le poste?
Y a-t-il autre chose impliqué? Y a-t-il des "manipulateurs" Cliquez sur "qui invoquent explicitement" Soumettre () "sur le formulaire, par exemple?
Merci, pointu. Non, ce sont des os parfaitement nus pour le moment, sans autre gestionnaires liés à la forme ou à ses boutons.
Avez-vous un exemple de page ou postez-vous le contenu de votre page quelque part (tous les HTML et JS), afin que nous puissions avoir un look?
Ok, bien hmm. Ok maintenant ma prochaine question est la suivante: qu'est-ce qui vous a convaincu que le formulaire a été soumis deux fois? (Je n'essaie pas de refuser ce que vous voyez, mais la chose est que le code est tout ce qui semble plus ou moins ok pour moi, alors j'essaie simplement d'obtenir plus de la photo complète.)
Plus je pense à cela, le plus étrange semble. Je ne sais pas comment je ferais un formulaire d'afficher deux fois si je voulait i> cela se produira (bien sans câbler le formulaire à un mécanisme de soumission AJAX).
@Marcel Le site en direct est www.brainos.com. Vous auriez besoin de vous connecter (avec OpenID) pour créer un nouveau jeu de cartes mémoire. Le formulaire figure sur votre page de profil, bien que son code soit légèrement différent, car il utilise l'ANSUBMIT ATTR (je "je" me fixe "ce bogue dans chrome et safari aujourd'hui pour que le code en direct ne soit pas le même que mon devêtement de devient posté ici )
@Pointy Je connaisse que le formulaire est soumis deux fois parce que je peux voir que l'URL soit touchée deux fois dans ma console de développement et je peux également voir un pont fantôme est créé sur les applications Dev (et Live) lorsque le pont crée est effectué via Chrome / Safari. Mes formulaires Ajax courent assez doux, surtout que je passe à JQuery Form Plugin cette semaine, c'est juste cette forme particulière qui me tue.
Pourrait-il être que la touche Entrée doit être bloquée de la soumission?
@meg est-il possible que certains fichiers JavaScript que l'importation de la page puisse attacher quelque chose sur le formulaire ou sur les boutons, ou quoi que ce soit? Pourriez-vous (expérimentalement) essayer d'omettre certains des fichiers de script pour voir si cela fait une différence? Bien sûr, ce n'est pas clair pourquoi cela causerait un comportement différent entre Chrome et FF, mais c'est une question étrange de toute façon.
@fudgey merci! Je ne fais aucune gestion KeyPress JS / JQuery pour le moment sur ce formulaire et simplement à l'aide du comportement par défaut du navigateur pour le type d'entrée = 'Soumettre'. Je me demandais si soumettre des intrants est fondamentalement «bizarre» à Chrome / Safari, mais W3C dit que Soumettre les intrants sont soutenus dans ces navigateurs et que Googling autour de la question ne m'avait pas montré qu'il y avait des problèmes connus à cet égard. Ce qui me reçoit, c'est que le poteau le plus basique ne se comporte pas bien! Ce doit être quelque chose de si ridicule que je ne vois tout simplement pas.
@Pointy, ma JS est concaténée et minifiée mais j'ai confirmé qu'il n'y avait pas d'autres gestionnaires associés à la forme ou à aucun de ses éléments.
Eh bien, vous êtes apparemment dérivé dans la zone de crépuscule en quelque sorte. J'espère que vous avez trouvé une solution.
@Pointy! J'ai déchiré tous les JS concatérés et quelque chose, quelque part, fait quelque chose à ma forme, non injustifié! Je vous ferai savoir quand il va rouler. Je viens de savoir i> c'est quelque chose de profondément stupide;)
C'est une bonne nouvelle. N'y a-t-il pas une citation de Sherlock Holmes sur la façon dont la réponse à un mystère n'est jamais que quelque chose d'impossible est arrivé? :-)
Hmmm, OK Avez-vous essayé de désactiver le bouton d'envoi après la validation de la validation? (par exemple, Stackoverflow.com/Questtions/903550 / ... )
Merci pour ce lien @FUXYY, pourrait être utile, malheureusement, ce n'est pas un cas de multiples invocations de la saisie de soumission. @Pointy après une pause au gymnase et un coup de mont gay, j'ai trouvé la racine de tout mal. La page qui est chargée par le serveur après la soumission inclut un bouton qui ouvre un fibron. Lorsque l'initialisation de Facebox se produit surcharger ($ ("# megs-bouton-bouton"). Facebox ();) Un deuxième article de requête à l'URL pointant sur mon serveur de création de pont (je suis désolé si cela manque de contexte et de ne pas t sens). Supprimez tous les JS et a travaillé à l'envers ici - Merci pour votre aide!