jQuery Mobile Framework - Didacticiel sur les formulaires

jQuery Mobile est un framework Web mobile relativement nouveau, dont la première version a été publiée en octobre 2010. Le framework dispose de nombreuses fonctionnalités intéressantes pour le développement d'applications mobiles basées sur le Web. Dans ce tutoriel, nous allons nous concentrer sur quelques éléments de base de jQuery Mobile: structure de page, formulaires et soumission de formulaire Ajax. Le tutoriel est basé sur la version 1.0 alpha release 2 du framework jQuery Mobile.

Dans le cadre de ce tutoriel, nous allons écrire une petite application B2C. Une société d’expédition de colis dispose sur son site Web d’un formulaire permettant aux clients de saisir des informations sur les colis perdus ou endommagés au cours de l’expédition. À l'aide d'un appareil portatif (par exemple, un téléphone activé sur le Web), un client entre dans le formulaire les informations relatives à sa réclamation: le numéro d'expédition du reçu d'origine, son nom / adresse et une description de la perte / du dommage. Lorsque le client soumet le formulaire, le site Web répond avec un identifiant de réclamation pour un suivi ultérieur. Le scénario est présenté dans le diagramme ci-dessous:

Figure 1. Diagramme de contexte d'application tutoriel.

La structure jQuery Mobile prend en charge une variété de navigateurs, notamment les périphériques iOS, Android, Blackberry OS 6 et webOS (pour une matrice de support, voir http://jquerymobile.com/gbs/). L'application de ce didacticiel a été testée sur un appareil Android 2.2 et un appareil iOS 4.1..

Considérations sur la conception

Avant d’entrer dans les détails techniques, parlons des principales considérations à la base de la conception de l’application..

  • Temps de réponse court: il est préférable que l'application Web contienne une seule page HTML avec une interface utilisateur simple. Toutes les structures d'interface utilisateur, telles que les pages de dialogue d'erreur et de confirmation, feront partie de la page HTML. Une fois la page téléchargée dans le navigateur, différentes sections de la page seront présentées à l'utilisateur en fonction du contexte. Il ne sera pas nécessaire d'ouvrir plusieurs connexions réseau pour télécharger plusieurs fois des pages..
  • Traitement des erreurs: si l'utilisateur oublie de saisir un champ obligatoire dans le formulaire, la soumission doit échouer avec un dialogue d'avertissement. Les champs manquants doivent être faciles à trouver pour l'utilisateur.
  • Prise en charge de plusieurs périphériques / navigateurs: les applications doivent avoir une apparence et un comportement cohérents sur les périphériques et les navigateurs pris en charge.

Bien entendu, une application typique de la vie réelle posera des problèmes de conception supplémentaires ou différents. Pour les besoins de ce tutoriel, notre portée sera limitée aux considérations ci-dessus..

Introduction de jQuery Mobile

La plupart des discussions dans cette section ont été empruntées à la documentation de http://jquerymobile.com. Voir la référence d'origine pour plus de détails.

jQuery Mobile est un système d'interface utilisateur construit sur le célèbre framework JavaScript jQuery. Il se compose d'éléments d'interface utilisateur et de structures de programmation fournissant des fonctionnalités cohérentes sur une grande variété de navigateurs Web mobiles et de bureau. Les principes de "Progressive Enhancement" et de "Graceful Degradation" sont à l'origine de sa conception. La fonctionnalité principale de la structure prend en charge un large éventail de plates-formes, tandis que les nouvelles plates-formes bénéficient de fonctionnalités améliorées..

jQuery Mobile a une empreinte relativement petite. Étant donné que la configuration de base d'une page jQuery Mobile se fait uniquement par balisage, il est possible de réaliser des cycles de développement rapides, en particulier si votre application n'a pas besoin de fonctions de programmation complexes. Bien que construit sur le noyau de jQuery, le système de thématisation de jQuery Mobile est basé sur un nouveau cadre CSS qui vise à séparer la couleur et la texture des styles structurels qui définissent des éléments tels que le remplissage et les dimensions. Une API de gestion d'événements gère les méthodes de saisie utilisateur basées sur le focus, la souris et le curseur de manière unifiée.

jQuery Mobile est livré avec de nombreux éléments d'interface utilisateur tels que des barres d'outils d'en-tête et de pied de page, des boutons avec des icônes, des éléments de formulaire (y compris des curseurs tactiles et des commutateurs à bascule) et des listes. Des styles HTML de base, des grilles à deux ou trois colonnes et des éléments réductibles sont également fournis..

Inclusion de bibliothèques mobiles jQuery

À compter de la version jQuery Mobile 1.0 alpha 2, les bibliothèques de feuilles de style et JavaScript suivantes doivent être incluses dans vos pages HTML. Vous pouvez les référencer comme ci-dessous ou les servir à partir de votre propre serveur:

   

Conteneur et contenu

Laissez-nous vous présenter la structure de base d'une page dans jQuery Mobile. Une page dans jQuery Mobile Framework peut être une page unique ou une "page" interne interne liée dans une page. Une page 'conteneur' inclura une ou plusieurs pages de 'contenu'. La limite d'une page de conteneur est définie comme suit:

 

Observez que la valeur de la data-role attribut est page. D'autre part, la limite d'une page de contenu est définie comme suit:

 

Observez que la valeur de la data-role attribut est contenu.

Une page de contenu peut avoir un en-tête et un pied de page associés. Par exemple, une page conteneur contenant plusieurs pages de contenu peut avoir la structure suivante:

 

Lorsqu'une page de conteneur est chargée, toutes les pages de contenu de celle-ci sont visibles. Dans notre application, nous n'avons besoin d'afficher qu'un contenu à la fois. Par conséquent, nous devons contrôler par programme le contenu à afficher en fonction du contexte..

Masquer / Afficher les pages de contenu

Pour masquer un élément, utilisez l’API jQuery Mobile. cacher() une fonction:

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

va cacher l'en-tête avec identifiant hdrMain. Ici, nous avons utilisé le sélecteur d’ID jQuery en passant identifiant de l'élément que nous aimerions sélectionner précédé de # signe. Inversement, le spectacle() fonction montre un élément caché:

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

le cacher() et spectacle() fonctions s’appliquent à des éléments de nombreux types différents, en particulier,

balises et ancres ( Mots clés). Dans ce tutoriel, nous allons utiliser cacher() et spectacle() de nombreuses fonctions pour n’afficher que le contexte pertinent pour l’utilisateur de l’application. Plus de détails sont donnés ci-dessous.


Étape 1: Structure de la page de l'application de démonstration

Notre application de démonstration consiste en une seule page html, index.html, qui consiste en une page de conteneur comme indiqué ci-dessous:

 
  • Le contenu principal contient le formulaire à remplir par l'utilisateur et comporte à la fois un en-tête et un pied de page..
  • Le contenu de la boîte de dialogue ne s'affiche que si un champ de formulaire requis est manquant lors de l'envoi du formulaire. Il comprend un avertissement et un bouton OK pour fermer la boîte de dialogue. Observez qu'il n'a pas d'en-tête ou de pied de page.
  • Le contenu de la transition est affiché après la soumission du formulaire jusqu'à la réception de la réponse du serveur. Il s'agit d'une image "spinner" avec un court texte informant l'utilisateur que son formulaire est en cours d'envoi. Le contenu de la transition n'a pas non plus d'en-tête ni de pied de page.
  • Le contenu de la confirmation s'affiche après la réponse du serveur. Il affiche le numéro de confirmation à l'utilisateur. Le contenu de confirmation comporte à la fois un en-tête et un pied de page..

Les transitions de contenu sont illustrées dans le diagramme ci-dessous:

Figure 2. Transitions de contenu.

Observations supplémentaires sur la liste de codes ci-dessus:

  • le thème de données attribut nous permet de choisir parmi les styles disponibles dans le framework jQuery Mobile:
    . Le thème par défaut comporte différentes nuances de couleurs nommées a, b, c, d, e, chacun fournissant un ensemble cohérent de couleurs pour différents éléments de la page. Pour notre application, nous avons choisi la couleur correspondant à b.
  • Les en-têtes viennent avec un bouton retour. Nous n’avions pas besoin de boutons de retour et avons donc choisi de les masquer via data-nobackbtn = "true".
  • Il est possible de fournir du texte à afficher dans le pied de page entre le
    Mots clés. Dans notre application, nous avons omis le texte dans le pied de page. En conséquence, l'utilisateur ne verra dans le pied de page qu'une mince barre colorée de la même manière que l'en-tête. Avec le texte, le pied de page aura une hauteur similaire à celle du pied de page contenant le texte..

Éléments de formulaire

Notre formulaire de réclamation comprend les champs suivants:

  • Nombreuses contribution Champs de type texte: Numéro d'expédition, Prénom, Nom, Email, Téléphone, Adresse, Ville et Code postal. Tous sont obligatoires sauf Téléphone.
  • UNE sélectionner élément pour Etat. Ceci est un champ obligatoire.
  • UNE zone de texte élément permettant à l’utilisateur de saisir les informations relatives à l’envoi manquant ou endommagé. Ceci est un champ obligatoire.

À titre d’exemple, examinons le champ de texte correspondant au numéro d’expédition:

 

Nous avons utilisé un étiquette avec un pour attribut dont la valeur est la même que la identifiant du contribution élément le étiquette est attaché à. De plus, nous avons emballé le étiquette et contribution dans un div avec data-role attribut évalué comme champcontain. Le cadre jQuery Mobile utilisera le champcontain valeur d'attribut pour un style spécial. De plus, regardez name = "shipNo_r". Pour cette application particulière, nous avons décidé de définir la valeur du prénom attribut de tout élément de formulaire requis correspondant à la valeur du identifiant attribut ajouté par _r. Si l'élément n'est pas requis, la valeur de prénom attribut sera le même que la valeur de la identifiant attribut. Par exemple, étant donné que Téléphone n'est pas un champ obligatoire, il est défini comme suit:

 

Comme nous le verrons plus tard, cette convention de dénomination spéciale nous aidera à détecter les champs manquants lors de la soumission du formulaire..

Un autre élément de forme notable est le sélectionner élément. Semblable à ce qui précède, la valeur de la pour attribut est le même que l'id du sélectionner élément le étiquette est attaché à. Également étiquette et sélectionner sont enveloppés dans un div avec le data-role attribuer la valeur en tant que champcontain. Avec la longue liste d'options que nous avons dans cette application, l'infrastructure de jQuery Mobile ouvrira la liste dans une nouvelle page lorsque l'utilisateur se concentrera sur le sélectionner élément.

 

La page de formulaire affichée sur un téléphone Android 2.2 est présentée ci-dessous. L'utilisateur fera défiler la page pour accéder aux éléments du formulaire:

figure 3. Formulaire de page dans un téléphone Android.

Le même formulaire apparaît sur un iPod touch sous iOS 4.1:

Figure 4. Formulaire de page sur un iPod touch.

Étape 2: Définitions de variables

Nous allons référencer divers éléments dans la page html tout au long de notre code. Il est logique de définir ces références une seule fois et de les réutiliser au besoin. Pour cette raison, nous déclarons des variables utilisées globalement ainsi que des constantes dans tête section de la page:

 

Les affectations de ces variables sont effectuées dans jQuery $ (document) .ready () fonction à l’aide des sélecteurs d’identité, comme indiqué ci-dessous. (Rappelons que jQuery $ (document) .ready () La fonction est appelée lorsque toute la hiérarchie DOM de la page est chargée. Cette fonction est le meilleur emplacement pour initialiser nos variables.) Nous définissons également inputMapVar comme une collection composée de tous contribution éléments avec _r dans leurs prénom attribut (l'appel de fonction $ ('input [name * = "_ r"]') sélectionne tous ces éléments).

 

Étape 3: Fonctions de sélection du contenu

Voyons maintenant les fonctions de sélection de contenu qui seront appelées par les gestionnaires d'événements..

Pour masquer et afficher le contenu principal et son en-tête / pied de page, nous utilisons le hideMain () et showMain () les fonctions:

 fonction hideMain () hdrMainVar.hide (); contentMainVar.hide (); ftrMainVar.hide ();  function showMain () hdrMainVar.show (); contentMainVar.show (); ftrMainVar.show (); 

Pour masquer et afficher le contenu de la transition, nous utilisons le hideContentTransition () et showContentTransition () les fonctions:

 function hideContentTransition () contentTransitionVar.hide ();  function showContentTransition () contentTransitionVar.show (); 

Pour masquer et afficher le contenu du dialogue, nous utilisons le hideContentDialog () et showContentDialog () les fonctions:

 fonction hideContentDialog () contentDialogVar.hide ();  function showContentDialog () contentDialogVar.show (); 

Enfin, pour masquer et afficher le contenu de la confirmation et son en-tête / pied de page, nous utilisons le hideConfirmation () et showConfirmation () les fonctions:

 fonction hideConfirmation () hdrConfirmationVar.hide (); contentConfirmationVar.hide (); ftrConfirmationVar.hide ();  function showConfirmation () hdrConfirmationVar.show (); contentConfirmationVar.show (); ftrConfirmationVar.show (); 

Lorsque la page est chargée, seul le contenu principal doit être affiché. Pour cette raison, d'autres pages de contenu sont masquées:

 

Nous verrons comment lier ces fonctions de sélection de contenu aux gestionnaires d'événements ci-dessous..


Étape 4: Soumission du formulaire

Lorsqu'un utilisateur appuie sur le bouton d'envoi, nous devons valider les données du formulaire avant de le soumettre. Pour que les choses restent simples, nous ne ferons que vérifier si tous les champs obligatoires ont été fournis. Si la validation du formulaire est réussie, nous affichons le contenu de la transition, qui consiste en une image spinner avec un court texte informant l'utilisateur que le formulaire est en cours d'envoi. Si la validation échoue, nous affichons le contenu de la boîte de dialogue qui consiste en un avertissement et un bouton OK pour fermer la boîte de dialogue..

Validation du formulaire

Les étiquettes des éléments de formulaire avec des données manquantes seront surlignées en rouge. À cette fin, nous ajoutons une nouvelle classe de style nommée manquante et étendons jQuery Mobile. étiquette classe.

 label.missing color: # FF0000; poids de police: gras; 

Vous trouverez ci-dessous le gestionnaire d'événements pour la soumission de formulaire. En notation jQuery typique, l’identifiant pour formulaire 1 est passé à l'appel d'objet jQuery pour gérer l'événement submit:

 $ ('# form1'). submit (function () var err = false; // Masquer le contenu principal hideMain (); // Réinitialiser les éléments de formulaire mis en évidence précédemment. stateLabelVar.removeClass (MISSING); whatLabelVar.removeClass (MISSING) ; inputMapVar.each (function (index) $ (this) .prev (). removeClass (MISSING);); // // Validation du formulaire inputMapVar.each (function (index) 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 validation échoue, affiche le contenu du dialogue si (err == true) showContentDialog (); renvoie false; // si la validation aboutit, affiche le contenu de la transition showContentTransition (); // soumet le formulaire $ .post ("/ forms / requestProcessor.php ", form1Var.serialize (), fonction (data) confirmationVar.text (data); hideContentTransition (); showConfirmation ();); return false;);

Nous avons défini un drapeau d'erreur sur faux et masquer le contenu principal qui contient le formulaire. Nous réinitialisons ensuite les étiquettes précédemment mises en surbrillance sur chaque membre de la collection. inputMapVar. Pour ce faire, nous passons une fonction inline comme argument à chaque() qui contient simplement $ (this) .prev (). removeClass (MISSING);. Notez que ce est le sélectionné contribution élément et prev () retourne son frère précédent immédiat qui est le étiquette associé avec.

le Etat pour la sélection d'état et quoi pour description de la revendication ne sont pas des champs de texte. Par conséquent, les styles correspondants ont leurs styles réinitialisés séparément.

Une fois que toutes les étiquettes précédemment sélectionnées ont été réinitialisées, nous revisitons les contribution éléments pour vérifier si l'un d'entre eux a une valeur manquante. Si tel est le cas, nous ajoutons la classe manquante à l'étiquette associée au champ de saisie:

 // Validation du formulaire inputMapVar.each (fonction (index) 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; 

De plus, l'indicateur d'erreur est défini sur true et la boîte de dialogue d'erreur s'affiche. La figure ci-dessous montre la boîte de dialogue d'erreur de notre téléphone Android 2.2:

Figure 5. Dialogue d'erreur.

Une fois que l'utilisateur a appuyé sur le bouton OK, la page de formulaire est affichée avec les champs manquants mis en surbrillance, comme illustré ci-dessous. Sur cette image, l'orientation de l'écran du téléphone est horizontale. Notez que chaque étiquette et son champ de texte apparenté sont affichés sur une seule ligne, contrairement à l'orientation verticale de la figure 3, où l'étiquette est au-dessus du champ de texte..

Figure 6. Page de formulaire avec un champ manquant mis en évidence.

D'autre part, si la validation réussit, nous montrons le contenu de la transition et soumettons le formulaire comme indiqué ci-dessous..

Envoi du formulaire via Ajax

La soumission de formulaire utilise jQuery Mobile poster fonction qui accepte trois arguments:

 $ .post ("/ forms / requestProcessor.php", form1Var.serialize (), function (data) …);
  • Le premier argument est l'URL du serveur auquel soumettre le formulaire..
  • Le second est le contenu du formulaire à soumettre. Pour obtenir le contenu du formulaire, nous appelons simplement sérialiser () sur l'objet jQuery en passant l'identifiant de notre formulaire.
  • Le troisième argument est une fonction en ligne pour traiter la réponse, Les données, renvoyé du serveur.

Notez que le poster function effectue un appel Ajax qui est asynchrone par nature. Immédiatement après avoir appelé le poster, L’exécution du programme continuera en renvoyant false à partir du soumettre fonction et utilisateur commenceront à voir le contenu de la transition.

Figure 7. Page de transition affichée pendant le traitement du formulaire.

La fonction en ligne permettant de traiter la réponse est exécutée uniquement lorsque le serveur renvoie sa réponse. Pour plus de simplicité, l’application serveur traitant les données de formulaire, requestProcessor.php, renvoie un identifiant de revendication codé en dur que l'utilisateur peut utiliser pour référence future. Avant d'envoyer l'identifiant de la demande requestProcessor.php, il dort 4 secondes pour émuler le temps de traitement du serveur. C’est pendant cette période que l’application affichera le contenu de la transition.

 

Lorsque la réponse du serveur est reçue, le code du gestionnaire d'événements est exécuté. La première étape consiste à renseigner le envergure tag nommé confirmation avec la valeur renvoyée par le serveur. Ceci est simplement fait avec:

 confirmationVar.text (data);

Ensuite, nous masquons le contenu de la transition et affichons le contenu de la confirmation contenant le envergure tag nommé confirmation:

 

Une nouvelle demande a été créée en fonction des données que vous avez soumises..

Votre numéro de confirmation est:

La page de confirmation affichée sur notre téléphone Android 2.2 est présentée ci-dessous (l'orientation du téléphone est horizontale):

Figure 8. Page de confirmation dans Android 2.2.

La même page de confirmation s’affiche comme suit sur un iPod touch (l’orientation est verticale):

Figure 9. Page de confirmation dans iPod touch.

Déploiement du code source

Le code source du tutoriel a une structure de dossier simple. Toutes les ressources sont stockées dans un dossier nommé formes. Dans ce dossier, il y a deux sous-dossiers, css et img. le css dossier contient couleurs.css, qui a le label.missing classe, et img magasins wait.gif, l'image de spinner. le index.html et requestProcessor.php les fichiers sont directement sous la formes dossier. Lors de nos tests, nous avons utilisé un serveur Web Apache avec la version 2.2.11 exécutant PHP version 5.3.0. Si vous placez le formes dossier directement sous le DocumentRoot du serveur Web, vous pouvez accéder à l'application via http: // [votre_nom_hôte] / dossier / index.html.


Conclusion

Dans ce didacticiel, nous avons introduit les concepts de base du framework jQuery Mobile en mettant l’accent sur la structure de la page, le style de base, les éléments de formulaire et la soumission de formulaire Ajax. Un exemple d’application de traitement des demandes de remboursement a été introduit pour démontrer ces concepts. Nous avons fourni des captures d'écran de différentes pages de l'application exécutée sur un téléphone Android 2.2 et sur un iPod touch avec iOS 4.1. Quelques observations et remarques finales sont données ci-dessous:

  • Puisque jQuery Mobile est construit sur le noyau jQuery, ceux qui ont une connaissance préalable du framework jQuery pourraient se familiariser facilement avec le framework jQuery Mobile..
  • La capacité du framework à représenter plusieurs pages de contenu dans une seule page html avec des fonctions intégrées pour afficher / masquer ces pages de contenu est apparue très pratique pour créer une application de formulaire avec différentes vues dépendant de l'état. Par exemple, cette technique peut être appliquée pour implémenter des guides de l'utilisateur de type "assistant" ou des formulaires d'enquête de plusieurs pages..
  • Testé sur les plates-formes de bureau, Android 2.2 et iOS 4.1, l'aspect et la fonctionnalité ainsi que les aspects fonctionnels de l'exemple d'application étaient cohérents. Pendant le développement, il devrait être possible de tester et de déboguer rapidement les principaux aspects d’une application jQuery Mobile sur une plate-forme de bureau. Des tests supplémentaires peuvent ensuite être effectués sur les périphériques individuels et les navigateurs que l'application devrait prendre en charge..