Ontwikkeling van mobiele platforms. JQuery mobiel formulier

Probleem

U heeft een kostenberekeningsrapport gedownload en wilt dit aan het management laten zien. Om dit te doen, moet u de gegevens van boekhoudkundige posten verzamelen - volgens managementboekhoudkundige posten. Je weet hoe boekhouding en boekhoudkundige artikelen zich tot elkaar verhouden, maar het handmatig opstellen van zo'n rapport kost je telkens te veel tijd.

Oplossing

We zullen het overwegen deze zaak als vervolg op de vorige. Laten we ons voorstellen dat u de volgende map in Excel hebt gemaakt:

Afb.2.1. Directory: mapping van BU- en CU-artikelen


Links staat een kostenpost (AC), rechts een management accounting post (MA). Het is belangrijk dat de kostenpost slechts één keer in de eerste kolom voorkomt, anders werkt het mappingmechanisme niet correct.

(Overigens wordt het Engelse woord mapping vertaald als display of correspondentie, dus het naslagwerk in in dit geval- dit is iets algemene regel hoe BU-artikelen worden weerspiegeld in OU-artikelen).

Afb.2.2. Platte tabel: kostenrapport (uit "Rekeningomzet 20")


Houd er rekening mee dat in de 7e kolom de kolom “Artikel TC” is verschenen. Tegenover elke kostenpost hebben wij een management accounting post geplaatst. Dit kan handmatig worden gedaan, maar het is veel handiger om deze tool te gebruiken:

Afb.2.3. Platte tabel: kostenrapport (uit "Rekeningomzet 20")


Onderaan het formulier staan ​​de namen van de pagina's: “Home” is een platte tabel die kostengegevens bevat (Fig. 2.2), “spr” is een naslagwerk (Fig. 2.1).

De kolomnummers staan ​​bovenaan het formulier aangegeven. Dus als in dit geval de gegevens in kolom 1 van de directory en kolom 3 van de hoofdpagina samenvallen, worden de gegevens uit de tweede kolom van de directory gekopieerd naar de zevende kolom van de hoofdpagina.

In deze vorm zijn er ook veel toegevoegde opties. U kunt bijvoorbeeld de selectievakjes “Kenmerk #2” en “Kenmerk #3” inschakelen en vervolgens gegevens overbrengen van kolom 2 van de map naar kolom 7 van de hoofdpagina is mogelijk als de map en de hoofdpagina overeenkomen met twee of zelfs drie details tegelijk.

Als resultaat van een dergelijke eenvoudige bediening met behulp van draaitabel kan worden gebouwd hele lijn diverse analytische rapporten, waarin een van de secties de analist “Artikel UU” zal bevatten. Bijvoorbeeld zoals dit:

Afb.2.4. Kostenrapport voor wapeningswinkel


Vergelijking van mapping met VLOOKUP()

Veel gebruikers zijn bekend met en gebruiken de functie VERT.ZOEKEN() in dit soort situaties. De functie VERT.ZOEKEN() werkt echter alleen goed op kleine volumes gegevens, terwijl deze vorm kan goed overweg met het verwerken van Excel-tabellen, zelfs als u bijvoorbeeld 5.000 rijen in het naslagwerk en 300.000 rijen op de goav-pagina hebt. Probeer het te controleren en u zult zien dat VLOOKUP() mislukt op dergelijke volumes. Bovendien zorgt de functie VERT.ZOEKEN() voor een aanzienlijke belasting van Excel, waardoor het grote hoeveelheden berekeningen moet uitvoeren. Het mappingformulier vermijdt dit nadeel: het wordt één keer uitgevoerd, duurt een paar seconden (voor grote hoeveelheden minuten) en dan geen extra ladingen het Excel-bestand wordt niet langer aangemaakt.


Deel 3: Gegevens uit een tabel weergeven (LIST-bewerking)

In het vorige deel hebben we gekeken naar de soorten relaties (één-op-één, één-op-veel, veel-op-veel), evenals naar één klasse Book en de bijbehorende kaartklasse BookMap. In het tweede deel zullen we de klasse Book bijwerken, de resterende klassen en verbindingen daartussen creëren, zoals werd afgebeeld in het vorige hoofdstuk in het databasediagram boven de subkop 1.3.1 Relaties.

Code van klassen en mappings (met commentaar)

Klasseboek

Openbare klasse Boek ( //Unieke identificatie public virtual int Id ( get; set; ) // Titel public virtual string Naam ( get; set; ) // Beschrijving public virtual string Beschrijving ( get; set; ) // Beoordeling van de wereld of Fiction public virtual int MfRaiting ( get; set; ) //Paginanummers public virtual int PageNumber ( get; set; ) //Link naar de afbeelding public virtual string Image (get; set; ) // Datum van aankomst van het boek (filter door nieuwe items!) public virtual DateTime IncomeDate ( get; set; ) //Genre (Many-to-Many) //Waarom ISet en niet IList? Er kan slechts één collectie (IList) worden geselecteerd met behulp van JOIN fetch, als er meer dan één is collectie nodig is voor het ophalen van JOIN, dan is het beter om ze om te zetten in een openbare virtuele ISet-verzameling Genres (get; set; ) //Series (veel-op-één) publieke virtuele Series Series (get; set; ) //Opinie en andere (één-op-één) privé Mind _mind; publieke virtuele Mind Mind (get ( return _mind ?? (_mind = new Mind()); ) set ( _mind = waarde; ) ) //Auteur (Many-to-many) publieke virtuele ISet Auteurs ( get; set; ) // Initialiseer vooraf zodat er geen nuluitzondering optreedt. public Book() ( //Ongeordende set (één tabel kan niet twee exact identieke rijen hebben, anders wordt er één geselecteerd en de andere genegeerd) Genres = new HashSet (); Auteurs = nieuwe HashSet (); ) ) // Mapping class Boek openbare klasse BookMap: ClassMap ( public BookMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.Description); Map(x => x.MfRaiting); Map(x = > x.PageNumber); Map(x => x.Image); Map(x => x.IncomeDate); //Veel-op-veel-relatie HasManyToMany(x => x.Genres) //Cascading-regels Alles - Wanneer het object wordt opgeslagen, bijgewerkt of verwijderd, alle afhankelijke objecten worden gecontroleerd en //created/updated/added.Cascade.SaveUpdate() //De naam van de tussenliggende tabel MOET hetzelfde zijn als de klasse Genre .Table("Book_Genre" ); > x.Authors) .Cascade.SaveUpdate() .Table("Book_Author"); // Veel-op-één-relatie Referenties (x => x.Series); // Eén-op-één-relatie HasOne (x . => x.Mind).Cascade.All().Beperkt();

Openbare klasse Auteur ( public virtual int Id ( get; set; ) //Naam-Achternaam public virtual string Naam ( get; set; ) //Biografie public virtual string Biografie ( get; set; ) //Boeken public virtual ISet Boeken ( get; set; ) // Auteurs initialiseren public Author() ( Books=new HashSet (); ) ) // Auteur Mapping openbare klasse AuthorMap: ClassMap ( public AuthorMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.Biography); //Veel-op-veel-relatie HasManyToMany(x => x .Books) //Cascaderegels Alles - Wanneer een object wordt opgeslagen, bijgewerkt of verwijderd, worden alle afhankelijke objecten gecontroleerd en gemaakt/bijgewerkt/toegevoegd.Cascade.All() //De eigenaar van de verzameling is het andere uiteinde van de relatie (Book) en deze wordt eerst opgeslagen. Inverse() //De naam van de tussenliggende tabel MOET hetzelfde zijn als de klasse Book!

Klasse-genre

Publieke klasse Genre ( public virtual int Id ( get; set; ) // Genrenaam public virtual string Naam ( get; set; ) // Engelse naam genre public virtual string EngName (get; set; ) //Boeken publieke virtuele ISet Boeken (get; set; ) //Initialiseren van boeken public Genre() ( Books=new HashSet (); ) ) //Genre mapping openbare klasse GenreMap: ClassMap ( public GenreMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.EngName); //Veel-op-veel-relatie HasManyToMany(x => x .Books) //Cascaderegels Alles - Wanneer een object wordt opgeslagen, bijgewerkt of verwijderd, worden alle afhankelijke objecten gecontroleerd en gemaakt/bijgewerkt/toegevoegd.Cascade.All() //De eigenaar van de verzameling is het andere uiteinde van de relatie (Book) en deze wordt eerst opgeslagen. Inverse() //De naam van de tussenliggende tabel MOET hetzelfde zijn als de klasse Book!

Klasse mening:

Publieke klasse Mind ( public virtual int Id ( get; set; ) // Mijn mening publieke virtuele string MyMind ( get; set; ) // Fantlab's mening publieke virtuele string MindFantLab ( get; set; ) // Boek publieke virtuele Boek Boek ( get; set; ) ) //Publieke klasse MindMap:ClassMap in kaart brengen ( public MindMap() ( Id(x => x.Id); Map(x => x.MyMind); Map(x => x.MindFantLab); //Eén-op-één relatie HasOne(x => x .Boek ); ) )

Klassecyclus (serie):

Public class Series ( public virtual int Id ( get; set; ) public virtual string Name ( get; set; ) //Ik heb een IList gemaakt, geen ISet, omdat Series, behalve Book, aan niets anders is gekoppeld, ook al kan doen en ISet openbare virtuele IList Boeken ( get; set; ) // Boeken initialiseren. public Series() ( Boeken = nieuwe lijst (); ) ) openbare klasse SeriesMap: ClassMap ( public SeriesMap() ( Id(x => x.Id); Map(x => x.Name); //Een-op-veel-relatie HasMany(x => x.Books) ////Eigenaar van de collection aan het andere uiteinde van de relatie (Boek) en wordt eerst opgeslagen.

Een kleine uitleg
openbare virtuele ISet Genres(krijgen;instellen;)
openbare virtuele ISet Auteurs (krijgen; instellen; )

Waarom ISet , en niet bijvoorbeeld de voor velen bekende IList ? Als we IList gebruiken in plaats van ISet en proberen het project uit te voeren, zullen we niet veel verschil merken (er worden tabellen en klassen gemaakt). Maar wanneer we tegelijkertijd de tabellen Genre en Authors aan de klasse Book LeftJoin toevoegen, en we ook proberen niet-herhalende records uit de tabel Book (Distinct Book.Id) in een weergave (View) weer te geven, zal Nhibernate een uitzondering en een fout.
Het is niet mogelijk om meerdere tassen tegelijkertijd op te halen.
In dergelijke gevallen gebruiken we ISet, vooral omdat sets hiervoor bedoeld zijn (ze negeren dubbele records).

Veel-op-veel-relatie.

NHibernate heeft het concept van een “hoofdtabel”. Hoewel de veel-op-veel-relatie tussen de tabellen Boek en Auteur gelijkwaardig is (een auteur kan veel boeken hebben, een boek kan veel auteurs hebben), vereist Nhibernate dat de programmeur de tabel specificeert die als tweede wordt opgeslagen (heeft een methode. inverse). ()), dat wil zeggen dat er eerst een record wordt gemaakt/bijgewerkt/verwijderd in de tabel Boek, en pas daarna in de tabel Auteur.
Cascade.All betekent het uitvoeren van trapsgewijze bewerkingen bij het opslaan, bijwerken en verwijderen. Dat wil zeggen dat wanneer een object wordt opgeslagen, bijgewerkt of verwijderd, alle afhankelijke objecten worden gecontroleerd en gemaakt/bijgewerkt/toegevoegd (Ps. Kan worden geschreven in plaats van Cascade.All -> .Cascade.SaveUpdate().Cascade.Delete())
Method.Table("Boek_Auteur"); creëert een “tussenliggende” tabel “Book_Author” in de database.

Veel-op-één, één-op-veel-relatie.

De.Constrained() methode vertelt NHibernate dat een record uit de Book-tabel moet overeenkomen met een record uit de Mind-tabel (de id van de Mind-tabel moet gelijk zijn aan de id van de Book-tabel)

Als u nu het project uitvoert en naar de Bibilioteca-database kijkt, verschijnen er nieuwe tabellen met reeds gevormde verbindingen.

Vul vervolgens de gemaakte tabellen met gegevens...
Om dit te doen, zullen we een testapplicatie maken die gegevens in de database opslaat, bijwerkt en verwijdert, waarbij we de HomeController als volgt wijzigen (we geven commentaar op onnodige delen van de code):
public ActionResult Index() ( met (ISession-sessie = NHibernateHelper.OpenSession()) ( met (ITransaction-transactie = session.BeginTransaction()) ( //Create, add var createBook = new Book(); createBook.Name = "Metro2033" ; createBook.Description = "Post-apocalyptische mystiek"; createBook.Authors.Add(nieuwe auteur (Naam = "Glukhovsky" )); createBook.Genres.Add(nieuw genre (Naam = "Post-apocalyptische mystiek" )); (Naam = "Metro"); createBook.Mind = nieuwe geest (MyMind = "Post-apocalyptische mystiek"); (1); //var updateBook = sessie.Get (1); //updateBook.Name = "Metro2034"; //updateBook.Description = "Dystopie"; //updateBook.Authors.ElementAt(0).Name = "Glukhovsky"; //updateBook.Genres.ElementAt(0).Name = "Dystopie"; //updateBook.Series = serie; //updateBook.Mind.MyMind = "11111"; //sessie.SaveOrUpdate(updateBook); //Verwijderen (op ID) //var deleteBook = session.Get

Een kleine uitleg

  1. (1); () //sessie.Verwijderen(verwijderboek); transactie.Commit(); ) Genre-genreAl = nul; Auteur auteurAl = null; Serie serieAl = nul; Geest geestAl = nul; var boeken = sessie.QueryOver;
  2. () //Left Join met tabel Genres .JoinAlias(p => p.Genres, () => .JoinAlias(p => p.Authors, () => auteurAl, JoinType.LeftOuterJoin) .JoinAlias(p => p .Series, () => seriesAl, JoinType.LeftOuterJoin) .JoinAlias(p => p.Mind, () => mindAl, JoinType.LeftOuterJoin) // Verwijder dubbele tabel-id-nummers Book.TransformUsing (Transformers.DistinctRootEntity List). (); retourweergave(boeken); var boeken = sessie.QueryOver
    Selecteer * Uit boek
    .JoinAlias(p => p.Genres, () => genreAl, JoinType.LeftOuterJoin)
    - vergelijkbaar met het uitvoeren van een SQL-script:
  3. .TransformUsing(Transformers.DistinctRootEntity)- Vergelijkbaar met het uitvoeren van een SQL-script: SELECTEER verschillende Book.Id..., (verwijdert dubbele records met dezelfde ID)

Soorten verenigingen
() //Left Join met tabel Genres .JoinAlias(p => p.Genres, () => .JoinAlias(p => p.Authors, () => auteurAl, JoinType.LeftOuterJoin) .JoinAlias(p => p .Series, () => seriesAl, JoinType.LeftOuterJoin) .JoinAlias(p => p.Mind, () => mindAl, JoinType.LeftOuterJoin) // Verwijder dubbele tabel-id-nummers Book.TransformUsing (Transformers.DistinctRootEntity List). (); retourweergave(boeken);

  1. LeftOuterJoin - selecteert alle records uit de linkertabel ( Boek), en voegt er vervolgens de juiste tabelrecords aan toe ( Genre). Als een overeenkomstige vermelding niet in de rechtertabel wordt gevonden, wordt deze weergegeven als Null
  2. RightOuterJoin is het tegenovergestelde van LEFT JOIN: het selecteert alle records uit de rechtertabel ( Genre), en voegt er vervolgens de linkertabelrecords aan toe ( Boek)
  3. InnerJoin - selecteert alleen die records uit de linkertabellen ( Boek) met een overeenkomstige vermelding uit de rechtertabel ( Genre), en voegt ze vervolgens samen met records uit de rechtertabel

Laten we de weergave als volgt wijzigen:

Indexweergave

@model IEnumerabel @( Indeling = nul; ) Inhoudsopgave

@Html.ActionLink("Nieuwe maken", "Aanmaken")

@foreach (var-item in model) ( @(string strSeries = item.Series != null ? item.Series.Name: null;) }
@Html.DisplayNameFor(model => model.Naam) @Html.DisplayNameFor(model => model.Mind) @Html.DisplayNameFor(model => model.Series) @Html.DisplayNameFor(model => model.Auteurs) @Html.DisplayNameFor(model => model.Genres) Activiteiten
@Html.DisplayFor(modelItem => item.Naam) @Html.DisplayFor(modelItem => item.Mind.MyMind)@Html.DisplayFor(modelItem => strSeries) @foreach (var auteur in item.Authors) ( string strAuthor = auteur != null ? auteur.Naam: null; @Html.DisplayFor(modelItem => strAuthor)
}
@foreach (var genre in item.Genres) ( string strGenre = genre!= null ? genre.Name: null; @Html.DisplayFor(modelItem => strGenre)
}
@Html.ActionLink("Bewerken", "Bewerken", new ( id = item.Id )) | @Html.ActionLink("Details", "Details", new ( id = item.Id )) | @Html.ActionLink("Verwijderen", "Verwijderen", new ( id = item.Id ))


Nadat we alle bewerkingen één voor één hebben gecontroleerd, zullen we merken dat:
  • Tijdens de bewerkingen Aanmaken en Bijwerken worden alle gegevens die aan de Boekentabel zijn gekoppeld bijgewerkt (verwijder Cascade=”save-update” of cascade==all” en de bijbehorende gegevens worden niet opgeslagen)
  • Bij het verwijderen worden gegevens verwijderd uit de tabellen Book, Mind en Book_Author, maar de resterende gegevens worden niet verwijderd omdat ze Cascade="save-update" hebben

Toewijzing voor klassen met overerving.
Hoe klassen met overerving in kaart brengen? Laten we zeggen dat we dit voorbeeld hebben:
//Klasse van tweedimensionale vormen public class TwoDShape ( //Breedte public virtual int Breedte ( get; set; ) // Hoogte public virtual int Height ( get; set; ) ) // Klasse Triangle public class Triangle: TwoDShape ( / / Een identificatienummer public virtual int Id ( get; set; ) //Type driehoek public virtual string Style ( get; set; ) )

In principe is er niets ingewikkelds aan deze mapping; we zullen eenvoudigweg één mapping maken voor de afgeleide klasse, dat wil zeggen de Triangle-tabel.
//Triangle mapping openbare klasse TriangleMap: ClassMap ( public TriangleMap() ( Id(x => x.Id); Kaart(x => x.Stijl); Kaart(x => x.Hoogte); Kaart(x => x.Width); ) )
Na het starten van de applicatie verschijnt de volgende (lege) tabel in de Biblioteca-database

Tags: tags toevoegen

Dit artikel is een aankondiging van nieuwe functionaliteit.
Het wordt niet aanbevolen om de inhoud van dit artikel te gebruiken om nieuwe functionaliteit te leren.
Volledige beschrijving nieuwe functionaliteit zal worden geboden in de documentatie voor de overeenkomstige versie.
Volledige lijst met wijzigingen in nieuwe versie wordt geleverd in het bestand v8Update.htm.

Geïmplementeerd in versie 8.3.11.2867.

We blijven het mobiele platform ontwikkelen en voegen functionaliteit toe die al beschikbaar is op het platform persoonlijke computers. Daarnaast ontwikkelen we specifieke platformmogelijkheden die alleen relevant zijn voor mobiele apparaten. We zullen u nu vertellen over enkele van de belangrijkste verbeteringen.

Planner

Het objectmodel van de “mobiele” planner is niet veranderd, maar de manieren waarop de gebruiker met de planner communiceert zijn veranderd, aangezien de methoden voor het invoeren van informatie op mobiele toestellen verschillen van die gebruikt in desktopcomputers.

Bijvoorbeeld, snel bewerken element wordt uitgevoerd door een enkele klik op het element. Als u lang drukt, wordt het contextmenu weergegeven en verschijnen er markeringen waarmee u het element kunt uitrekken. Slepen doe je door lang te drukken en vervolgens je vinger te bewegen.

Door de hele planner scrollen doe je door met één vinger te scrollen, te zoomen met twee vingers, enzovoort.

Een kenmerk van de huidige implementatie van de “mobiele” planner is dat deze nog geen ondersteuning biedt voor afdrukken.

Opgemaakt document

Een ander “nieuw” object dat we aan het mobiele platform hebben toegevoegd is Opgemaakt document. Vanuit het oogpunt van de gebruiker verschilt een “mobiel” geformatteerd document alleen doordat het bewerkingspaneel in de besturing zelf is ingebouwd en een logisch onderdeel is van het virtuele toetsenbord. U als ontwikkelaar bent niet verplicht deze apart aan de configuratie toe te voegen. Het bewerkingspaneel ziet er anders uit, afhankelijk van het type mobiel apparaat (telefoon of tablet).

Preview van het “mobiele” formulier in de configurator

In de configurator hebben we bij het ontwikkelen van een formulier de mogelijkheid toegevoegd om te zien hoe uw formulier er op een mobiel apparaat uit zal zien.

In het opdrachtpaneel kunt u een interface-optie selecteren Mobiel apparaat en kijk hoe het formulier er in de standaardoriëntatie uit zal zien.

Hier kunt u uw mobiele apparaat draaien.


Daarnaast hebben wij u de mogelijkheid gegeven om uit te kiezen groot nummer gemeenschappelijke apparaten.


Bovendien kunt u mobiele formulieren in drie verschillende schalen bekijken:

  • Pixel tot pixel- wanneer een schermpixel van een mobiel apparaat overeenkomt met een vensterschermpixel voorbeeld;
  • Daadwerkelijke grootte - wanneer de grootte van het mobiele apparaat op het scherm overeenkomt met de geometrische afmetingen van het apparaat;
  • Op raamgrootte- wanneer de weergaveschaal zo is geselecteerd dat het “mobiele” weergavegebied in het voorbeeldvenster past zonder te scrollen.

Batchverwerking van spreadsheetdocumenten

We hebben een aantal nieuwe objecten aan het mobiele platform toegevoegd waarmee u pakketten van weergegeven documenten kunt maken. Deze functionaliteit is vergelijkbaar met die op het pc-platform. Zo kunt u nu bijvoorbeeld meerdere documenten tegelijk versturen om af te drukken.

Ontwikkeling van te leveren meldingen

We hebben ondersteuning geïmplementeerd voor de Windows Push Notification Service (WNS, Windows Notification Services). Nu kunt u de functionaliteit van geleverde meldingen gebruiken bij het uitvoeren van een mobiele applicatie op platforms van de Windows-familie.

We hebben ook het foutafhandelingssysteem voor het verzenden van afgeleverde meldingen herwerkt. In situaties waarin een fout eerder als uitzondering werd gegenereerd, wordt deze nu gegenereerd als een waarde die u in de ingebouwde taal kunt verwerken.

Hardwareversnelling in het Android-besturingssysteem

Op versies van het Android-besturingssysteem 4.4.2 en hoger maakt het mobiele platform nu gebruik van hardwareversnelling. Hierdoor konden we de renderingsnelheid van de interface met 1,5 – 3 keer verhogen.

Vraag elke volwassene welk item hij niet zonder kan verlaten, en hij zal je antwoorden: sleutels, portemonnee, mobiel. Met de groei van fabrikanten van mobiele apparaten en de introductie van nieuwe en verbeterde modellen is het simpelweg onmogelijk om niet te bezwijken voor deze groeiende trend.

Uit gegevens uit 2014 blijkt dat alleen al in de VS 90% van de volwassenen een mobiele telefoon heeft, waarvan 58% smartphonebezitters zijn. 42% van de Amerikanen bezit tablets. In een rapport voorspelde eMarketer dat mensen tegen eind 2014 wereldwijd ongeveer 1,75 miljard smartphones zullen gebruiken.

Deze cijfers bevestigen alleen maar dat mobiele apparaten tegenwoordig van luxeartikelen in onze dagelijkse noodzaak zijn veranderd. Waren telefoons vroeger alleen maar een communicatiemiddel, nu vertrouwen we erop als we werken, ontspannen of winkelen.

Formulieren optimaliseren voor mobiele apparaten

De opkomst van smartphones maakt winkelen niet alleen makkelijker voor consumenten. Dit is een welkome aanvulling op de toch al groeiende online winkelindustrie. In de loop van de tijd begonnen niet alleen online, maar ook offline bedrijven het belang ervan in te zien mobieltjes, samen met andere promotiekanalen, bij het werven van klanten.

Formulieren feedback spelen een grote rol bij online winkelen, ze vormen ook een kernelement in het mobiele platform. Meestal komen we ze tegen als we een aankoop doen en de site vraagt ​​ons om specifieke informatie te verstrekken, zoals naam, adres, telefoonnummer en informatie over kredietkaart. Veel kopers vinden het invullen van formulieren echter een vervelende taak, die hun interesse kan bederven. Bovendien worden online kopers doorgaans geconfronteerd met uitdagingen zoals tijdgebrek of een slechte internetverbinding, wat een negatief effect kan hebben op het conversiepercentage van uw mobiele site.

Hieronder vindt u 10 manieren om de mobiele transactieprestaties van uw klanten te versnellen en hun online winkelervaring plezierig te maken.

1. Vermeld alleen de belangrijkste gegevens in uw formulier.

Als u niet het geduld heeft om talloze formulieren op een webpagina in te vullen terwijl u online winkelt, denken uw klanten waarschijnlijk hetzelfde. Er is een verschil tussen het invullen van een Full-On-formulier en het invullen van een eenvoudig formulier om iets in een online winkel te kopen. In vergelijking met de laatste kan de eerste versie van het formulier behoorlijk vervelend zijn en loop je het risico de klant kwijt te raken als hij het invullen van het formulier beu wordt, vooral als hij ziet dat hij drie verschillende telefoonnummers moet opgeven.

Maak online mobiel winkelen gemakkelijk door uw klanten een eenvoudig maar compleet bestelformulier te bieden. Vraag gebruikers alleen om echt belangrijke informatie, zoals volledige naam, e-mailadres, telefoonnummer, verzendinformatie en creditcardgegevens. U kunt ook een vervolgkeuzelijst toevoegen met de staten of landen waarnaar u verzendt, of, beter nog, uw eigen land heeft applicatie voor de mobiele telefoon vraagt ​​geolocatie aan bij klanten. Op deze manier kunt u snel en nauwkeurig hun adres achterhalen.

2. Gebruik hoogte-uitlijning voor labels en invoervelden.

Smartphones hebben een beperkt weergavegebied vergeleken met pc's, dus het is belangrijk dat u een vorm ontwerpt die dit gebied maximaliseert. Eén manier om dit te doen is door te gebruiken verticale uitlijning voor uw formuliervelden. Zie je, wanneer het voor een formulier wordt gebruikt horizontale uitlijning bestaat de mogelijkheid dat niet alle informatie op het smartphonescherm past en een label of invoerveld verloren gaat. Dergelijke bestelformulieren kunnen voor kopers omslachtig lijken, wat hun interesse kan verminderen.

Aan de andere kant, als labels en invoervelden verticaal zijn gepositioneerd, zullen uw klanten gemakkelijker onmiddellijk de informatie zien waar ze om vragen, inclusief wat ze moeten invullen. Dit zal hen helpen vertrouwen te hebben in de veiligheid van de transactie. Deze lay-out voorkomt ook dat shoppers invoervelden missen, of erger nog, dat ze het formulier opnieuw invullen.

Bovendien minimaliseert het de visuele rommel van uw vormen. Op de mobiele versie van uw website kunt u de knoppen ‘Wat is dit’ en ‘Meer details’ plaatsen. Als deze knoppen op een formulier moeten worden geplaatst, plaats ze dan zo dat klanten niet worden afgeleid van het doen van een aankoop.

3. Gebruik vervolgkeuzemenu's en vervolgkeuzelijsten

Een andere beperking die wordt veroorzaakt door het beperkte weergavegebied op een mobiel apparaat is het eindeloze scrollen dat we moeten doen om een ​​hele pagina te bekijken of een formulier in te vullen. Hoewel scrollen veel voorkomt, zouden smartphonegebruikers er de voorkeur aan geven om snel producten online te kunnen kopen.

Door vervolgkeuzemenu's en vervolgkeuzelijsten te gebruiken, kunt u de tijd die uw klanten besteden aan het invullen van formulieren, verkorten. In plaats van shoppers te dwingen uit een groot aantal opties te kiezen, kunt u individuele producten in categorieën groeperen. Pull-down menu's zijn ook handig voor het koppelen van beschrijvingen van uw belangrijkste producten die u op één pagina wilt plaatsen. Vergeet niet om ze niet te beschrijven terwijl het menu zich uitbreidt.

4. Gebruik adequate keuzelijsten

Wanneer vervolgkeuzelijsten of vervolgkeuzemenu's niet passen in de formulieren van uw mobiele site, heeft u twee geweldige opties voor mobiele formulieren: invoervelden voor voorspellende zoekopdrachten en persoonlijke vervolgkeuzelijsten.

Met voorspellende zoekinvoervelden kunnen uw klanten zoeken naar het product of de dienst die ze nodig hebben trefwoorden en geeft ook een lijst weer met alle vergelijkbare resultaten. Dit type formulier is ideaal in gevallen waarin het zoeken naar verwachting lang zal duren, of wanneer er een aantal producten zijn die niet in aparte categorieën vallen. Gesloten vervolgkeuzelijsten werken daarentegen goed voor lijsten met specifieke menu-items in in een bepaalde volgorde, bijvoorbeeld in alfabetische of chronologische volgorde.

5. Eenvoudige invoer van gegevens

U bent waarschijnlijk invoervelden tegengekomen op formulieren op zowel internet als mobiele sites. Soms zijn ze verdeeld in 2-3 delen, zoals naam, adres, telefoonnummer. En hoewel dit op sites werkt, op hun mobiele versies soortgelijk gebruik formulieren zijn niet altijd geschikt.

Vaker wel dan niet vereist het splitsen van de invoer dat mobiele shoppers alle drie (of twee) invoervelden invullen om eenvoudig op één label te kunnen reageren. Als u het in dezelfde vorm gaat overdrijven, kunnen uw klanten de interesse in het proces verliezen. Bovendien kan de scheiding van invoergegevens door klanten dubbelzinnig worden waargenomen of zelfs in verwarring worden gebracht. Gebruik bij het ontwerpen van formulieren voor mobiele platforms eenvoudigere invoervelden in plaats van ze op te splitsen. Gebruik er bijvoorbeeld één in plaats van twee aparte velden voor de voor- en achternaam. Hierdoor kunnen uw klanten het formulier sneller invullen.

6. Formatteer uw formulierknoppen

De knop “Bevestigen” is laatste stap bij online winkelen, evenals de belangrijkste knop op het formulier. Dan regelt u het zo dat uw klanten betrokken blijven bij het invullen van het formulier.

Maak de knop 'Bevestigen' aantrekkelijk door de breedte in te stellen op 1/3 van uw formulier, of door deze in een heldere kleur te schilderen. En in plaats van simpelweg de woorden ‘Bevestigen’ of ‘Verzenden’ te gebruiken, kun je welsprekendere oproepen tot actie gebruiken, zoals ‘Registreer je nu’ of ‘Dien je aanvraag in’.

Vermijd echter het gebruik van te veel felle kleuren, of het maken van knoppen die te veel bewegen omdat dit uw klanten afleidt van het klikken. U kunt subtiele kleurveranderingen gebruiken of zweven als er op een knop wordt gedrukt, zodat uw klanten weten dat ze klaar zijn met de transactie.

7. Stel de zoom in met behulp van de viewport-metatag

Het kan zijn dat het surfen op een mobiel apparaat geschikt is voor klanten, of dat ze moeten blijven inzoomen op de pagina, maar als ze dit per ongeluk doen, kunnen ze verdwalen op de pagina. U kunt dit beheren met behulp van de viewport-metatag in uw formulieren. Hierdoor kunnen uw klanten voorkomen dat ze per ongeluk de pagina schalen, of erger nog, dat ze het formulier helemaal uit het oog verliezen.

8. Bied de mogelijkheid om gegevens op te slaan

Winkelen met mobiele telefoons kan dat wel zijn uitdagende taak voor sommige klanten, omdat het risico bestaat dat u op de knop "Terug" klikt of per ongeluk de pagina opnieuw laadt, en als alle ingevulde informatie verdwijnt, zal uw koper hoogstwaarschijnlijk de transactie weigeren. U kunt deze mogelijkheid vermijden door uw klanten de optie 'Openen in nieuw tabblad' te bieden wanneer ze op een link buiten het formulier klikken.

Als gebruikers niet langer naar de vorige pagina's kunnen terugkeren, kunt u bovendien een waarschuwingsvenster weergeven met knoppen zoals 'Akkoord', 'OK' of 'Annuleren'. Door dit te doen, kunt u uw klanten waarschuwen of hun gegevens op de site of in de browser zijn opgeslagen, en hen zo helpen beslissen om door te gaan naar de kassa.

9. Help cliënten hun voortgang bij te houden

Niet alle kopers zijn geïnteresseerd in het invullen van feedbackformulieren. In dit geval kan het handig zijn om een ​​manier te bedenken om klanten te laten zien dat ze bijna aan het einde zijn van het invullen. Dit kun je doen door bovenaan het formulier een laadbalk te plaatsen, of door een eenvoudige tijdlijn en percentages te gebruiken om aan te geven in welke stap ze staan. Vergeet niet om het aantal van deze stappen te beperken om uw klanten tijd te besparen.

10. Zorg ervoor dat het formulier snel wordt geladen

Een andere factor die u niet mag vergeten, is de laadsnelheid van uw mobiele formulier. Als het even duurt voordat de pagina is geladen, is uw klant mogelijk van de haak. Alleen al het feit dat uw gebruikers het formulier hebben ingevuld, geeft aan dat ze klaar zijn om een ​​bestelling te plaatsen. Stel ze niet teleur met slecht ladende pagina's. De laadsnelheid van uw formulieren hangt ook af van het aantal elementen dat u op de pagina plaatst, dus wees voorzichtig als u grote afbeeldingen gebruikt.

En test zoals altijd uw formulieren op alle systemen en apparaten

Tegenwoordig vereist de verscheidenheid aan mobiele apparaten en hun interfaces dat we voor elk ervan formulieren ontwerpen. Zorg er dus voor dat u uw formulieren test verschillende soorten mobiele apparaten, rekening houdend met de verschillen besturingssystemen, maten en browsers. Met testen kunt u niet alleen uw formulier verbeteren, maar er ook voor zorgen dat deze op alle beschikbare apparaten werkt.

In dit artikel bekijken we enkele van de nieuwe formulierverbeteringen in HTML5 en analyseren we hoe deze helpen verbeteren gebruikersomgeving op mobiel. We zullen vooral zien hoe formulieren kunnen worden uitgebreid met de extra invoertypen die HTML5 biedt, en laten zien wat u van verschillende mobiele browsers kunt verwachten.

HTML-typen 5 Ingang

HTML5 heeft een aantal nieuwe invoertypen voor formulieren. Dit soort invoer maakt een grotere controle en verificatie van invoergegevens mogelijk. Sommigen van hen zijn vooral nuttig voor mobiele gebruikers waar ze het vaak moeilijk mee hebben HTML-werk Invoer. De volledige lijst met typen invoergegevens vindt u hieronder:

  • kleur — kleurselectie
  • datum — datumselectie
  • datetime - selecteer datum en tijd
  • e-mail — validatie van e-mailmaskers
  • nummer - voer nummer in
  • bereik — bereikschuifregelaar
  • zoeken - zoekveld
  • tel — telefoonmaskervalidatie
  • tijd - timing
  • url - URL-validatie

Natuurlijk is deze lijst niet compleet. Typen die door de standaard worden geaccepteerd, vallen hier niet onder, maar hun essentie is nog niet duidelijk. We zullen de meest populaire en relevante van de bovenstaande typen in dit artikel met voorbeelden beschouwen.

1. Kleur van het invoertype

Als dit invoertype wordt ondersteund, roept de browser van de gebruiker de ingebouwde kleurkiezer op het clientapparaat aan. De geselecteerde kleur wordt weergegeven in de overeenkomstige hexadecimale RGB-waarde.

< input type = "color" / >

Voorbeeld van werk:

De stijl van de pop-up is afhankelijk van uw browser. Klik op de knop om te zien hoe het werkt.

Kies uw kleur:

Helaas, steun van dit type mobiele browsers laat veel te wensen over. Van alle bestaande, juiste weergave is alleen te vinden in Opera Mobile en Chrome Android. Voor alle andere browsers wordt een leeg tekstveld weergegeven. Dit is de moeite waard om in gedachten te houden. Als alternatief kunt u het palet in JS schetsen of plug-ins gebruiken.

2. Invoertype datum

Indien ondersteund door de browser, biedt het een handig blok voor het selecteren van een datum.

< input type = "date" / >

Voorbeeld van werk:

Datum selectie:

Houd er rekening mee dat het invoertype Datum is, evenals de opties datum/tijd-type en datetime-local bieden nuttige attributen, waarden zoals min en max , die gebruikersinvoer kunnen beperken en valideren. We zullen dit hieronder in de tekst aantonen.

Het HTML-invoerdatumtype wordt door vrijwel alle browsers ondersteund. De uitzonderingen zijn Opera Mini en de standaard Android-browser.

3. Invoertype datetime en datetime-local

Dit Invoertype Hiermee kan de gebruiker de datum en tijd opgeven handig formaat. Indien ondersteund, wordt het weergegeven als een native datum-/tijdwidget van het apparaat. Het verschil tussen deze invoertypen is dat de eerste gekoppeld is aan de wereldtijd en de tweede geen tijdzone-informatie bevat.

< input type = "datetime-local" / >

Voorbeeld van werk:

Selecteer datum en tijd:

Niet ondersteund in IE Mobile en Opera Mini. In andere populaire browsers (mobiel) werkt het type min of meer correct, maar gevallen van bugs en glitches zijn niet ongewoon. Houd hier ook rekening mee en vergeet JavaScript-fallbacks niet.

4. Invoertype e-mail

Dit type vereist geen representatie. Veel mensen gebruiken het al en het wordt door bijna alle browsers ondersteund.

< input type = "email" / >

Voorbeeld van werk:

Vul je e-mailadres in:

Voordat het bericht wordt verzonden, controleert de browser de juistheid van het ingevulde veld en informeert de gebruiker of het invoerformaat ongeldig is. De berekening is gebaseerd op de volgende uitdrukking (tekst)@(domein)

5. Voer typenummer en tel. in

Dit is een ander type dat niet veel discussie vereist. In een mobiele omgeving is het echter erg bruikbaar gereedschap. Gebruik het in gevallen waarin de gebruiker een reeks alleen cijfers te zien krijgt. In deze situatie wordt hij aangeboden gebruiksvriendelijke interface numeriek toetsenbord.

Voorbeeld van werk:

Selecteer waarde:

Het standaardbereik in de meeste browsers ligt tussen 0 en 100. Dat wil zeggen dat de meest linkse positie van de schuifregelaar 0 is en de verste positie 100. U kunt het bereik wijzigen met de kenmerken min en max. We kunnen de stapwaarde ook instellen via het attribuut stap. Om een ​​bereik van 5 tot 50 te specificeren, in stappen van 5, gebruiken we dus:

< input type = "range" min = "5" max = "50" step = "5" / >

Steun van iedereen populaire browsers, behalve Opera Mini.

7. Formuliervalidatie

Het is erg handig om een ​​speciaal HTML-invoerattribuut in te stellen om de invoergegevens te valideren. We willen bijvoorbeeld een veld aanmaken dat moet worden ingevuld: