¿Por qué usar una etiqueta de formulario cuando envía a través de ajax?

78

Pregunta filosófica:

Digamos que tengo una aplicación web que requiere javascript y un navegador moderno, por lo que la mejora progresiva no es un problema. Si mi formulario se está creando a través de javascript, y mis actualizaciones de datos se realizan a través de POST y PUT de ajax, ¿hay realmente alguna razón para envolver mis controles en una etiqueta de formulario? Si todavía voy a usar la etiqueta, digamos por razones semánticas o estructurales, ¿hay alguna razón para tener parámetros de acción y método que voy a ignorar? Para mí, se siente como un remanente de una época anterior.

sprugman
fuente
Supongo que no ... no hay razón para ellos, son útiles pero tenerlos para los controles es bastante estúpido ... Siempre puedes poner un formulario válido en blanco como este: <form action = "#" method = "post "onsubmit =" return false; "> </form>
Omer Tuchfeld
2
Puede hacer que la acción vaya a una página que diga "Este sitio requiere javascript y su navegador no está ejecutando el javascript. Que se joda".
3
No poder identificar qué elementos pertenecientes a una forma en particular podría tener algún impacto en la accesibilidad / software lector de pantalla
Alex K.
Estoy bastante seguro de que podría deshabilitar el botón de envío con disabled = "disabled"
Brian Patterson

Respuestas:

71

Hay al menos una característica importante de la experiencia del usuario proporcionada específicamente al envolver las entradas dentro de una etiqueta de formulario:

La tecla Intro enviará el formulario. De hecho, en Mobile Safari, así es como hace que aparezca el botón "Ir" en el teclado .

Sin un formulario que envuelva las entradas, no hay nada que enviar.

Por supuesto, puede proporcionar un comportamiento de tecla de entrada a través de un evento de pulsación de tecla, pero no sé si esto funciona para dispositivos móviles. No sé ustedes, pero prefiero trabajar con la semántica proporcionada por el navegador que tener que imitarlos con eventos.

En su caso, simplemente proporcionaría un onsubmitcontrolador de eventos para el formulario, que haría su envío AJAX y luego return falsecancelaría el envío real.

Simplemente puede proporcionar action=""(que significa "propio"), y methodno es obligatorio, por defecto es GET.

Nicole
fuente
1
+1: esto es exactamente lo que pensé cuando vi la pregunta.
Reid
1
@Brian: el cartel dice que "las actualizaciones de datos se están realizando a través de ajax POSTS & PUTS". Eso significa que con bastante claridad se someten a mí, simplemente no es el tipo de actualización de la página. El hecho de que no desee una actualización de la página no significa que no desee la misma experiencia de usuario.
Nicole
Pero si considera que los robots de spam pueden acceder a sus formularios ... entonces no puede agregar atributos de acción o método. El 70% de ellos no usa javascript.
Abdalla Arbab
15

Si no necesita mejoras progresivas, teóricamente no las necesita.

Por otro lado, los forms tienen algunos efectos semánticos y de agrupación interesantes . Utilizándolos, puede agrupar los elementos de su formulario de manera lógica y facilitar que sus scripts recopilen los valores de ciertos elementos.

Por ejemplo, si desea enviar alguna entrada de usuario ajax, siempre es más fácil decir: "tomemos todos los elementos en este formulario y envíelos" que decir "tomemos esta entrada, estas dos selecciones y estas tres áreas de texto y envíelos ". En mi experiencia, en realidad ayuda al desarrollador si formhay etiquetas.

kapa
fuente
Correcto, pero en ciertas circunstancias no necesita el beneficio adicional de serializar un formulario antes de enviarlo en el cliente, y luego poder deserializarlo en el servidor. A veces, solo necesita enviar un par de valores para los cuales no hay un modelo correspondiente en el servidor. En estos casos, opto por no utilizar un formulario.
Matthew Pitts
Es posible que tenga valores superpuestos en su formulario. Un formulario puede tener varios campos titulados "opciones" donde el valor de cada opción es un ID autoincrementado. Sin establecer <form>como un contenedor, que podría estar pisando todo a sí mismo cuando se trata de obtener valores específicos de opciones de entrada del formulario, ya que puede ser fácilmente valores de 1, 2, 3, etc.
pspahn
12

AJAX es genial, pero como dijo JamWaffles (+1 para él), el uso de formetiquetas proporciona un método alternativo.

Personalmente, utilizo etiquetas de formulario, incluso para las cosas que envío con AJAX porque es sintácticamente claro y facilita la captura de todas las entradas dentro de un formulario específico. Sí, también podría hacer esto con a divo lo que sea, pero como dije, usar un formulario es sintácticamente agradable.

Por cierto, los lectores de pantalla tratan el contenido en su interior de manera formdiferente, por lo que hay problemas de accesibilidad que se deben considerar de cualquier manera que elija. Tenga en cuenta que la evidencia anecdótica sugiere que Google considera la accesibilidad en sus clasificaciones, por lo que si el SEO es una preocupación para usted, use un formulario y hágalo bien.

Endófago
fuente
Esta es la mejor respuesta hasta ahora. NO el que está actualmente en la parte superior de la lista a partir de este comentario.
Brian Patterson
7

Resumen: formularios aceptables para MVC, aplicaciones web simples, malos para aplicaciones web ricas y orientadas a componentes.

Razón: las formas no pueden anidar otras formas: gran limitación para una arquitectura orientada a componentes.

Detalles: para las aplicaciones típicas de MVC, los formularios son excelentes. En aplicaciones web ricas y complejas que usan mucho javascript y AJAX y con muchos componentes aquí y allá, no me gustan los formularios. Razón: las formas no pueden anidar otras formas. Entonces, si cada componente representa un formulario, los componentes no se pueden anidar entre sí. Demasiado. Al cambiar todos los formularios a divs, puedo anidarlos, y siempre que quiera tomar todos los parámetros para pasarlos a ajax, simplemente lo hago (con jQuery):

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

(o algún otro filtrado)

en vez de:

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

Aunque, por razones sentimentales y semánticas, sigo nombrando a mis divs something_form cuando actúan como formas.

Alex Jurado - Bitendian
fuente
Sí, los formularios que no se pueden anidar es una limitación enorme en algunos contextos. Casi siempre uso una etiqueta de formulario, pero en mi opinión, definitivamente deberías considerar no usarla si te va a hacer la vida difícil por alguna razón.
Joel M
2

No es que yo pueda ver. Actualmente estoy construyendo una aplicación web que usa <form>s, pero los estoy usando, así que tengo un método alternativo si el usuario tiene JavaScript deshabilitado (y e.preventDefaultdetiene la publicación del formulario normalmente). Para su situación, donde está diciendo que el usuario DEBE tener JavaScript, una <form>etiqueta no es necesaria, pero podría ser una idea mantenerla de todos modos en caso de que el navegador necesite hacer algo con ella, o acceder a ella como una especie de clase.

En resumen, no, no necesita usarlo <form>si está haciendo AJAX puro, aunque dejarlo podría ser una idea si de repente decide crear un código de respaldo en el futuro.

Bojangles
fuente
Estoy bastante seguro de que podría deshabilitar el botón de envío con disabled = "disabled"
Brian Patterson
2

En mi opinión: si lo usa por razones semánticas, utilícelo según lo previsto. Se requiere que el atributo de acción (también se puede dejar vacío) esté bien formado, también puede separar sus URI-s de su lógica js, configurando el atributo de acción y leyéndolo antes de la llamada ajax.

aorcsik
fuente
0

No veo por qué necesitaría usar la etiqueta de formulario aquí. La única razón para usar una etiqueta de formulario (además de obtener su marcado para validar) es si va a hacer que el usuario "envíe" los datos usando una entrada sumbit o una etiqueta de botón. Si no necesita hacer eso, entonces no es necesario el formulario. Sin embargo, no estoy seguro de si se considerará un marcado "válido". Si lo usa, puede hacerlo, <form action="">ya que la acción es el único atributo requerido de la etiqueta del formulario. Sin embargo, plantea un buen punto, el futuro de las aplicaciones web probablemente ya no necesitará el formulario y la metodología de envío tradicional. Muy interesante y me hace feliz. jeje :)

Brian Patterson
fuente