jQuery Mobile Framework - Un tutorial de formularios

jQuery Mobile es un marco web móvil relativamente nuevo, con su primer lanzamiento realizado en octubre de 2010. El marco tiene muchas características interesantes para apoyar el desarrollo de aplicaciones móviles basadas en web. En este tutorial, nos centraremos en algunos elementos básicos de jQuery Mobile: estructura de página, formularios y envío de formularios Ajax. El tutorial se basa en la versión 1.0 alpha versión 2 del framework jQuery Mobile.

Como parte del tutorial escribiremos una pequeña aplicación B2C. Una compañía de envío de paquetes tiene un formulario en su sitio web para que los clientes ingresen información sobre paquetes que se pierden o dañan durante el envío. Al usar un dispositivo de mano (por ejemplo, un teléfono habilitado para la web), un cliente ingresa información al formulario sobre su reclamo: el número de envío del recibo original, el nombre / dirección y una descripción de la pérdida / daño. Cuando el cliente envía el formulario, el sitio web responde con un ID de reclamo para un seguimiento adicional. El escenario se muestra en el siguiente diagrama:

Figura 1. Tutorial diagrama de contexto de aplicación.

El marco jQuery Mobile es compatible con una variedad de navegadores que incluyen dispositivos iOS, dispositivos Android, Blackberry OS 6 y webOS (para una matriz de soporte, consulte http://jquerymobile.com/gbs/). La aplicación en este tutorial ha sido probada contra un dispositivo Android 2.2 y un dispositivo iOS 4.1.

Consideraciones de diseño

Antes de entrar en detalles técnicos, hablemos sobre las principales consideraciones que impulsan el diseño de la aplicación..

  • Tiempo de respuesta corto: es preferible que la aplicación web contenga una sola página html con una interfaz de usuario simple. Todas las construcciones de la interfaz de usuario, como el cuadro de diálogo de error y las páginas de confirmación, formarán parte de la página html. Una vez que la página se descarga en el navegador, se mostrarán diferentes secciones de la página al usuario, según el contexto en particular. No habrá necesidad de abrir varias conexiones de red para descargar páginas varias veces.
  • Manejo de errores: si el usuario se olvida de ingresar un campo obligatorio en el formulario, el envío debe fallar con un cuadro de diálogo de advertencia. Los campos que faltan deben ser fáciles de encontrar para el usuario.
  • Soporte para múltiples dispositivos / navegadores: las aplicaciones deben tener una apariencia y comportamiento consistentes en todos los dispositivos y navegadores compatibles.

Por supuesto, una aplicación típica de la vida real tendrá problemas de diseño adicionales o diferentes. A los fines de este tutorial, nuestro alcance se limitará a las consideraciones anteriores..

Introducción a jQuery Mobile

La mayor parte de la discusión en esta sección ha sido tomada de la documentación en http://jquerymobile.com. Ver la referencia original para más detalles..

jQuery Mobile es un sistema de interfaz de usuario basado en el popular marco de JavaScript jQuery. Consta de elementos de la interfaz de usuario y construcciones de programación que proporcionan una funcionalidad uniforme en una gran variedad de navegadores web para dispositivos móviles y de escritorio. Los principios de 'Mejora progresiva' y 'Degradación agraciada' están detrás de su diseño. La funcionalidad principal del marco es compatible con un amplio conjunto de plataformas, mientras que las plataformas más nuevas se benefician de características más mejoradas.

jQuery Mobile tiene una huella relativamente pequeña. Dado que la configuración básica de una página de jQuery Mobile se realiza únicamente mediante marcado, es posible lograr ciclos de desarrollo rápidos, especialmente si su aplicación no necesita funciones de programación complejas. Aunque está construido en jQuery core, el sistema de temática de jQuery Mobile se basa en un nuevo marco CSS que apunta a separar el color y la textura de los estilos estructurales que definen cosas como el relleno y las dimensiones. Una API de manejo de eventos maneja los métodos de entrada de usuario basados ​​en enfoque táctil, mouse y cursor de una manera unificada.

jQuery Mobile viene de serie con muchos elementos de la interfaz de usuario, como las barras de herramientas de encabezado y pie de página, botones con iconos, elementos de formulario (incluido el control deslizante sensible al tacto y los interruptores de palanca) y listas. También se proporcionan estilos HTML básicos, grillas de dos o tres columnas y elementos plegables.

Inclusión de bibliotecas móviles jQuery

A partir del lanzamiento de jQuery Mobile 1.0 alpha 2, las siguientes bibliotecas de hojas de estilo y JavaScript deben incluirse en sus páginas HTML. Puede consultarlos como se muestra abajo o servirlos desde su propio servidor:

   

Contenedor y Páginas de Contenido

Introduzcamos la estructura básica de una página en jQuery Mobile. Una página en el marco de jQuery Mobile puede ser una página única o una 'página' local vinculada interna dentro de una página. Una página de "contenedor" incluirá una o más páginas de "contenido". El límite de una página de contenedor se define de la siguiente manera:

 
...

Observe que el valor de la rol de datos atributo es página. Por otro lado, el límite de una página de contenido se define de la siguiente manera:

 
...

Observe que el valor de la rol de datos atributo es contenido.

Una página de contenido puede tener un encabezado y un pie de página asociados. Como ejemplo, una página de contenedor con varias páginas de contenido puede tener la siguiente estructura:

 
...
...
...
...
...
...
...

Cuando se carga una página de contenedor, todas las páginas de contenido en ella serán visibles. En nuestra aplicación, necesitamos mostrar solo un contenido a la vez. Por lo tanto, debemos controlar mediante programación qué contenido se mostrará según el contexto.

Ocultar / Mostrar páginas de contenido

Para ocultar un elemento, use la API de jQuery Mobile esconder() función:

 $ ('# hdrMain'). hide ();

ocultará el encabezado con carné de identidad hdrMain. Aquí, usamos el selector de ID de jQuery pasando carné de identidad del elemento que nos gustaría seleccionar precedido por # firmar. A la inversa, la espectáculo() La función muestra un elemento oculto:

 $ ('# hdrMain'). show ();

los esconder() y espectáculo() Las funciones se aplican a elementos de muchos tipos diferentes, en particular,

etiquetas y anclajes ( etiquetas). En este tutorial, utilizaremos esconder() y espectáculo() funciona ampliamente para mostrar solo el contexto relevante para el usuario de la aplicación. Se dan más detalles a continuación.


Paso 1: Estructura de la página de la aplicación de demostración

Nuestra aplicación de demostración consiste en una sola página html., index.html, que consiste en una página de contenedor como se muestra a continuación:

 
...
...
...
...
...
...
...
  • El contenido principal contiene el formulario que debe completar el usuario y tiene un encabezado y un pie de página..
  • El contenido del cuadro de diálogo solo se muestra si falta un campo de formulario requerido cuando se envía el formulario. Consiste en una advertencia y un botón Aceptar para cerrar el cuadro de diálogo. Observe que no tiene encabezado o pie de página..
  • El contenido de la transición se muestra después de enviar el formulario hasta que se recibe la respuesta del servidor. Consiste en una imagen "giratoria" con texto corto que informa al usuario de que se está enviando su formulario. El contenido de transición tampoco tiene encabezado o pie de página..
  • El contenido de confirmación se muestra y se recibe una respuesta del servidor. Muestra el número de confirmación al usuario. El contenido de confirmación tiene un encabezado y un pie de página.

Las transiciones de contenido se muestran en el diagrama a continuación:

Figura 2. Transiciones de contenido.

Observaciones adicionales sobre el código listado arriba:

  • los tema de datos El atributo nos permite elegir entre los estilos disponibles en el marco de jQuery Mobile:
    . El tema predeterminado tiene varias muestras de colores llamadas a B C D e, cada uno proporciona un conjunto consistente de colores para diferentes elementos en la página. Para nuestra aplicación elegimos el color correspondiente a segundo.
  • Los encabezados vienen con un botón atrás. No necesitábamos botones de retroceso y, por lo tanto, elegimos ocultarlos a través de data-nobackbtn = "true".
  • Es posible proporcionar un texto que se mostrará en el pie de página entre el
    etiquetas En nuestra aplicación omitimos texto en el pie de página. Como resultado, el usuario verá en el pie de página solo una barra delgada con el mismo color que el encabezado. Con el texto, el pie de página tendrá una altura similar a la del pie de página con el texto en él..

Elementos de formulario

Nuestro formulario de reclamaciones consta de los siguientes campos:

  • Varios entrada campos de texto de tipo: número de envío, nombre, apellido, correo electrónico, teléfono, dirección postal, ciudad y código postal. Todos los campos son obligatorios excepto el teléfono.
  • UNA seleccionar Elemento para el estado. Este es un campo obligatorio.
  • UNA textarea Elemento para que un usuario ingrese información sobre el envío perdido o dañado. Este es un campo obligatorio.

Como ejemplo, veamos el campo de texto para el Número de envío:

 

Usamos un etiqueta con un para atributo cuyo valor es el mismo que el carné de identidad del entrada elemento del etiqueta se adjunta a Además, envolvimos el etiqueta y entrada en un div con rol de datos atributo valorado como fieldcontain. El framework jQuery Mobile utilizará el fieldcontain Valor de atributo para un estilo especial. Además, mira name = "shipNo_r". Para esta aplicación en particular, decidimos definir el valor de la nombre atributo de cualquier elemento de formulario requerido para ser el valor de la carné de identidad atributo añadido por _r. Si el elemento no es requerido, el valor del nombre atributo será el mismo que el valor de la carné de identidad atributo. Por ejemplo, como Teléfono no es un campo obligatorio, se define de la siguiente manera:

 

Como veremos más adelante, esta convención especial de nombres nos ayudará a detectar los campos faltantes durante el envío del formulario.

Otro elemento de forma notable es el seleccionar elemento. Similar al anterior, el valor de la para atributo es el mismo que el id de la seleccionar elemento del etiqueta se adjunta a También el etiqueta y seleccionar están envueltos en un div con el rol de datos valor de atributo como el fieldcontain. Con la larga lista de opciones que tenemos en esta aplicación, jQuery Mobile framework abrirá la lista en una nueva página cuando el usuario se centre en el seleccionar elemento.

 

La página de formulario como se muestra en un teléfono Android 2.2 se muestra a continuación. El usuario se desplazará por la página para acceder a los elementos en el formulario:

figura 3. Página de formulario en un teléfono Android.

La misma forma se muestra en un iPod touch con iOS 4.1:

Figura 4. Formulario de página en un iPod touch.

Paso 2: Definiciones de variables

Haremos referencia a varios elementos en la página html a lo largo de nuestro código. Tiene sentido definir esas referencias solo una vez y reutilizarlas según sea necesario. Por este motivo, declaramos las variables utilizadas globalmente, así como las constantes en el cabeza sección de la página:

 

Las asignaciones de esas variables se realizan en jQuery. $ (documento) .ready () función utilizando selectores de ID, como se muestra a continuación. (Recordemos que jQuery $ (documento) .ready () La función se llama cuando se carga toda la jerarquía DOM en la página. Esa función es la mejor ubicación para inicializar nuestras variables.) También definimos inputMapVar como una colección que consta de todos entrada elementos con _r en su nombre atributo (la llamada de función $ ('input [nombre * = "_ r"]') selecciona todos esos elementos).

 

Paso 3: Funciones de selección de contenido

Veamos ahora las funciones de selección de contenido que llamarán los controladores de eventos..

Para ocultar y mostrar el contenido principal y su encabezado / pie de página, usamos el hideMain () y showMain () funciones:

 función hideMain () hdrMainVar.hide (); contentMainVar.hide (); ftrMainVar.hide ();  función showMain () hdrMainVar.show (); contentMainVar.show (); ftrMainVar.show (); 

Para ocultar y mostrar el contenido de transición, usamos el hideContentTransition () y showContentTransition () funciones:

 function hideContentTransition () contentTransitionVar.hide ();  función showContentTransition () contentTransitionVar.show (); 

Para ocultar y mostrar el contenido del diálogo, usamos el hideContentDialog () y showContentDialog () funciones:

 function hideContentDialog () contentDialogVar.hide ();  función showContentDialog () contentDialogVar.show (); 

Finalmente, para ocultar y mostrar el contenido de confirmación y su encabezado / pie de página, usamos el ocultarConfirmación () y showConfirmation () funciones:

 function hideConfirmation () hdrConfirmationVar.hide (); contentConfirmationVar.hide (); ftrConfirmationVar.hide ();  función showConfirmation () hdrConfirmationVar.show (); contentConfirmationVar.show (); ftrConfirmationVar.show (); 

Cuando se carga la página, solo se debe mostrar el contenido principal. Por esta razón, otras páginas de contenido están ocultas:

 

Discutiremos cómo vincular esas funciones de selección de contenido con los controladores de eventos a continuación..


Paso 4: Envío de formulario

Cuando un usuario presiona el botón de enviar, debemos validar los datos del formulario antes de enviar el formulario. Para simplificar las cosas, solo verificaremos si se han proporcionado todos los campos requeridos. Si la validación del formulario es exitosa, mostramos el contenido de transición que consiste en una imagen giratoria con un breve texto que informa al usuario de que se está enviando su formulario. Si la validación falla, mostramos el contenido del cuadro de diálogo que consiste en una advertencia y un botón Aceptar para cerrar el cuadro de diálogo.

Validación de formularios

Las etiquetas de los elementos del formulario con datos faltantes se resaltarán en rojo. Para este propósito, agregamos una nueva clase de estilo llamada falta y extendiendo el jQuery Mobile etiqueta clase.

 label.missing color: # FF0000; font-weight: negrita; 

A continuación se muestra el controlador de eventos para el envío de formularios. En la notación jQuery típica, el identificador para formulario 1 se pasa a la llamada de objeto jQuery para manejar el evento de envío:

 $ ('# form1'). submit (function () var err = false; // Ocultar el contenido principal hideMain (); // Restablecer los elementos del formulario previamente resaltados stateLabelVar.removeClass (MISSING); whatLabelVar.removeClass (MISSING) ; inputMapVar.each (función (índice) $ (this) .prev (). removeClass (MISSING);); // Realice la validación de formularios inputMapVar.each (función (índice) if ($ (this) .val ( ) == null || $ (this) .val () == EMPTY) $ (this) .prev (). addClass (MISSING); err = true;); if (stateVar.val () == NO_STATE) stateLabelVar.addClass (MISSING); err = true; if (whatVar.val () == null || whatVar.val () == EMPTY) whatLabelVar.addClass (MISSING); err = true; / / Si la validación falla, muestre el contenido del diálogo si (err == verdadero) showContentDialog (); devuelva falso; // Si la validación pasa, muestre el contenido de la transición showContentTransition (); // Envíe el formulario $ .post ("/ forms / requestProcessor.php ", form1Var.serialize (), function (data) confirmationVar.text (data); hideContentTransition (); showConfirmation ();); return false;);

Establecemos un indicador de error para falso y ocultar el contenido principal que contiene el formulario. Luego restablecemos las etiquetas resaltadas previamente en cada miembro de la colección. inputMapVar. Para hacer eso, pasamos una función en línea como un argumento para cada() que simplemente contiene $ (this) .prev (). removeClass (MISSING);. Tenga en cuenta que esta es el seleccionado entrada elemento y anterior () devuelve su hermano anterior inmediato que es el etiqueta asociado a ello.

los estado para la selección del estado y qué Para la descripción de la reclamación no son campos de texto. Por lo tanto, las etiquetas correspondientes tienen sus estilos restablecidos por separado.

Después de restablecer todas las etiquetas resaltadas previamente, volvemos a visitar entrada Elementos para comprobar si alguno de ellos tiene un valor perdido. Si ese es el caso, agregamos la clase faltante a la etiqueta asociada con el campo de entrada:

 // Realizar la validación de formulario inputMapVar.each (función (índice) if ($ (this) .val () == null || $ (this) .val () == EMPTY) $ (this) .prev () .addClass (MISSING); err = true;); if (stateVar.val () == NO_STATE) stateLabelVar.addClass (MISSING); err = true;  if (whatVar.val () == null || whatVar.val () == EMPTY) whatLabelVar.addClass (MISSING); err = true; 

Además, el indicador de error se establece en verdadero y se muestra el cuadro de diálogo de error. La siguiente figura muestra el diálogo de error en nuestro teléfono Android 2.2:

Figura 5. Diálogo de error.

Después de que el usuario presiona el botón OK, se muestra la página del formulario con los campos que faltan resaltados, como se muestra a continuación. En esa imagen, la orientación de la pantalla del teléfono es horizontal. Observe que cada etiqueta y su campo de texto hermano se muestran en una sola línea en lugar de la orientación vertical en la Figura 3 donde la etiqueta está sobre el campo de texto.

Figura 6. Página de formulario con un campo faltante resaltado.

Por otro lado, si la validación es exitosa, mostramos el contenido de la transición y enviamos el formulario como se explica a continuación..

Enviando el formulario a través de Ajax

El envío del formulario utiliza el jQuery Mobile. enviar Función que acepta tres argumentos:

 $ .post ("/ forms / requestProcessor.php", form1Var.serialize (), function (data) …);
  • El primer argumento es la URL del servidor para enviar el formulario a.
  • El segundo es el contenido del formulario a enviar. Para obtener el contenido del formulario, simplemente llamamos publicar por fascículos() en el objeto jQuery pasándole el identificador de nuestro formulario.
  • El tercer argumento es una función en línea para procesar la respuesta., datos, enviado desde el servidor.

Tenga en cuenta que el enviar La función realiza una llamada Ajax que es asíncrona por naturaleza. Inmediatamente después de llamar al enviar, la ejecución del programa continuará devolviendo falso desde el enviar Función y el usuario comenzará a ver el contenido de Transición..

Figura 7. Página de transición mostrada durante el procesamiento del formulario.

La función en línea para procesar la respuesta se ejecuta solo cuando el servidor devuelve su respuesta. Para simplificar, la aplicación del servidor procesa los datos del formulario., requestProcessor.php, devuelve un ID de reclamación codificado para que el usuario lo use como referencia futura. Antes de enviar el ID de reclamo requestProcessor.php, duerme 4 segundos para emular el tiempo de procesamiento del servidor. Es en este período que la aplicación mostrará el contenido de Transición..

 

Cuando se recibe la respuesta del servidor, se ejecuta el código del controlador de eventos. El primer paso es poblar el lapso etiqueta llamada confirmación con el valor devuelto desde el servidor. Esto se hace simplemente con:

 confirmationVar.text (datos);

Luego, ocultamos el contenido de Transición y mostramos el contenido de Confirmación que contiene el lapso etiqueta llamada confirmación:

 

Se ha creado una nueva reclamación basada en los datos que ha enviado..

Tu numero de confirmación es:

La página de confirmación que se muestra en nuestro teléfono Android 2.2 se muestra a continuación (la orientación del teléfono es horizontal):

Figura 8. Página de confirmación en Android 2.2.

La misma página de confirmación se muestra en un iPod touch de la siguiente manera (la orientación es vertical):

Figura 9. Página de confirmación en el iPod touch.

Despliegue del código fuente

El código fuente para el tutorial tiene una estructura de carpetas simple. Todos los recursos se almacenan en una carpeta llamada formas. En esa carpeta, hay dos subcarpetas, css y img. los css carpeta contiene colores.css, que tiene el label.missing clase, y img víveres wait.gif, La imagen del hilandero. los index.html y requestProcessor.php los archivos están directamente debajo de la formas carpeta. En nuestras pruebas, utilizamos un servidor web Apache con la versión 2.2.11 que ejecuta la versión 5.3.0 de PHP. Si colocas el formas carpeta directamente debajo de la Raiz del documento del servidor web, puede acceder a la aplicación a través de http: // [your_host_name] /folder/index.html.


Conclusión

En este tutorial presentamos conceptos básicos de jQuery Mobile framework con enfoque en la estructura de la página, estilo básico, elementos de formulario y envío de formularios Ajax. Se presentó una aplicación de procesamiento de reclamos de muestra para demostrar esos conceptos. Proporcionamos capturas de pantalla de varias páginas de la aplicación ejecutándose en un teléfono Android 2.2 y un dispositivo iPod touch con iOS 4.1. A continuación se presentan algunas observaciones y comentarios finales:

  • Dado que jQuery Mobile se basa en el núcleo de jQuery, aquellos que tengan conocimientos previos del marco jQuery podrían ponerse al día con el marco jQuery Mobile fácilmente..
  • La capacidad del marco para representar varias páginas de contenido en una sola página html con funciones integradas para mostrar / ocultar esas páginas de contenido parecía muy conveniente para crear una aplicación de formulario con diferentes vistas según el estado. Por ejemplo, esta técnica se puede aplicar para implementar guías de usuario de estilo 'asistente' o formularios de encuesta de varias páginas.
  • Probados en las plataformas de escritorio, Android 2.2 y iOS 4.1, tanto la apariencia como los aspectos funcionales de la aplicación de muestra fueron consistentes. Durante el desarrollo, debería ser posible probar y depurar rápidamente los aspectos principales de una aplicación jQuery Mobile en una plataforma de escritorio. Luego, se pueden realizar más pruebas en los dispositivos y navegadores individuales que se espera que la aplicación admita.