Warum ein Formular-Tag verwenden, wenn Sie über Ajax senden?

78

Philosophische Frage:

Angenommen, ich habe eine Web-App, für die Javascript und ein moderner Browser erforderlich sind , sodass eine progressive Verbesserung kein Problem darstellt. Wenn mein Formular über Javascript erstellt wird und meine Datenaktualisierungen alle über Ajax-POSTs und -PUTs erfolgen, gibt es dann wirklich einen Grund, meine Steuerelemente in ein Formular-Tag zu verpacken? Wenn ich das Tag weiterhin verwenden werde, beispielsweise aus semantischen oder strukturellen Gründen, gibt es einen Grund für Aktions- und Methodenparameter, die ich ignorieren werde? Es fühlt sich für mich wie ein Überbleibsel aus einer früheren Ära an.

Sprugman
quelle
Ich denke nicht ... es gibt keinen Grund für sie, sie sind nützlich, aber sie für Steuerelemente zu haben, ist ziemlich dumm ... Sie können immer ein leeres gültiges Formular wie folgt einfügen: <form action = "#" method = "post "onsubmit =" return false; "> </ form>
Omer Tuchfeld
2
Sie können die Aktion auf eine Seite mit der Aufschrift "Diese Website erfordert Javascript und Ihr Browser führt das Javascript nicht aus. Lassen Sie sich verarschen."
3
Nicht in der Lage zu sein, zu identifizieren, welche Elemente zu einem bestimmten Formular gehören, könnte einen Einfluss auf die Barrierefreiheit / Bildschirmlese-Software haben
Alex K.
Ich bin mir ziemlich sicher, dass Sie den Submit-Button mit disabled = "disabled" deaktivieren können
Brian Patterson

Antworten:

71

Es gibt mindestens eine wichtige Funktion für die Benutzererfahrung, die speziell durch das Umschließen von Eingaben in ein Formular-Tag bereitgestellt wird:

Die Eingabetaste sendet das Formular. In Mobile Safari wird auf diese Weise die Schaltfläche "Los" auf der Tastatur angezeigt .

Ohne ein Formular, das die Eingaben umschließt, gibt es nichts zu senden.

Sie können das Verhalten der Eingabetaste natürlich über ein Tastendruckereignis festlegen, aber ich weiß nicht, ob dies für mobile Geräte funktioniert. Ich weiß nichts über dich, aber ich würde lieber mit der vom Browser bereitgestellten Semantik arbeiten, als sie mit Ereignissen imitieren zu müssen.

In Ihrem Fall würden Sie einfach einen onsubmitEreignishandler für das Formular bereitstellen , der Ihre AJAX-Übermittlung durchführen und dann return falsedie eigentliche Übermittlung abbrechen würde.

Sie können einfach angeben action=""(was "Selbst" bedeutet) und methodist nicht erforderlich - standardmäßig GET.

Nicole
quelle
1
+1 - genau das habe ich mir gedacht, als ich die Frage gesehen habe.
Reid
1
@Brian - Auf dem Poster steht "Datenaktualisierungen werden über Ajax POSTS & PUTS durchgeführt". Das bedeutet ganz klar, dass Sie sich an mich wenden müssen, nur nicht die Art der Seitenaktualisierung. Nur weil Sie keine Seitenaktualisierung wünschen, heißt das nicht, dass Sie nicht die gleiche Benutzererfahrung wünschen.
Nicole
Wenn Sie jedoch der Ansicht sind, dass Spam-Bots möglicherweise auf Ihre Formulare zugreifen, können Sie möglicherweise keine Aktions- oder Methodenattribute hinzufügen. 70% von ihnen verwenden kein Javascript.
Abdalla Arbab
15

Wenn Sie keine progressive Verbesserung benötigen, benötigen Sie diese theoretisch nicht.

Auf der anderen Seite haben forms einige coole Gruppierungs- und semantische Effekte. Mit ihnen können Sie Ihre Formularelemente logisch gruppieren und Ihren Skripten das Sammeln der Werte bestimmter Elemente erleichtern.

Wenn Sie beispielsweise eine Benutzereingabe per Ajax senden möchten, ist es immer einfacher zu sagen: "Nehmen wir alle Elemente in diesem Formular und senden Sie sie", als zu sagen: "Nehmen wir diese Eingabe, diese beiden Auswahlen und diese drei Textbereiche und senden Sie sie." ". Nach meiner Erfahrung hilft es dem Entwickler tatsächlich, wenn formTags vorhanden sind.

Kapa
quelle
Richtig, aber unter bestimmten Umständen benötigen Sie nicht den zusätzlichen Vorteil, ein Formular vor dem Senden auf dem Client zu serialisieren und dann auf dem Server zu de-serialisieren. Manchmal müssen Sie nur einige Werte angeben, für die es auf dem Server kein entsprechendes Modell gibt. In diesen Fällen entscheide ich mich, kein Formular zu verwenden.
Matthew Pitts
Möglicherweise haben Sie überlappende Werte in Ihrem Formular. Ein Formular kann mehrere Felder mit dem Titel "Optionen" enthalten, wobei der Wert jeder Option eine automatisch inkrementierte ID ist. Ohne Einstellung <form>als Wrapper, können Sie alle über sich selbst zurücktritt , wenn sie versuchen bestimmte Werte aus der Form der Eingabemöglichkeiten zu bekommen , da es leicht Werte von sein kann 1, 2, 3etc.
pspahn
12

AJAX ist großartig, aber wie JamWaffles (+1 für ihn) sagte, formbietet die Verwendung von Tags eine Fallback-Methode.

Persönlich verwende ich Formular-Tags, auch für Dinge, die ich mit AJAX einreiche, da dies syntaktisch klar ist und es einfach macht, alle Eingaben in einem bestimmten Formular abzurufen. Ja, Sie könnten dies auch mit einem divoder was auch immer tun, aber wie gesagt, die Verwendung eines Formulars ist syntaktisch sinnvoll.

Im Übrigen behandeln Screenreader den Inhalt in einem formanderen Bereich unterschiedlich, sodass Zugänglichkeitsprobleme berücksichtigt werden müssen, je nachdem, welchen Weg Sie wählen. Beachten Sie, dass anekdotische Beweise darauf hindeuten, dass Google die Barrierefreiheit in seinen Rankings berücksichtigt. Wenn SEO für Sie ein Problem darstellt, verwenden Sie ein Formular und machen Sie es richtig.

Endophage
quelle
Dies ist die bisher beste Antwort. NICHT derjenige, der zum Zeitpunkt dieses Kommentars derzeit ganz oben auf der Liste steht.
Brian Patterson
7

Zusammenfassung: Formulare OK für MVC, einfache Webanwendungen, schlecht für komponentenorientierte, umfangreiche Webanwendungen.

Grund: Formulare können keine anderen Formulare verschachteln: große Einschränkung für eine komponentenorientierte Architektur.

Details: Für typische MVC-Anwendungen sind Formulare großartig. In umfangreichen, komplexen Webanwendungen, die viel Javascript und AJAX verwenden und hier und da viele Komponenten enthalten, mag ich keine Formulare. Grund: Formulare können keine anderen Formulare verschachteln. Wenn dann jede Komponente ein Formular rendert, können sich die Komponenten nicht gegenseitig verschachteln. Schade. Indem ich alle Formulare in divs ändere, kann ich sie verschachteln, und wann immer ich alle Parameter abrufen möchte, um sie an ajax zu übergeben, mache ich einfach (mit jQuery):

$ ("# id_of_my_div"). find ("[name]"). serialize ();

(oder eine andere Filterung)

anstatt:

$ ("# id_of_my_form"). serialize ();

Aus sentimentalen und semantischen Gründen benenne ich meine Divs immer wieder etwas_form, wenn sie als Formen fungieren.

Alex Jurado - Bitendian
quelle
Ja, Formen, die nicht verschachtelt werden können, sind in einigen Kontexten eine enorme Einschränkung. Ich verwende fast immer ein Formular-Tag, aber meiner Meinung nach sollten Sie auf jeden Fall in Betracht ziehen, es nicht zu verwenden, wenn es Ihnen aus irgendeinem Grund das Leben schwer machen wird.
Joel M
2

Nicht dass ich sehen könnte. Ich erstelle derzeit eine Webanwendung, die <form>s verwendet, aber ich verwende sie, sodass ich eine Fallback-Methode habe, wenn der Benutzer JavaScript deaktiviert hat (und das e.preventDefaultSenden des Formulars normal stoppt). Für Ihre Situation, in der Sie sagen, dass der Benutzer JavaScript haben MUSS, ist ein <form>Tag nicht erforderlich, aber es könnte eine Idee sein, es trotzdem beizubehalten, falls der Browser etwas damit tun muss, oder als eine Art darauf zuzugreifen Klasse.

Kurz gesagt, nein, Sie müssen es nicht verwenden, <form>wenn Sie reines AJAX ausführen, obwohl es möglicherweise eine Idee ist, es zu belassen, wenn Sie sich plötzlich entscheiden, in Zukunft Fallback-Code zu erstellen.

Bojangles
quelle
Ich bin mir ziemlich sicher, dass Sie den Submit-Button mit disabled = "disabled" deaktivieren können
Brian Patterson
2

Meiner Meinung nach: Wenn Sie es aus semantischen Gründen verwenden, verwenden Sie es wie vorgesehen. Das Aktionsattribut muss wohlgeformt sein (kann auch leer gelassen werden). Sie können auch Ihre URIs von Ihrer js-Logik trennen, indem Sie das Aktionsattribut festlegen und es vor dem Ajax-Aufruf lesen.

aorcsik
quelle
0

Ich verstehe nicht, warum Sie hier das Formular-Tag verwenden müssten. Der einzige Grund für die Verwendung eines Formular-Tags (außer um Ihr Markup zur Validierung zu bringen) besteht darin, dass der Benutzer die Daten mithilfe einer Sumbit-Eingabe oder eines Schaltflächen-Tags "übermittelt". Wenn Sie dies nicht tun müssen, ist das Formular nicht erforderlich. Ich bin mir jedoch nicht sicher, ob es als "gültiges" Markup angesehen wird. Wenn Sie es verwenden, können Sie es einfach tun, <form action="">da Aktion das einzige erforderliche Attribut des Formular-Tags ist. Sie sprechen jedoch einen guten Punkt an: Die Zukunft von Webanwendungen wird wahrscheinlich nicht mehr das Formular und die traditionelle Übermittlungsmethode benötigen. Sehr interessant und macht mich glücklich. hehe :)

Brian Patterson
quelle