Comment surmontez-vous le formulaire HTML de nidification limitation?
Je sais que le XHTML ne prend pas en charge imbriquée balises de formulaire et j'ai déjà lu les autres réponses ici sur un Débordement de Pile à ce sujet, mais je n'ai toujours pas trouvé une solution élégante à ce problème.
Certains disent que vous n'en avez pas besoin et qu'ils ne peuvent pas penser à un scénario de ce qui serait nécessaire. Eh bien, personnellement, je ne peux pas penser à un scénario que je n'ai pas besoin.
Voyons un exemple très simple:
Vous faire un blog, application et vous disposez d'un formulaire avec quelques champs pour la création d'un nouveau poste et d'une barre d'outils avec des "actions" comme "Sauver", "Supprimer", "Annuler".
<form
action="/post/dispatch/too_bad_the_action_url_is_in_the_form_tag_even_though_conceptually_every_submit_button_inside_it_may_need_to_post_to_a_diffent_distinct_url"
method="post">
<input type="text" name="foo" /> <!-- several of those here -->
<div id="toolbar">
<input type="submit" name="save" value="Save" />
<input type="submit" name="delete" value="Delete" />
<a href="/home/index">Cancel</a>
</div>
</form>
Notre objectif est d'écrire la forme ne nécessite pas de JavaScript, juste un bon vieux formulaire HTML et boutons de soumission.
Depuis l'URL de l'action est définie dans la balise Form et non pas dans chaque bouton soumettre, notre seule option est de poster une URL générique et puis "si...alors...sinon" pour déterminer le nom du bouton qui a été soumis. Pas très élégant, mais notre seul choix, car nous ne voulons pas compter sur le JavaScript.
Le seul problème, c'est qu'en appuyant sur "Supprimer", soumettra TOUS les champs de formulaire sur le serveur, même si la seule chose nécessaire pour cette action est Caché entrée avec le post-id. Pas très grand-chose dans ce petit exemple, mais j'ai des formes avec des centaines (façon de parler) des champs et des onglets dans mon LOB applications (en raison des exigences) soumettre tout en un-aller et en tout cas cela semble très inefficace et des déchets. Si le formulaire de nidification a été pris en charge, je voudrais au moins être en mesure de terminer le "Supprimer" bouton "soumettre" à l'intérieur de sa propre forme avec seulement l'après-champ id.
Vous pouvez dire "mettre en œuvre le "Supprimer" comme un lien au lieu de l'envoyer". Ce serait faux à bien des niveaux, mais surtout à cause des effets Secondaires des actions comme le "Supprimer", ici, ne doit jamais être une requête GET.
Donc ma question (en particulier pour ceux qui disent qu'ils n'ont pas besoin de formulaire de nidification) est Ce que pouvez-VOUS faire? Est-il une solution élégante, je suis absent ou la ligne de fond est vraiment "Soit besoin de JavaScript ou de soumettre tout"?
- C'est drôle, mais le XHTML permet forme indirecte de nidification selon est intéressant de noter que anderwald.info/internet/nesting-form-tags-in-xhtml - (X)HTML interdit l'imbrication des formes comme "form" > formulaire", mais permet de formulaire "> fieldset > formulaire", validateur W3 dit que c'est valable, mais les navigateurs ont des bugs avec une telle imbrication.
- double possible de Est-il valable pour avoir un formulaire html à l'intérieur d'un autre formulaire html?
- linkrot correctif pour @Nishi commentaire lien: web.archive.org/web/20170420110433/http://anderwald.info/...
Vous devez vous connecter pour publier un commentaire.
Je voudrais mettre en œuvre la présente exactement comme vous l'avez décrit: soumettre le tout pour le serveur et faire un simple if/else pour vérifier quel bouton a été cliqué.
Et puis je voudrais mettre en œuvre un appel Javascript attachant dans la forme de l'événement onsubmit qui serait de vérifier que le formulaire a été soumis, et de soumettre uniquement les données pertinentes pour le serveur (éventuellement par l'intermédiaire d'un deuxième formulaire sur la page avec l'ID de l'nécessaires pour traiter la chose comme un caché d'entrée, ou à l'actualisation de l'emplacement de la page avec les données dont vous avez besoin passé comme une demande d'OBTENIR, ou de faire une requête Ajax post au serveur, ou...).
Cette façon, les gens sans Javascript sont en mesure d'utiliser la forme, mais la charge de serveur est compensée parce que les gens qui n'ont pas de Javascript ne sont que de soumettre le seul élément de données nécessaires. Vous concentré sur seulement soutenir l'un ou l'autre vraiment limite vos options inutilement.
Alternativement, si vous êtes derrière un pare-feu d'entreprise ou de quelque chose et tout le monde a Javascript désactivé, vous pouvez le faire de deux formes et de travailler un peu de CSS magie pour la faire ressembler le bouton supprimer est une partie de la première forme.
Je sais que c'est une vieille question, mais HTML5 offre un couple de nouvelles options.
La première consiste à séparer la forme de la barre d'outils dans le balisage, ajouter une autre forme pour l'action de suppression, et d'associer les boutons dans la barre d'outils avec leurs formes respectives à l'aide de la
form
attribut.Cette option est assez souple, mais le post original a également mentionné qu'il peut être nécessaire d'effectuer différentes actions avec un seul formulaire. HTML5 vient à la rescousse de nouveau. Vous pouvez utiliser le
formaction
attribut sur les boutons de soumission, de sorte que les différents boutons dans le même formulaire peut soumettre à des Url différentes. Cet exemple ajoute juste un clone de la méthode de la barre d'outils en dehors de la forme, mais il fonctionne de la même imbriquée dans la forme.http://www.whatwg.org/specs/web-apps/current-work/#attributes-for-form-submission
L'avantage de ces nouvelles fonctionnalités est qu'ils font tout cela de manière déclarative sans JavaScript. L'inconvénient est qu'ils ne sont pas pris en charge sur les anciens navigateurs, de sorte que vous avez à faire certains polyfills destinés à la prise pour les anciens navigateurs.
form=
est -- CanIUse ne dit pas vraiment. caniuse.com/#feat=forms<input>
de déclarer les boutons. le<button>
élément a été introduit il y a 15 ans à cette fin. Vraiment les gens.<input>
ou<button>
éléments n'est pas pertinent, même si les boutons sont généralement plus approprié pour les barres d'outils, comme vous le dites. Par la voie, bouton d'éléments n'ont pas été pris en charge par tous les navigateurs depuis 15 ans.pouvez-vous avoir les formes côte à côte sur la page, mais pas imbriquées. puis utiliser CSS pour faire toute la ligne des boutons assez?
HTML5 a une idée de "forme " propriétaire" - la "forme" de l'attribut pour les éléments d'entrée. Il permet d'émuler des formulaires imbriqués et permettra de résoudre le problème.
Genre de vieux sujet, mais celui-ci pourrait être utile pour quelqu'un:
Comme quelqu'un l'a mentionné ci - dessus, vous pouvez utiliser la forme mannequin.
J'ai eu à surmonter ce problème il y a quelques temps. Au début, j'ai totalement oublié ce code HTML de restriction et tout juste d'ajouter des formulaires imbriqués. Le résultat était intéressant - j'ai perdu mon premier formulaire de la imbriqués. Ensuite, il s'est avéré être une sorte de "truc" pour simplement ajouter une forme mannequin (qui sera supprimé à partir du navigateur) avant le démarrage effectif des formulaires imbriqués.
Dans mon cas, il ressemble à ceci:
Fonctionne très bien avec Chrome, FireFox et Safari. IE jusqu'à 9 (pas sûr sur 10) et de l'Opéra de ne pas détecter les paramètres dans le formulaire principal. L' $_REQUEST global est vide, indépendamment des entrées. Intérieure formes semble bien fonctionner partout.
N'ai pas testé une autre suggestion décrit ici - fieldset autour des formulaires imbriqués.
MODIFIER: jeu de cadres n'a pas fonctionné!
J'ai simplement ajouté formulaire Principal après les autres (pas plus des formulaires imbriqués) et utilisé jQuery "clone" pour dupliquer les entrées dans le formulaire sur le bouton cliquez sur. Ajouté .hide() pour chacun des cloné entrées pour garder la mise en page inchangé et maintenant il fonctionne comme un charme.
Je pense que Jason est le droit. Si votre "Supprimer" l'action est un minimum, faire que d'être dans une forme par lui-même, et l'aligner avec les autres boutons afin de rendre l'apparence de l'interface comme une forme unifiée, même si elle ne l'est pas.
Ou, bien sûr, la refonte de votre interface, et de laisser les gens supprimer en un tout autre lieu qui ne les oblige pas à voir la enormo-forme à tous.
Un moyen je voudrais faire cela sans javascript serait d'ajouter un ensemble de boutons radio qui définissent les mesures à prendre:
Alors l'action script d'effectuer des actions différentes en fonction de la valeur du jeu de bouton radio.
Une autre solution serait de mettre deux formes sur la page comme vous l'avez suggéré, tout simplement pas imbriquées. La mise en page peut être difficile de contrôler si:
À l'aide de l'caché champ "tâche" dans le traitement du script de la direction générale de manière appropriée.
Cette discussion est toujours d'intérêt pour moi. Derrière le post original sont des "exigences" qui l'OP semble partager - c'est à dire une forme avec rétro-compatibilité. Comme quelqu'un dont le travail au moment de l'écriture doit parfois revenir à IE6 (et pour les années à venir), je creuse ça.
Sans pousser le cadre de toutes les organisations vont vouloir se rassurer sur la compatibilité et la robustesse, et je ne suis pas en utilisant cette discussion comme justification pour le cadre), Drupal solutions à ce problème sont intéressants. Drupal est aussi directement, parce que le cadre a eu une longue période de politique de "il devrait fonctionner sans Javascript (si vous le souhaitez)" c'est à dire l'OP question.
Drupal utilise c'est plutôt vaste forme.inc fonctions pour trouver le triggering_element (oui, c'est le nom de code). Voir le bas de la code figurant sur l'API page pour form_builder (si vous souhaitez creuser dans les détails, la source est recommandé - drupal-x.xx/includes/forme.inc). Le générateur automatique de l'attribut HTML génération et, par là, pouvez sur le retour de détecter quel bouton a été pressé, et agir en conséquence (il peut être configuré pour exécuter des processus distincts trop).
Au-delà de la forme builder, Drupal divise les données 'supprimer' actions pour séparer les adresses url/formes, probablement pour les raisons évoquées dans le post original. Ce besoin d'une forme de recherche/référencement étape (gémissement une autre forme!, mais est user-friendly) à titre préliminaire. Mais cela a l'avantage de supprimer le "soumettre tout" de l'émission. La grande formulaire avec les données est utilisé pour son usage prévu, de la création de données/mise à jour (ou même une "fusion" de l'action).
En d'autres termes, une façon de travailler ronde, le problème est de décentraliser la forme en deux, puis le problème disparaît (et le HTML méthodes peuvent être corrigées par le biais d'un POST trop).
Utiliser un
iframe
pour le sous-formulaire. Si elles ont besoin de partager des champs, puis... ce n'est pas vraiment imbriqués.Ma solution est d'avoir les boutons d'appel JS fonctions de l'écriture, puis de soumettre des formulaires à l'extérieur de la principale forme
Si vraiment vous ne voulez pas utiliser de multiples formes (comme Jason sugests), puis utilisez les boutons et onclick gestionnaires.
Et ensuite en javascript (j'utilise jQuery ici pour easyness) (même si c'est assez exagéré pour l'ajout de certains onclick gestionnaires)
Aussi je sais, cela va rendre la moitié de la page, pas de travail sans javascript.
En réponse à une question posté par Yar dans un commentaire de sa propre réponse, je vous présente un peu de JavaScript qui permettra de redimensionner une iframe. Pour le cas d'un bouton de formulaire, il est sûr de supposer que l'iframe sera sur le même domaine. C'est le code que j'utilise. Vous devrez modifier la/les maths constantes pour votre propre site:
Puis l'appeler comme ceci:
Je suis juste venu avec une façon agréable de le faire avec jquery.
Bien, si vous soumettez un formulaire, le navigateur envoie une entrée de soumettre le nom et la valeur.
Donc, ce que vous pouvez faire est de
donc sur le côté serveur vous suffit de regarder pour le paramètre qui commence largeur de chaîne "d'action:" et le reste de la partie vous indique les mesures à prendre
ainsi, lorsque vous cliquez sur le bouton Enregistrer navigateur vous envoie quelque chose comme foo=tsa&action:save=enregistrer
J'ai fait le tour de la question en incluant une case à cocher selon la forme que la personne voulait faire.
Ensuite utilisée 1 bouton pour soumettre le formulaire.
Vous pouvez également affecter la forme actiob à la volée...peut-être pas la meilleure solution, mais vous ne soulager la logique côté serveur...