Si un formulaire est soumis mais pas par un bouton spécifique, tel que
- en appuyant Enter
- utilisation
HTMLFormElement.submit()
dans JS
comment un navigateur est-il censé déterminer lequel des multiples boutons d'envoi, le cas échéant, utiliser comme celui sur lequel vous appuyez?
Ceci est significatif à deux niveaux:
- appeler un
onclick
gestionnaire d'événements attaché à un bouton d'envoi - les données renvoyées au serveur web
Mes expériences jusqu'à présent ont montré que:
- en appuyant sur Enter, Firefox, Opera et Safari utilisent le premier bouton d'envoi du formulaire
- en appuyant sur Enter, IE utilise le premier bouton d'envoi ou aucun en fonction des conditions que je n'ai pas pu comprendre
- tous ces navigateurs n'en utilisent aucun pour une soumission JS
Que dit la norme?
Si cela peut aider, voici mon code de test (le PHP ne concerne que ma méthode de test, pas ma question elle-même)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
<h1>Get</h1>
<dl>
<?php foreach ($_GET as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<h1>Post</h1>
<dl>
<?php foreach ($_POST as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<form name="theForm" method="<?php echo isset($_GET['method']) ? $_GET['method'] : 'get'; ?>" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
<input type="text" name="method" />
<input type="submit" name="action" value="Button 1" onclick="alert('Button 1'); return true" />
<input type="text" name="stuff" />
<input type="submit" name="action" value="Button 2" onclick="alert('Button 2'); return true" />
<input type="button" value="submit" onclick="document.theForm.submit();" />
</form>
</body></html>
la source
HTML 4 ne le rend pas explicite. Le brouillon de travail HTML5 actuel spécifie que le premier bouton d'envoi doit être la valeur par défaut :
la source
Andrezj a à peu près tout compris ... mais voici une solution multi-navigateur simple.
Prenez une forme comme celle-ci:
et refactoriser ceci:
Étant donné que la spécification W3C indique que plusieurs boutons de soumission sont valides, mais omet des conseils sur la façon dont l'agent utilisateur doit les gérer, les fabricants de navigateurs sont laissés à implémenter comme ils l'entendent. J'ai constaté qu'ils soumettront le premier bouton d'envoi du formulaire ou soumettront le bouton d'envoi suivant après le champ du formulaire qui a actuellement le focus.
Malheureusement, il suffit d'ajouter un style de affichage: aucun; ne fonctionnera pas car la spécification W3C indique que tout élément caché doit être exclu des interactions utilisateur. Alors cachez-le à la place!
Ci-dessus, un exemple de la solution que j'ai fini par mettre en production. Si vous appuyez sur la touche Entrée, la soumission par défaut du formulaire se comporte comme prévu, même lorsque d'autres valeurs non par défaut sont présentes et précèdent le bouton de soumission par défaut dans le DOM. Bonus pour l'interaction souris / clavier avec des entrées utilisateur explicites tout en évitant les gestionnaires javascript.
Remarque: la tabulation dans le formulaire n'affichera le focus pour aucun élément visuel, mais entraînera toujours la sélection du bouton invisible. Pour éviter ce problème, définissez simplement les attributs tabindex en conséquence et omettez un attribut tabindex sur le bouton d'envoi invisible. Bien qu'il puisse sembler déplacé de promouvoir ces styles en! Important, ils devraient empêcher tout cadre ou style de bouton existant d'interférer avec ce correctif. En outre, ces styles en ligne sont définitivement de mauvaise forme, mais nous prouvons des concepts ici ... pas en écrivant du code de production.
la source
<div style="position: fixed; left: -1000px; top: -1000px />
. Encore une chose à se soucier: le simple fait de réduire ou d'éloigner le bouton du flux de page avec CSS peut entraîner des problèmes WAI, car les lecteurs d'écran verront toujours le bouton par défaut.<input/>
?Je pense que ce message aiderait si quelqu'un veut le faire avec jQuery:
http://greatwebguy.com/programming/dom/default-html-button-submit-on-enter-with-jquery/
La solution de base est:
et un autre que j'ai aimé était:
la source
.wich
attribut. Pas besoin non plus de se rabattre sur les DOM.keyCode
(ou.charCode
d'ailleurs).e.preventDefault();
au début de cette fonction pour éviter l'exécution du "vrai" bouton par défaut. Fonctionne très bien.J'avais un formulaire avec 11 boutons d'envoi et il utilisait toujours le premier bouton d'envoi lorsque l'utilisateur appuyait sur Entrée. J'ai lu ailleurs que ce n'est pas une bonne idée (mauvaise pratique) d'avoir plus d'un bouton d'envoi sur un formulaire, et la meilleure façon de le faire est d'avoir le bouton que vous voulez par défaut, comme seul bouton d'envoi sur le formulaire. Les autres boutons doivent être transformés en "TYPE = BUTTON" et un événement onClick ajouté qui appelle votre propre routine d'envoi en Javascript. Quelque chose comme ça :-
Ici, button3 est la valeur par défaut, et bien que vous soumettiez le formulaire par programme avec les autres boutons, la routine mjsubmit les valide. HTH.
la source
Cela peut maintenant être résolu en utilisant
flexbox
:HTML
CSS
Explaination
utilisant la boîte flex, nous pouvons inverser l'ordre des éléments dans un conteneur qui utilise le
display: flex
en utilisant également la règle CSS:flex-direction: row-reverse
. Cela ne nécessite ni CSS ni éléments cachés. Pour les navigateurs plus anciens qui ne prennent pas en charge Flexbox, ils obtiennent toujours une solution viable mais les éléments ne seront pas inversés.Démo
http://codepen.io/Godwin/pen/rLVKjm
la source
J'ai eu du mal avec la même question car j'avais un bouton de soumission au milieu de la redirection vers une autre page, comme ceci:
Lorsque l'utilisateur a appuyé sur la touche Entrée, ce bouton a été cliqué au lieu d'un autre bouton de soumission.
J'ai donc fait quelques tests primitifs en créant un à partir de plusieurs boutons d'envoi et différentes options de visibilité et un événement onclick alertant sur quel bouton on a cliqué: https://jsfiddle.net/aqfy51om/1/
Navigateurs et OS que j'ai utilisés pour les tests:
LES FENÊTRES
OSX
La plupart de ces navigateurs ont cliqué sur le tout premier bouton malgré les options de visibilité appliquées sauf IE et Safari qui ont cliqué sur le troisième bouton, qui est "visible" à l'intérieur du conteneur "caché":
Donc, ma suggestion, que je vais utiliser moi-même, est la suivante:
Si votre formulaire a plusieurs boutons d'envoi avec une signification différente, alors incluez le bouton d'envoi avec l'action par défaut au début du formulaire qui est soit:
style="width: 0; height: 0; overflow: hidden;"
EDIT Une autre option pourrait être de décaler le bouton (toujours au début de la)
style="position: absolute; left: -9999px; top: -9999px;"
, je l'ai juste essayé dans IE - travaillé, mais je n'ai aucune idée de quoi d'autre il peut bousiller, par exemple l'impression ..la source
De vos commentaires:
Je laisse tomber un
<input type="hidden" value="form_name" />
dans chaque formulaire.Si vous soumettez avec javascript: ajoutez des événements d'envoi aux formulaires, pas cliquez sur les événements à leurs boutons. Les utilisateurs de Saavy ne touchent pas souvent leur souris.
la source
Lorsque vous avez plusieurs boutons d'envoi dans un seul formulaire et qu'un utilisateur appuie sur la touche ENTRÉE pour soumettre le formulaire à partir d'un champ de texte, ce code remplace la fonctionnalité par défaut, en appelant l'événement d'envoi sur le formulaire à partir de l'événement de pression de touche. Voici ce code:
la source
Étrange que le premier bouton Enter passe toujours au premier bouton, qu'il soit visible ou non, par exemple en utilisant jquery
show/hide()
. L'ajout d'un attribut.attr('disabled', 'disabled')
empêche la réception complète du bouton Soumettre. C'est un problème par exemple lors du réglage de la visibilité du bouton Insérer / Modifier + Supprimer dans les boîtes de dialogue d'enregistrement. J'ai trouvé moins hackeux et simple en plaçant Edit devant Insertet utilisez le code javascript:
la source
ma recette:
Il enverra le champ caché par défaut si aucun des boutons n'est «cliqué».
s'ils sont cliqués, ils ont la préférence et sa valeur est transmise.
la source
Une autre solution que j'ai utilisée consiste à avoir un seul bouton dans le formulaire et à simuler les autres boutons.
Voici un exemple:
Je stylise ensuite les éléments span pour ressembler à un bouton. Un écouteur JS observe l'étendue et effectue l'opération souhaitée une fois cliqué.
Pas nécessairement adapté à toutes les situations, mais au moins c'est assez facile à faire.
la source
De la spécification HTML 4 :
Cela signifie qu'étant donné plus d'un bouton de soumission et aucun activé (cliqué), aucun ne devrait réussir.
Et je dirais que cela a du sens: imaginez un formulaire énorme avec plusieurs boutons de soumission. En haut, il y a un bouton "supprimer cet enregistrement", puis de nombreuses entrées suivent et en bas il y a un bouton "mettre à jour cet enregistrement". Un utilisateur qui appuie sur Entrée alors qu'il se trouve dans un champ au bas du formulaire ne soupçonnera jamais qu'il frappe implicitement le "supprimer cet enregistrement" en haut.
Par conséquent, je pense que ce n'est pas une bonne idée d'utiliser le premier bouton ou tout autre bouton que l'utilisateur ne définit pas (cliquez) sur un. Néanmoins, les navigateurs le font bien sûr.
la source
EDIT: Désolé, en écrivant cette réponse, je pensais à soumettre des boutons dans le sens général. La réponse ci-dessous ne concerne pas plusieurs
type="submit"
boutons, car elle n'en laisse qu'untype="submit"
et change l'autretype="button"
. Je laisse la réponse ici comme référence au cas où aide quelqu'un qui peut changer letype
dans sa forme:Pour déterminer le bouton sur lequel vous appuyez lorsque vous appuyez sur Entrée, vous pouvez le marquer avec
type="submit"
et les autres boutons les marquent avectype="button"
. Par exemple:la source