Programación para móviles con jQuery Mobile

jQuery mobile es un framework dependiente de jQuery. A la fecha se encuentra en la versión “RC1″ como se puede ver en el blog oficial. Aunque aún es un proyecto que está en etapa de crecimiento, promete mucha facilidad para el desarrollo de aplicaciones Web orientadas a dispositivos móviles por lo que me gustaría hacer una pequeña introducción al mismo creando un proyecto que nos permita ver algunas de sus características principales.

Si quieres ver una comparativa con Sencha Touch y un resumen de sus características puedes leer el artículo jQuery mobile vs Sencha Touch para dispositivos móviles.

Lo interesante de jQuery mobile, es que no se escriben largas líneas de programación sino que usas etiquetas HTML con atributos definidos por el framework y al momento de mostrar la página, esto es leído por jQuery y lo toma como metadatos para crear la interfaz del usuario, algo muy útil si tu especialidad no es el diseño.

Creemos nuestra primera página con jQuery mobile

Lo primero que tendremos que hacer es escribir el código básico de nuestra página. Para esto veamos cual es la estructura inicial necesaria y vayamos discutiéndola.

<!DOCTYPE html>
<html>
    <head>
        <title>blog.micayael.com</title> 
 
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0rc1/jquery.mobile-1.0rc1.min.css" />
        <script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.0rc1/jquery.mobile-1.0rc1.min.js"></script>
    </head> 
 
    <body> 
 
    </body>
</html>

En un inicio tenemos un HTML bastante sencillo de entender así que hablemos solamente de los puntos interesantes. En la línea 1 vemos el <!DOCTYPE html> correspondiente a HTML5, y en las líneas 6 , 7 y 8 vemos la importación del archivo CSS para los estilos del framework, el archivo JavaScript correspondiente al CORE de jQuery y por último el jquery.mobile-1.0b1.min.js que corresponde al framework para móviles. Hay que tener en cuenta que estos archivos también los puedo descargar de la página oficial y agregarlos dentro de mi carpeta haciendo referencia a la importación local de los mismos. Con esto ya tenemos nuestra estructura básica. Hasta ahora no hay nada que corresponda a jQuery mobile excepto por la importación de archivos.

A este mismo archivo le agregaremos una etiqueta meta en el <head> para decirle a la página que se adapte a la pantalla del dispositivo móvil y se vea la página completa. También agregaremos un div dentro del body con el que le diremos que es una página a ser mostrada.

&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt; 
 
        &lt;title&gt;blog.micayael.com&lt;/title&gt; 
 
        &lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.0b2/jquery.mobile-1.0b2.min.css&quot; /&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-1.6.2.min.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/mobile/1.0b2/jquery.mobile-1.0b2.min.js&quot;&gt;&lt;/script&gt;
    &lt;/head&gt;
    &lt;body&gt;
 
        &lt;div data-role=&quot;page&quot; id=&quot;home&quot;&gt;
 
        &lt;/div&gt;
 
    &lt;/body&gt;
&lt;/html&gt;

Si volvemos a abrir esta página veremos que la página se pone gris tomando ya el tema (estilo) por defecto asociado al framework y si revisamos el código con el Firebug del Firefox veremos que el jQuery mobile obtuvo información en runtime de los datos y agregó atributos al body creando también unos divs dinámicamente. Esta es justamente la dinámica que propone jQuery mobile, usa información que escribimos en etiquetas y crea HTML dinámicamente para mostrar las pantallas.

Podemos ver en la línea 14 que agregamos dos atributos a nuestro DIV, uno muy importante llamado data-role que indica como debe ser tratado ese DIV, en este caso como una página independiente dentro de nuestro archivo index.html y el segundo es una identificación para esa página.

Con jQuery mobile, debemos hacer una diferenciación entre la página Web que corresponde al archivo donde programamos y la página que vemos en el navegador con el framework. Esto ya que en un mismo archivo podemos crear varias páginas agregando dentro del body varios DIVs con data-role="page" y con ids diferentes. Al momento de hacer los links los llamaríamos por el ID así <a href=”#idpagina”>. En caso que usáramos archivos diferentes para cada página, tendríamos la misma estructura básica inicial y los links los utilizaríamos apuntando a los archivos <a href=”nombre_pagina.html”>.

En el caso de que las páginas se encuentren en el mismo archivo, éstas se cargan todas al momento de ingresar al archivo index.html y por medio de los links simplemente saltamos de una a otra como si fueran links locales. Cuando usamos archivos separados, jQuery se encarga de cargar esas páginas al momento de hacer click sobre el enlace en forma asíncrona usando Ajax, y las escribe dentro del DOM de la actual para luego proceder a la transición.

Dentro de una página, un div con data-role=page, podemos crear tres secciones: una cabecera, un cuerpo y un pie de página. esto simplemente con tres nuevos divs que tengan data-role="header", data-role="content" y data-role="footer"

&lt;div data-role=&quot;page&quot; id=&quot;home&quot;&gt;
 
    &lt;div data-role=&quot;header&quot;&gt;
        header
    &lt;/div&gt;
 
    &lt;div data-role=&quot;content&quot;&gt;
        content
    &lt;/div&gt;
 
    &lt;div data-role=&quot;footer&quot;&gt;
        footer
    &lt;/div&gt;
 
&lt;/div&gt;

Estas secciones no son obligatorias pero las utilizaremos en nuestro ejemplo ya que son bastante interesantes.

Caso de ejemplo

Iremos viendo de a poco, a través de ejemplos, la forma de uso creando cuatro páginas. Las dos primeras dentro del mismo archivo index.html y la siguientes en archivos diferentes para tenerlo como referencia. Las páginas serán las siguientes con sus respectivos objetivos entre paréntesis:

  1. Home: Donde veremos un simple Lorem Ipsum (HTML embebido en las páginas)

  2. Productos: Veremos una lista de artículos con el nombre y un enlace para ver el detalle del producto (Listas con contadores)

  3. Detalle del producto: Una página, por el momento estática, que mostrará los datos del producto (Página de tipo diálogo – popup)

  4. Contacto: Una página de contacto estática (Formularios)

Para todas estas páginas tendremos una cabecera y un pie de página las cuales se crean con los siguientes objetivos

  • Cabecera: Mostrará el título de la página, un botón atrás y un botón para volver al home (títulos, botones e iconos)
  • Pie de página: Mostrará una barra de navegación a la página de productos y a la de contacto (barra de navegación)

Comenzaremos con la cabecera y el pie de páginas ya que estarán presentes en todas las páginas del ejemplo

Cabecera

Para la cabecera usaremos dentro del div con data-role header el siguiente código

&lt;div data-role=&quot;header&quot;&gt;
    &lt;h1&gt;Productos&lt;/h1&gt;
    &lt;a href=&quot;#home&quot; data-icon=&quot;home&quot; data-iconpos=&quot;notext&quot; class=&quot;ui-btn-right&quot;&gt;Home&lt;/a&gt;
&lt;/div&gt;

Para mostrar el título principal dentro de la cabecera simplemente usemos la etiqueta h1. En realidad cualquiera de las 6 etiquetas de tipo “h” son mostradas con el mismo estilo pero a mi opinión debería ser la h1 ya que se trata del título principal.

Vemos que en el href del link apuntamos a #home ya que como la página inicial ya está cargada desde el inicio podemos simplemente volver a mostrar esa sección del DOM.

Con relación a los botones es realmente muy sencillo. Cualquier enlace “a” puede ser representado como un botón usando o no iconos. Solamente tenemos que configurarlo con los siguientes atributos:

  • data-icon: indica uno de los íconos que vienen por defecto con el framework. En este caso usaremos “home”
  • data-iconpos: este atributo nos permite decirle al icono que agregamos la posición con relación al texto pudiendo usar los valores: top, bottom, left, right y en caso de no querer mostrar el texto usamos “notext”

  • class: estas son clases definidas por jQuery mobile. Cuando ponemos los links dentro del header automáticamente son posicionados de izquierda a derecha. La idea es hacer que el botón de “Atrás” aparezca en el lado izquierdo de forma automática entonces posicionamos nuestro botón de inicio a la derecha por medio de la clase ui-btn-right, por defecto es ui-btn-left.

Pie de página

&lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot;&gt;
    &lt;div data-role=&quot;navbar&quot;&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href=&quot;productos.html&quot;&gt;Productos&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;#contacto&quot;&gt;Contacto&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/div&gt;
&lt;/div&gt;

Al div principal que ya vimos solo agregamos el atributo data-position=”fixed” que hace el pie de página siempre se mantenga visible en la misma posición bien abajo. Pueden probar quitándolo y verán que la posición cambiará de acuerdo al contenido de la página.

Para crear la barra de navegación lo único que tenemos que tener en cuenta aquí es que debemos tener un div con data-role=”navbar” y dentro una lista no ordenada con las opciones que queremos que se vean. Muy simple verdad?

Vemos que la primera opción nos lleva a un archivo externo “productos.html” mientras que el segundo a la página que también configuraremos dentro del index.html

Página Principal

Esta página la programaremos en el archivo index.html agregando la cabecera y pie de página vistos más arriba quedando de la siguiente forma:

&lt;div data-role=&quot;page&quot; id=&quot;home&quot;&gt;
 
    &lt;div data-role=&quot;header&quot;&gt;
        &lt;h1&gt;Mi Tienda&lt;/h1&gt;
        &lt;a href=&quot;#home&quot; data-icon=&quot;home&quot; data-iconpos=&quot;notext&quot; class=&quot;ui-btn-right&quot;&gt;Home&lt;/a&gt;
    &lt;/div&gt;
    &lt;!-- end /header --&gt;
 
    &lt;div data-role=&quot;content&quot;&gt;
        &lt;p&gt;Lorem ipsum dolor sit amet, &lt;strong&gt;consectetur adipisicing elit&lt;/strong&gt;, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;
        &lt;p&gt;Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit&lt;/p&gt;
 
        &lt;h2&gt;Listas ordenadas&lt;/h2&gt;
        &lt;ol&gt;
            &lt;li&gt;Item 1&lt;/li&gt;
            &lt;li&gt;Item 2&lt;/li&gt;
        &lt;/ol&gt;
 
        &lt;h2&gt;Listas no ordenadas&lt;/h2&gt;
        &lt;ul&gt;
            &lt;li&gt;Item 1&lt;/li&gt;
            &lt;li&gt;Item 2&lt;/li&gt;
        &lt;/ul&gt;
 
        &lt;h2&gt;Datos tabulares&lt;/h2&gt;
        &lt;table&gt;
            &lt;caption&gt;Listado de personas&lt;/caption&gt;
 
            &lt;thead&gt;
                &lt;tr&gt;
                    &lt;th scope=&quot;col&quot;&gt;Nombre&lt;/th&gt;
                    &lt;th scope=&quot;col&quot;&gt;Apellido&lt;/th&gt;
                    &lt;th scope=&quot;col&quot;&gt;Edad&lt;/th&gt;
                &lt;/tr&gt;
            &lt;/thead&gt;
 
            &lt;tbody&gt;
                &lt;tr&gt;
                    &lt;td&gt;John&lt;/td&gt;
                    &lt;td&gt;Doe&lt;/td&gt;
                    &lt;td&gt;35&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;Peter&lt;/td&gt;
                    &lt;td&gt;Clember&lt;/td&gt;
                    &lt;td&gt;40&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;Alan&lt;/td&gt;
                    &lt;td&gt;Morden&lt;/td&gt;
                    &lt;td&gt;25&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/div&gt;
    &lt;!-- end /content --&gt;
 
    &lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot;&gt;
        &lt;div data-role=&quot;navbar&quot;&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href=&quot;productos.html&quot;&gt;Productos&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;#contacto&quot;&gt;Contacto&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- end /footer --&gt;
 
&lt;/div&gt;
&lt;!-- end #home --&gt;

Lo único que hicimos aquí es agregar las secciones que ya vimos y en el #content agregamos contenido HTML para mostrar como quedan ya formateados con los estilos propios del framework.

Página de Contacto

Esta página también la vamos a programar dentro del archivo index.html, por lo que directamente después del final de la página #home escribiremos lo siguiente:

&lt;!-- end #home --&gt;
 
&lt;div data-role=&quot;page&quot; id=&quot;contacto&quot; data-add-back-btn=&quot;true&quot; data-back-btn-text=&quot;Atr&amp;aacute;s&quot;&gt;
 
    &lt;div data-role=&quot;header&quot;&gt;
        &lt;h1&gt;Contacto&lt;/h1&gt;
        &lt;a href=&quot;#home&quot; data-icon=&quot;home&quot; data-iconpos=&quot;notext&quot; class=&quot;ui-btn-right&quot;&gt;Home&lt;/a&gt;
    &lt;/div&gt;
    &lt;!-- end /header --&gt;
 
    &lt;div data-role=&quot;content&quot;&gt;
        &lt;form id=&quot;mesa_ayuda_form&quot; action=&quot;index.html&quot; method=&quot;post&quot;&gt;
            &lt;fieldset&gt;
 
                &lt;div data-role=&quot;fieldcontain&quot;&gt;
                    &lt;label for=&quot;mesa_ayuda_form_nombre&quot;&gt;Nombre:&lt;/label&gt;
                    &lt;input type=&quot;text&quot; name=&quot;mesa_ayuda_form[nombre]&quot; id=&quot;mesa_ayuda_form_nombre&quot; required /&gt;
                &lt;/div&gt;
 
                &lt;div data-role=&quot;fieldcontain&quot;&gt;
                    &lt;label for=&quot;mesa_ayuda_form_email&quot;&gt;Email:&lt;/label&gt;
                    &lt;input type=&quot;email&quot; name=&quot;mesa_ayuda_form[email]&quot; id=&quot;mesa_ayuda_form_email&quot; required /&gt;
                &lt;/div&gt;
 
                &lt;div data-role=&quot;fieldcontain&quot;&gt;
                    &lt;label for=&quot;mesa_ayuda_form_asunto&quot;&gt;Asunto:&lt;/label&gt;
                    &lt;input type=&quot;text&quot; name=&quot;mesa_ayuda_form[asunto]&quot; id=&quot;mesa_ayuda_form_asunto&quot; required /&gt;
                &lt;/div&gt;
 
                &lt;div data-role=&quot;fieldcontain&quot;&gt;
                    &lt;label for=&quot;mesa_ayuda_form_comentario&quot;&gt;Comentario:&lt;/label&gt;
                    &lt;textarea cols=&quot;40&quot; rows=&quot;10&quot; name=&quot;mesa_ayuda_form[comentario]&quot; id=&quot;mesa_ayuda_form_comentario&quot; required&gt;&lt;/textarea&gt;
                &lt;/div&gt;
 
                &lt;div data-role=&quot;controlgroup&quot; data-type=&quot;horizontal&quot;&gt;
                    &lt;input type=&quot;reset&quot; value=&quot;Limpiar&quot; data-icon=&quot;delete&quot; /&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;Enviar&quot; data-icon=&quot;arrow-r&quot; data-iconpos=&quot;right&quot; data-theme=&quot;b&quot; /&gt;
                &lt;/div&gt;
 
            &lt;/fieldset&gt;
        &lt;/form&gt;
    &lt;/div&gt;
    &lt;!-- end /content --&gt;
 
    &lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot;&gt;
        &lt;div data-role=&quot;navbar&quot;&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href=&quot;productos.html&quot;&gt;Productos&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;#contacto&quot;&gt;Contacto&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- end /footer --&gt;
 
&lt;/div&gt;
&lt;!-- end #contacto --&gt;

El primer punto interesante se encuentra en la línea 3 donde a nuestro div contenedor de la página agregamos los atributos data-add-back-btn="true" y data-back-btn-text="Atrás" para que automáticamente agregue el botón de atrás cuando entramos en esta página.

Para el formulario, vemos que simplemente dentro de nuestro #content agregamos un formulario y para cada grupo de label-input un div con el atributo data-role="fieldcontain" que se encargará de formatear los campos de acuerdo a la pantalla del dispositivo poniendo el label al lado izquierdo del input o sobre el mismo.

La otra novedad es que podemos usar los nuevos tipos de input de HTML5 como por ejemplo el type="email" que usamos en la línea 22. También tenemos: type="url" para direcciónes web, type="tel" para números de telefonos y type="number" para solo números. Estos tipos controlaran el teclado del dispositivo para mostrar los caracteres.

Finalmente vemos la opción de agrupar botones con el data-role="controlgroup" de la línea 35 y data-type="horizontal" para mostrar un botón pegado al otro, también pudiendo usar “vertical”. Vemos que para los botones es lo mismo que con los links pudiendo usar los data-icon y data-iconpos.

Página de Productos

Para esta página vamos a mostrar una lista de productos y por cada producto vamos a mostrar la cantidad en stock por medio de un “buble” que es simplemente una porción de la lista que nos permite mostrar un número.

Empezaremos también diciéndole al div contenedor de la página que muestre el botón “Atrás”.

&lt;div data-role=&quot;page&quot; id=&quot;productos&quot; data-add-back-btn=&quot;true&quot; data-back-btn-text=&quot;Atr&amp;aacute;s&quot;&gt;
 
    &lt;div data-role=&quot;header&quot;&gt;
        &lt;h1&gt;Productos&lt;/h1&gt;
        &lt;a href=&quot;#home&quot; data-icon=&quot;home&quot; data-iconpos=&quot;notext&quot; class=&quot;ui-btn-right&quot;&gt;Home&lt;/a&gt;
    &lt;/div&gt;
    &lt;!-- end /header --&gt;
 
    &lt;div data-role=&quot;content&quot;&gt;
        &lt;ul data-role=&quot;listview&quot; data-inset=&quot;true&quot; data-filter=&quot;true&quot; data-filter-placeholder=&quot;texto a buscar&quot;&gt;
 
            &lt;li data-role=&quot;list-divider&quot;&gt;Categor&amp;iacute;a 1&lt;/li&gt;
 
            &lt;li&gt;
                &lt;a href=&quot;&quot;&gt;
                    Producto 1
                    &lt;span class=&quot;ui-li-count&quot;&gt;10&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href=&quot;producto.html&quot; data-rel=&quot;dialog&quot; data-transition=&quot;pop&quot;&gt;&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href=&quot;&quot;&gt;
                    Producto 2
                    &lt;span class=&quot;ui-li-count&quot;&gt;12&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href=&quot;producto.html&quot; data-rel=&quot;dialog&quot; data-transition=&quot;pop&quot;&gt;&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href=&quot;&quot;&gt;
                    Producto 3
                    &lt;span class=&quot;ui-li-count&quot;&gt;5&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href=&quot;producto.html&quot; data-rel=&quot;dialog&quot; data-transition=&quot;pop&quot;&gt;&lt;/a&gt;
            &lt;/li&gt;
 
            &lt;li data-role=&quot;list-divider&quot;&gt;Categor&amp;iacute;a 2&lt;/li&gt;
 
            &lt;li&gt;
                &lt;a href=&quot;&quot;&gt;
                    Producto 4
                    &lt;span class=&quot;ui-li-count&quot;&gt;23&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href=&quot;producto.html&quot; data-rel=&quot;dialog&quot; data-transition=&quot;pop&quot;&gt;&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href=&quot;&quot;&gt;
                    Producto 5
                    &lt;span class=&quot;ui-li-count&quot;&gt;4&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href=&quot;producto.html&quot; data-rel=&quot;dialog&quot; data-transition=&quot;pop&quot;&gt;&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href=&quot;&quot;&gt;
                    Producto 6
                    &lt;span class=&quot;ui-li-count&quot;&gt;54&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href=&quot;producto.html&quot; data-rel=&quot;dialog&quot; data-transition=&quot;pop&quot;&gt;&lt;/a&gt;
            &lt;/li&gt;
 
        &lt;/ul&gt;
    &lt;/div&gt;
    &lt;!-- end /content --&gt;
 
    &lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot;&gt;
        &lt;div data-role=&quot;navbar&quot;&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href=&quot;productos.html&quot;&gt;Productos&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;#contacto&quot;&gt;Contacto&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- end /footer --&gt;
 
&lt;/div&gt;
&lt;!-- end #productos --&gt;

Para crear listas tenemos muchas posibilidades como se muestra en los ejemplos oficiales pero todas se desprenden de la misma idea explicada aquí. Dependiendo si queremos una lista numerada o no usamos <ol> o <ul> pero agregando el atributo data-role=”listview” que agrega el diseño a la lista HTML para mostrarse con el estilo del framework y, data-inset=”true” que da un pequeño margen entre los costados para aparentar un panel flotante (pueden probar quitando el atributo para ver el efecto). Esto lo vemos en la línea 10. También podemos agregar dos atributos muy útiles para listas largas: data-filter=”true” y data-filter-placeholder=”texto a buscar” que automáticamente por arte de magia crea un buscador en el cliente para filtrar por textos contenidos dentro de los <li>. El segundo permite escribir un texto por default para ser mostrado en el input de filtros.

A partir de este momento, con el simple hecho de usar el “listview” simplemente poniendo etiquetas <li> dentro ya tendremos una lista muy vistosa. Si queremos dividir algunos <li> de otros podemos usar un separador como en la línea 12; un simple <li> pero con el atributo data-role=”list-divider”.

En las líneas 14 a 20 podemos ver que para cada opción de la lista simplemente tenemos que poner un <li> con contenido. Siempre para formatear bien debemos poner un link y si no queremos que nos lleve a algún lado lo dejamos con href=”” pero si agregamos un segundo link como vemos en la línea 19, corta verticalmente esa sección y agregará un botón para darle click y llevarnos al link definido.

Para mostrar la cantidad de productos podemos usar un <span> con un class=”ui-li-count” con el número.

Podemos notar también que en el link de la línea 19 hay un atributo data-rel=”dialog”. Esto hace que la página abierta por medio de este link se abra como un popup y data-transition=”pop” hace que en lugar se ejecutarse el efecto de transición tipo slide que venimos viendo lo haga como pop para simular el popup.

Existen realmente muchas posibilidades con las listas y así como las que vimos son muy sencillas de implementar, pero todas giran en torno a una etiqueta de lista con data-role=”listview”. Les animo a jugar agregando y quitando los atributos.

Página de Detalle del producto

La idea es que esta página sea un popup por lo que no contendrá la misma cabecera y pie de página que los demás ni tampoco se definirá que muestre el botón de Atrás ya que automáticamente al mostrarse aparecerá arriba un botón para cerrar la ventana.

&lt;div data-role=&quot;page&quot; id=&quot;producto&quot;&gt;
 
    &lt;div data-role=&quot;header&quot;&gt;
        &lt;h1&gt;Detalle del Producto&lt;/h1&gt;
    &lt;/div&gt;
    &lt;!-- end /header --&gt;
 
    &lt;div data-role=&quot;content&quot;&gt;
 
        &lt;h2 class=&quot;ui-li-heading&quot;&gt;Producto x&lt;/h2&gt;
 
        &lt;p class=&quot;ui-li-desc&quot;&gt;&lt;strong&gt;Precio:&lt;/strong&gt; U$S 999&lt;/p&gt;
        &lt;p class=&quot;ui-li-desc&quot;&gt;&lt;strong&gt;Cantidad:&lt;/strong&gt; 10&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;
 
    &lt;/div&gt;
    &lt;!-- end /content --&gt;
 
&lt;/div&gt;
&lt;!-- end #producto --&gt;

Lo primero que vemos es que el div #header no contiene nada raro sino simplemente un título y que no le agregamos pie de página.

Las dos únicas otras cosas diferentes son que usamos dos clases definidas por el framework, class=”ui-li-heading” en la línea 10 y class=”ui-li-desc” en las líneas 12 y 13 que sirven para definir cuales textos son de tipo título y cuales son de tipo descripción.

Palabras finales

Bueno esto es todo para finalizar este ejemplo. A modo de ejemplo, he creado una pequeña aplicación móvil para leer los comentarios de este blog y lo he puesto en http://m.micayael.com. A medida que el framework vaya evolucionando ire agregando nuevas funcionalidades para tener la versión móvil del blog.

Los archivos de este artículos los puedes descargar aquí.

12 responses

  1. Quiero fecilitarlo por tan excelente articulo.

    Quisiera saber si es posible crear listas dinamicas, es decir como se hace para pasarle datos a estas listas que han sido traidos a traves de una consulta sql o de una consulta en mysql.

    Muchas gracias por su colaboración.

    • Ramiro muchas gracias.

      Claro que es posible. De hecho que si te fijas sigue siendo nada más que una sola página, puedes hacer que las páginas sean .php en lugar de .html y puedes integrar PHP dentro.

      También lo que podrías hacer es utilizar la filosofía de REST, metodología que usaré para los siguientes artículos usando jQuery mobile. Básicamente significa hacer programas con PHP por ejemplo que retornen tu consulta realizada en la base de datos directamente devolviendo datos (XML o JSON). Con esto lo que tienes es un programa devuelve la información y otro diferente que serían tus páginas para mostrar los datos. Esta última, por ejemplo con JavaScript, obtiene la información y crea los componentes jQuery mobile (parecida a la idea de usar WebServices)

      Aunque como te decía puedes hacerlo de las dos maneras, si ya tienes un poco de experiencia te recomendaría investigar sobre REST. Voy a ir preparando un artículo de ejemplo hablando sobre esto.

      • Juan.

        Nuevamente mil gracias por su pronta respuesta.

        Pasando al tema en cuestión lo que me quieres decir es que se pueden desarrollar aplicativos bajo la plataforma jquerymobile utilizando páginas ASP o PHP y estos a su vez pueden correr en dispositivos moviles?.

        Esta pregunta la realizo pues en mi sitio de trabajo están exigiendo el montaje y puesta en marcha de algunas de las características principales de la pagina web en dispositivos moviles, nuestra página básicamente esta desarrollada en ASP y Sql-Server.

        Y la ultima, acabo de leer algo de la tecnología REST, aunque en los 2 artículos que ley hablan de que no siempre es la mejor opción optar por este tipo de servicios, me gustaría saber tu opinión al respecto viéndolo desde por ejemplo la recurrencia que puedan tener las consultas que los usuario móviles efectúen a la base de datos.

        Gracias.

        • Así mismo Ramiro, claro que se puede. Simplemente tienes que generar el HTML necesario y devolverlo como una página (usando jquery mobile)

          Con relación al segundo punto tengo conciencia de varias aplicaciones que usan REST teniendo muchas personas consultandolas como es por ejemplo Amazon. En mi opinión yo si lo uso y lo seguiría haciendo.

    • Maria de Jesus, la verdad que eso no tiene que ver con jQuery mobile sino con JavaScript ya que por debajo JQM es nada más y nada menos de JS. Solo se pueden cerrar ventanas que hayas abierto por medio de JavaScript por cuestiones de seguridad. Puedes ver una discusión sobre este tema aquí.

  2. Hola como vas? Espero que estes bien.. Te queria preguntar si en el formulario se puede mostrar un casilla de acuerdo a la opcion de un radiobutton y si es asi, me podrias indicar como se podria hacer?

Comenta este artículo