jQuery Mobile is een relatief nieuw framework voor mobiel internet, met zijn eerste release in oktober 2010. Het framework heeft veel interessante functies om de ontwikkeling van webgebaseerde mobiele applicaties te ondersteunen. In deze tutorial zullen we ons concentreren op enkele basiselementen van jQuery Mobile: paginastructuur, formulieren en Ajax-formulierverzending. De tutorial is gebaseerd op versie 1.0 alpha release 2 van het jQuery Mobile-framework.
Als onderdeel van de tutorial zullen we een kleine B2C-applicatie schrijven. Een pakketverzendbedrijf heeft op zijn website een formulier waarmee klanten informatie kunnen invoeren over pakketten die tijdens verzending verloren of beschadigd zijn. Met behulp van een in de hand gehouden apparaat (bijvoorbeeld een web-enabled telefoon) voert een klant informatie in op het formulier over zijn claim: het verzendnummer van de originele bon, naam / adres en een beschrijving van verlies / beschadiging. Wanneer de klant het formulier verzendt, antwoordt de website met een claim-ID voor verdere tracking. Het scenario wordt weergegeven in het onderstaande schema:
jQuery Mobile-framework ondersteunt een verscheidenheid aan browsers, waaronder iOS-apparaten, Android-apparaten, Blackberry OS 6 en webOS (voor een ondersteunende matrix, zie http://jquerymobile.com/gbs/). De applicatie in deze tutorial is getest tegen een Android 2.2-apparaat en een iOS 4.1-apparaat.
Voordat we ingaan op technische details, laten we het hebben over de belangrijkste overwegingen die het ontwerp van de applicatie sturen.
Uiteraard heeft een typische, real-life toepassing extra of andere ontwerpkwesties. Voor deze tutorial zal onze reikwijdte beperkt zijn tot de bovenstaande overwegingen.
Het grootste deel van de discussie in dit gedeelte is overgenomen van de documentatie op http://jquerymobile.com. Zie de originele referentie voor meer informatie.
jQuery Mobile is een gebruikersinterfacesysteem dat is gebouwd op basis van het populaire JavaScript-framework jQuery. Het bestaat uit elementen van de gebruikersinterface en programmeerconstructies die consistente functionaliteit bieden voor een groot aantal mobiele en desktopwebbrowsers. De principes 'Progressive Enhancement' en 'Graceful Degradation' staan achter het ontwerp. De kernfunctionaliteit van het framework ondersteunt een brede reeks platforms, terwijl nieuwere platforms profiteren van meer uitgebreide functies.
jQuery Mobile heeft een relatief kleine footprint. Omdat de basisconfiguratie van een jQuery Mobile-pagina puur door markup wordt gedaan, is het mogelijk om snelle ontwikkelingscycli te realiseren, vooral als uw toepassing geen complexe programmeerfuncties nodig heeft. Hoewel gebaseerd op jQuery-kern, is het thematiesysteem van jQuery Mobile gebaseerd op een nieuw CSS-raamwerk dat is gericht op het scheiden van kleur en textuur van structurele stijlen die zaken als opvulling en dimensies definiëren. Een API voor het verwerken van gebeurtenissen verwerkt op focus gebaseerde gebruikersinvoermethoden op een uniforme manier met touch, muis en cursor.
jQuery Mobile komt uit de doos met veel elementen van de gebruikersinterface, zoals werkbalken in de kop- en voettekst, knoppen met pictogrammen, formulierelementen (inclusief aanraakgevoelige schuifregelaar en schakelaars) en lijsten. Eenvoudige HTML-stijlen, roosters met twee of drie kolommen en inklapbare elementen zijn ook aanwezig.
Vanaf release jQuery Mobile 1.0 alpha 2 moeten de volgende stylesheets en JavaScript-bibliotheken worden opgenomen in uw HTML-pagina's. U kunt ze verwijzen zoals hieronder of serveer ze vanaf uw eigen server:
Laten we de basisstructuur van een pagina in jQuery Mobile introduceren. Een pagina in jQuery Mobile-framework kan een enkele pagina of een lokale interne gekoppelde 'pagina' binnen een pagina zijn. Een 'container'-pagina bevat een of meer' inhoudspagina's '. De grens van een containerpagina is als volgt gedefinieerd:
...
Merk op dat de waarde van de data-rol
kenmerk is pagina
. Aan de andere kant is de grens van een inhoudspagina als volgt gedefinieerd:
...
Merk op dat de waarde van de data-rol
kenmerk is inhoud
.
Een inhoudspagina kan een bijbehorende kop- en voettekst bevatten. Als voorbeeld kan een containerpagina met verschillende inhoudspagina's de volgende structuur hebben:
.....................
Wanneer een containerpagina is geladen, zijn alle inhoudspagina's daarin zichtbaar. In onze applicatie moeten we slechts één inhoud per keer weergeven. Daarom moeten we programmatisch bepalen welke inhoud wordt weergegeven, afhankelijk van de context.
Gebruik de jQuery Mobile API om een element te verbergen verbergen()
functie:
$ ( '# HdrMain') te verbergen ().;
zal de header verbergen met ID kaart
hdrMain
. Hier hebben we de jQuery ID-selector gebruikt door te geven ID kaart
van het element dat we willen selecteren, voorafgegaan door #
teken. Omgekeerd, de laten zien()
functie toont een verborgen element:
$ ( '# HdrMain') geven (.);
De Onze demo-applicatie bestaat uit een enkele html-pagina, Contentovergangen worden weergegeven in het onderstaande schema: Aanvullende opmerkingen over de codelijst hierboven: Ons claimformulier bestaat uit de volgende velden: Laten we als voorbeeld het tekstveld voor verzendnummer bekijken: We gebruikten een Zoals we later zullen zien, zal deze speciale naamgevingsconventie ons helpen ontbrekende velden te ontdekken tijdens het indienen van formulieren. Een ander opvallend vormelement is de De formulierpagina zoals weergegeven in een Android 2.2-telefoon wordt hieronder weergegeven. De gebruiker zal door de pagina bladeren om toegang te krijgen tot de elementen in het formulier: Hetzelfde formulier wordt weergegeven op een iPod touch met iOS 4.1: We zullen verwijzen naar verschillende elementen op de html-pagina in onze code. Het is logisch om die verwijzingen slechts één keer te definiëren en ze opnieuw te gebruiken als dat nodig is. Om deze reden declareren we globaal gebruikte variabelen evenals constanten in de Toewijzingen van die variabelen worden gedaan in jQuery Laten we nu eens kijken naar de inhoudselectiefuncties die door event handlers worden genoemd. Voor het verbergen en weergeven van de hoofdinhoud en de koptekst / voettekst gebruiken we de Voor het verbergen en weergeven van de overgangsinhoud gebruiken we de Voor het verbergen en weergeven van de dialooginhoud gebruiken we de Om de inhoud van de bevestiging en de koptekst / voettekst te verbergen en weer te geven, gebruiken we de Wanneer de pagina is geladen, moet alleen de hoofdinhoud worden weergegeven. Om deze reden zijn andere inhoudspagina's verborgen: We bespreken hoe je die functies voor inhoudselectie kunt koppelen aan de onderstaande gebeurtenishandlers. Wanneer een gebruiker op de verzendknop drukt, moeten we de formuliergegevens valideren voordat het formulier daadwerkelijk wordt ingediend. Om het eenvoudig te houden, controleren we alleen of alle vereiste velden zijn opgegeven. Als formuliervalidatie succesvol is, geven we de overgangsinhoud weer die bestaat uit een spinnerafbeelding met een korte tekst waarin de gebruiker wordt geïnformeerd dat zijn formulier wordt verzonden. Als de validatie mislukt, tonen we de dialooginhoud die bestaat uit een waarschuwing en een OK-knop om het dialoogvenster te sluiten. Labels van de formulierelementen met ontbrekende gegevens worden rood gemarkeerd. Voor dit doel voegen we een nieuwe stijlklasse toe met de naam missing en extend the jQuery Mobile Hieronder ziet u de gebeurtenishandler voor het indienen van formulieren. In de typische jQuery-notatie, de identifier voor We hebben een foutmarkering ingesteld op De Nadat alle eerder gemarkeerde labels zijn gereset, gaan we terug naar de vereiste Bovendien is de foutmarkering ingesteld op true en wordt het foutdialoogvenster weergegeven. De onderstaande figuur toont het foutdialoogvenster in onze Android 2.2-telefoon: Nadat de gebruiker op de knop OK heeft gedrukt, wordt de gebruiker de formulierpagina met de ontbrekende velden gemarkeerd weergegeven, zoals hieronder wordt weergegeven. In die afbeelding is de oriëntatie van het telefoonscherm horizontaal. Houd er rekening mee dat elk label en het tekstveld van de broer of zus in één regel worden weergegeven in tegenstelling tot de verticale richting in afbeelding 3, waar het label zich boven het tekstveld bevindt. Aan de andere kant, als validatie succesvol is, tonen we de overgangsinhoud en verzenden we het formulier zoals hieronder besproken. Het indienen van het formulier maakt gebruik van de jQuery Mobile Merk op dat de De in-line functie om het antwoord te verwerken, wordt alleen uitgevoerd wanneer de server antwoord geeft. Voor de eenvoud, de servertoepassing die de formuliergegevens verwerkt, Wanneer het serverantwoord wordt ontvangen, wordt de gebeurtenishandlercode uitgevoerd. De eerste stap is het invullen van de Vervolgens verbergen we de Transition-inhoud en tonen we de inhoud van de bevestiging die de inhoud bevat Er is een nieuwe claim gemaakt op basis van gegevens die u heeft ingediend. Uw bevestigingsnummer is: De bevestigingspagina die wordt weergegeven in onze Android 2.2-telefoon, wordt hieronder weergegeven (de richting van de telefoon is horizontaal): Dezelfde bevestigingspagina wordt als volgt op een iPod touch weergegeven (oriëntatie is verticaal): De broncode voor de zelfstudie heeft een eenvoudige mapstructuur. Alle bronnen worden opgeslagen in een map met de naam In deze tutorial introduceerden we basisbegrippen uit het jQuery Mobile-framework met focus op paginastructuur, basisstyling, formulierelementen en Ajax-formulierinzending. Een voorbeeld van een applicatie voor het verwerken van claims werd geïntroduceerd om deze concepten te demonstreren. We hebben schermafdrukken gemaakt van verschillende pagina's van de applicatie die werd uitgevoerd in een Android 2.2-telefoon en een iPod touch-apparaat met iOS 4.1. Enkele opmerkingen en slotopmerkingen worden hieronder gegeven:verbergen()
en laten zien()
functies zijn van toepassing op elementen van veel verschillende typen, in het bijzonder, (
-tags). In deze tutorial zullen we gebruiken verbergen()
en laten zien()
functies uitgebreid weergeven om alleen de relevante context voor de toepassingsgebruiker weer te geven. Hieronder worden meer details gegeven.
Stap 1: Demo-paginastructuur van de toepassing
index.html
, die bestaat uit een containerpagina zoals hieronder getoond:
data-theme
kenmerk stelt ons in staat om te kiezen uit beschikbare stijlen in het jQuery Mobile-framework: a, b, c, d, e,
elk biedt een consistente reeks kleuren voor verschillende elementen op de pagina. Voor onze toepassing hebben we de kleur gekozen die overeenkomt met b
. data-nobackbtn = "true"
.Formulierelementen
invoer
velden van het type tekst: verzendnummer, voornaam, achternaam, e-mail, telefoon, straatnaam, stad en postcode. Alle velden zijn verplicht, behalve Telefoon.kiezen
element voor Staat. dit is een verplicht veld.textarea
element voor een gebruiker om informatie over de ontbrekende of beschadigde zending in te voeren. dit is een verplicht veld.
label
met een voor
attribuut waarvan de waarde gelijk is aan de ID kaart
van de invoer
element het label
is gekoppeld aan. Verder hebben we de label
en invoer
in een div
met data-rol
attribuut gewaardeerd als fieldcontain
. jQuery Mobile-framework gebruikt de fieldcontain
attribuutwaarde voor speciale styling. Bekijk bovendien name = "shipNo_r"
. Voor deze specifieke toepassing hebben we besloten om de waarde van de te definiëren naam
attribuut van een vereist formulierelement als de waarde van de ID kaart
attribuut toegevoegd door _r. Als het element niet vereist is, is de waarde van de naam
attribuut zal hetzelfde zijn als de waarde van de ID kaart
attribuut. Omdat Phone bijvoorbeeld geen verplicht veld is, wordt het als volgt gedefinieerd:
kiezen
element. Vergelijkbaar met het bovenstaande, de waarde van de voor
attribuut is hetzelfde als de id van de kiezen
element het label
is gekoppeld aan. Ook de label
en kiezen
zijn ingepakt in een div
met de data-rol
attribuutwaarde als de fieldcontain
. Met de lange lijst met opties die we in deze toepassing hebben, zal jQuery Mobile framework de lijst openen op een nieuwe pagina wanneer de gebruiker zich richt op de kiezen
element.
Stap 2: Variabele definities
hoofd
deel van de pagina:
$ (Document) .ready ()
functie met ID selectors, zoals hieronder getoond. (Herinner dat jQuery $ (Document) .ready ()
functie wordt aangeroepen wanneer de volledige DOM-hiërarchie op de pagina is geladen. Die functie is de beste locatie om onze variabelen te initialiseren.) We definiëren ook inputMapVar
als een verzameling bestaande uit allemaal invoer
elementen met _r
in hun naam
attribuut (de functie-aanroep $ ( 'Input [* name = "_ r"])
selecteert al dergelijke elementen).
Stap 3: functies voor inhoudselectie
hideMain ()
en showMain ()
functies: function hideMain () hdrMainVar.hide (); contentMainVar.hide (); ftrMainVar.hide (); function showHain () hdrMainVar.show (); contentMainVar.show (); ftrMainVar.show ();
hideContentTransition ()
en showContentTransition ()
functies: function hideContentTransition () contentTransitionVar.hide (); function showContentTransition () contentTransitionVar.show ();
hideContentDialog ()
en showContentDialog ()
functies: function hideContentDialog () contentDialogVar.hide (); function showContentDialog () contentDialogVar.show ();
hideConfirmation ()
en showConfirmation ()
functies: function hideConfirmation () hdrConfirmationVar.hide (); contentConfirmationVar.hide (); ftrConfirmationVar.hide (); function showConfirmation () hdrConfirmationVar.show (); contentConfirmationVar.show (); ftrConfirmationVar.show ();
Stap 4: Formulierverzending
Formuliervalidatie
label
klasse. label.missing color: # FF0000; font-weight: bold;
formulier 1
wordt doorgegeven aan de object-aanroep jQuery om de verzendgebeurtenis af te handelen: $ ('# form1'). submit (function () var err = false; // Verberg de hoofdinhoud hideMain (); // Reset de eerder gemarkeerde formulierelementen stateLabelVar.removeClass (MISSING); whatLabelVar.removeClass (MISSING) ; inputMapVar.each (function (index) $ (this) .prev (). removeClass (MISSING);); // Voer formuliervalidatie-invoer uitMapVar.each (functie (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; / / Als de validatie mislukt, toon dan de inhoud van het dialoogvenster als (err == true) showContentDialog (); return false; // Als de validatie is geslaagd, toon dan Transition content showContentTransition (); // Dien het formulier $ .post ("/ forms / in requestProcessor.php ", form1Var.serialize (), function (data) confirmationVar.text (data); hideContentTransition (); showConfirmation ();); return false;);
vals
en verberg de hoofdinhoud die het formulier bevat. Vervolgens resetten we de eerder gemarkeerde labels op elk lid van de verzameling inputMapVar
. Om dat te doen, geven we een inline-functie door als argument voor elk()
dat bevat gewoon . $ (This) .prev () removeClass (ontbrekende);
. Let daar op deze
is de geselecteerde invoer
element en prev ()
geeft de onmiddellijke vorige broer of zus terug die de. is label
geassocieerd.staat
voor selectie van de status en wat
voor claimbeschrijving zijn geen tekstvelden. Daarom hebben de bijbehorende labels hun stijlen afzonderlijk gereset.invoer
elementen om te controleren of een van deze een ontbrekende waarde heeft. Als dat het geval is, voegen we de ontbrekende klasse toe aan het label dat is gekoppeld aan het invoerveld: // Voer formuliervalidatie-invoer uitMapVar.each (functie (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;
Het indienen van het formulier via Ajax
post
functie die drie argumenten accepteert: $ .post ("/ forms / requestProcessor.php", form1Var.serialize (), function (data) ...);
serialize ()
op het jQuery-object door het de ID voor ons formulier door te geven.gegevens
, teruggestuurd vanaf de server.post
functie voert een Ajax-oproep uit die van nature asynchroon is. Onmiddellijk na het bellen van de post
, programma-uitvoering zal doorgaan met het retourneren van false van de voorleggen
functie en gebruiker zullen de Transition-inhoud gaan zien.requestProcessor.php
, geeft een hardcoded claim-id terug die de gebruiker kan gebruiken voor toekomstig gebruik. Voordat u de claim-id verzendt requestProcessor.php
, het slaapt 4 seconden om de verwerkingstijd van de server te emuleren. Het is in deze periode dat de applicatie de Transition-inhoud weergeeft.
span
tag met de naam bevestiging
met de waarde die wordt geretourneerd door de server. Dit is gewoon gedaan met: confirmationVar.text (data);
span
tag met de naam bevestiging
:
De broncode implementeren
vormen
. In die map zijn er twee submappen, css
en img
. De css
map bevat colors.css
, welke heeft de label.missing
klasse, en img
winkel wait.gif
, de spinner afbeelding. De index.html
en requestProcessor.php
bestanden staan direct onder de vormen
map. In onze testen hebben we een Apache-webserver gebruikt met versie 2.2.11 met PHP-versie 5.3.0. Als u de vormen
map direct onder de DocumentRoot
van de webserver kunt u de toepassing openen via http: // [your_host_name] /folder/index.html.
Conclusie