Does jQuery Mobile support form submissions?

Formularindsendelse med AJAX og JSON i jQuery Mobile

30/01/2024

Rating: 4.89 (11664 votes)

I en verden hvor mobilbrug er dominerende, er det afgørende at levere en flydende og responsiv brugeroplevelse på webapplikationer. jQuery Mobile, et robust framework designet til at skabe mobilvenlige websteder, excellerer i at gøre netop dette, især når det kommer til formularindsendelser. Traditionelle formularer forårsager ofte en fuld sidegenindlæsning, hvilket kan virke langsomt og hakkende på mobile enheder. jQuery Mobile adresserer dette problem ved som standard at håndtere formularindsendelser ved hjælp af AJAX (Asynchronous JavaScript and XML), hvilket skaber en mere dynamisk og problemfri overgang for brugeren. Denne artikel vil dykke ned i, hvordan jQuery Mobile håndterer formularer, hvordan du kan tilpasse denne adfærd, og især hvordan du kan arbejde med JSON (JavaScript Object Notation) data for at optimere din dataudveksling med serveren.

How to send Form data in Ajax?
To send formData, we use two methods, namely, the FormData () method and the second method is serialize () method. The implementation of Ajax to send form data enables the submission of data to the server without the need for a page refresh, which is a potent strategy applied in contemporary web-based applications to enhance the user's interaction.

Formularer er kernen i mange webapplikationer, der tillader brugere at indtaste information, foretage valg og interagere med systemet. At sikre, at disse interaktioner er så gnidningsfrie som muligt, er afgørende for brugerfastholdelse og tilfredshed. jQuery Mobiles tilgang til formularer er designet med dette for øje, hvilket giver udviklere værktøjer til at bygge moderne, højtydende mobilapplikationer.

Den automatiske AJAX-håndtering betyder, at når en formular indsendes, forsøger jQuery Mobile at sende data i baggrunden uden at omlade hele siden. Dette resulterer i en øjeblikkelig respons og en mere flydende brugerrejse. Det er dog vigtigt at forstå de grundlæggende principper for at kunne udnytte denne funktionalitet fuldt ud og tilpasse den til specifikke behov.

Indholdsfortegnelse

Automatisk AJAX-håndtering i jQuery Mobile

jQuery Mobile er designet til at forenkle mobiludvikling, og en af de mest bemærkelsesværdige funktioner er dens automatiske håndtering af formularindsendelser via AJAX. Hver gang det er muligt, vil jQuery Mobile opsnappe en formularindsendelse og udføre den asynkront. Dette skaber en "single-page application"-lignende oplevelse, hvor overgange mellem formularer og resultatsider føles øjeblikkelige og glatte, uden at brugeren oplever den blinkende effekt af en fuld sidegenindlæsning.

For at sikre, at din formularindsendelse fungerer som forventet med AJAX, er det vigtigt at specificere action og method egenskaberne på dit formular-element. Hvis disse ikke er specificeret, vil method som standard være get, og action vil som standard være den aktuelle sides relative sti (fundet via $.mobile.path.get()). Dette standardadfærd er ofte tilstrækkeligt for simple formularer, men eksplicit definition giver bedre kontrol og klarhed.

Ligesom anker-elementer accepterer formularer også attributter for overgange, såsom data-transition="pop" og data-direction="reverse". Disse attributter giver dig mulighed for at tilpasse den visuelle effekt, der opstår, når formularen indsendes, hvilket yderligere forbedrer den flydende brugeroplevelse.

Men hvad nu hvis du ikke ønsker AJAX-håndtering for en specifik formular? jQuery Mobile giver dig fleksibilitet. Du kan enten deaktivere AJAX-formularhåndtering globalt for hele din applikation eller, mere almindeligt, deaktivere det per formular ved hjælp af attributten data-ajax="false". Dette er nyttigt i scenarier, hvor en fuld sidegenindlæsning er ønsket eller nødvendig, for eksempel ved fil-uploads eller integrationer, der kræver en traditionel HTTP-POST.

Desuden respekteres target-attributten (f.eks. target="_blank") på formularer, og den vil som standard følge browserens håndtering af denne target, når formularen indsendes. Det er dog vigtigt at bemærke, at rel-attributten, i modsætning til anker-elementer, ikke er tilladt på formularer i jQuery Mobile.

Standard AJAX-formular eksempel

Lad os se på, hvordan en standard AJAX-formular fungerer i praksis. Forestil dig en simpel formular, der skal sende en GET-anmodning til en server-side script, for eksempel forms-sample-response.php. Når du trykker på "Send"-knappen, vil jQuery Mobile automatisk sikre, at den angivne URL kan hentes via AJAX og håndtere svaret passende.

Et vigtigt aspekt ved GET-anmodninger er, at ligesom almindelige HTTP-formularindsendelser, tillader jQuery Mobile, at resultatsider fra GET-anmodninger kan bogmærkes. Dette sker ved at opdatere URL-hash'en, når svaret returneres succesfuldt. Dette betyder, at brugeren kan vende tilbage til den specifikke formularresultatside senere. Omvendt indeholder POST-anmodninger ikke forespørgselsparametre i hash'en og er derfor ikke bogmærkbare. Dette er en vigtig overvejelse, når du vælger din forespørgselsmetode.

How to convert jQuery form to JSON?
A tiny yet effective jQuery Form To JSON converter that converts form fields and their values into a JSON object on submit. With this plugin, you can save and send data of HTML form directly through JSON. 1. Load both jQuery library and the form-to-json plugin in the HTML document. 2. Add form fields to the webpage as follows. Supported form data:

Et eksempel kunne være en formular til valg af forsendelsesmetode:

  • Standard: 7 dage
  • Hurtig: 3 dage
  • Ekspres: næste dag
  • Overnight

Når en bruger vælger en metode og indsender formularen, vil jQuery Mobile håndtere indsendelsen i baggrunden og vise resultatet uden en fuld sidegenindlæsning.

Formularer uden AJAX (fuld sidegenindlæsning)

Som nævnt kan der være situationer, hvor du ønsker at forhindre formularindsendelser i automatisk at blive håndteret med AJAX. Den mest ligetil metode er at tilføje attributten data-ajax="false" til dit formular-element. Dette instruerer jQuery Mobile i at ignorere formularen for AJAX-håndtering og lade browseren udføre en traditionel fuld sidegenindlæsning ved indsendelse.

Alternativt, hvis du ønsker at deaktivere AJAX-formularhåndtering fuldstændigt for hele din applikation, kan du gøre det via den globale konfigurationsmulighed ajaxEnabled. Dette er dog sjældent anbefalelsesværdigt, da det fjerner en af de primære fordele ved jQuery Mobile for formularer. At bruge data-ajax="false" er den foretrukne metode for specifikke tilfælde.

En formular med data-ajax="false" vil se identisk ud med en standard AJAX-formular, men når "Send"-knappen trykkes, vil det resultere i en fuld sidegenindlæsning, hvor hele siden genindlæses fra serveren.

Selv-indsendende formularer

Du kan også indsende formularer til den samme URL, som du aktuelt ser. Dette opnås ved at indstille formularens action-attribut til den pågældende URL. Dette er nyttigt i scenarier, hvor du ønsker at behandle formularinput på den samme side, ofte ved at opdatere en del af sidens indhold dynamisk efter indsendelse. Selvom dette kan gøres med eller uden AJAX, er det med AJAX, at den mest flydende brugeroplevelse opnås, da siden ikke hopper eller genindlæses.

Håndtering af JSON-data med jQuery AJAX

Ud over standard formularindsendelser er der ofte et behov for at sende formular data i et mere struktureret format, især når man interagerer med moderne web-API'er. JSON (JavaScript Object Notation) er blevet standardformatet for dataudveksling på nettet på grund af dets letvægtskarakter og læsbarhed. At sende formular data som JSON via AJAX er en kraftfuld teknik, der giver stor fleksibilitet.

JSON er et tekstbaseret dataudvekslingsformat, der er let for mennesker at læse og skrive, og let for maskiner at parse og generere. Det er baseret på en delmængde af JavaScript Programming Language Standard ECMA-262 3rd Edition - december 1999. JSON er et uafhængigt sprog, men bruger konventioner, der er velkendte for programmører af C-familien af sprog (C, C++, C#, Java, JavaScript, Perl, Python, osv.).

Et simpelt JSON-objekt ser typisk sådan ud:

{ "nøgle1": "værdi1", "nøgle2": "værdi2" }

Det kan også være indlejret for at skabe mere komplekse strukturer:

{ "nøgle1": "værdi1", "nøgle2": "værdi2", "forælder1": { "barn1": "værdi af barn1", "barn2": "værdi af barn2", "børnebørn": { "barnebarn1": "værdi af barnebarn1", "barnebarn2": "værdi af barnebarn2" } } }

Oprettelse af JSON-data fra en formular

jQuery leverer en meget enkel metode, der hjælper os med at oprette vores JSON-dataobjekt fra en formular: serializeArray(). Denne metode returnerer en JavaScript-array af objekter, hvor hvert objekt repræsenterer et formular-felt med name og value egenskaber. Dette er et ideelt udgangspunkt for at konstruere et JSON-objekt.

For at bruge serializeArray() skal vi først få en reference til vores formular-element. Lad os forestille os en funktion ConvertFormToJSON, der tager en formularreference som input:

function ConvertFormToJSON(form){
var array = jQuery(form).serializeArray();
var json = {};
jQuery.each(array, function() {
json[this.name] = this.value || '';
});
return json;
}

I denne funktion:

  1. Vi kalder jQuery(form).serializeArray() for at få en array af formular-felter.
  2. Vi initialiserer et tomt JavaScript-objekt json, som vi vil fylde med data.
  3. Vi itererer over hvert element i den oprettede array ved hjælp af jQuery.each().
  4. For hvert element tager vi feltets name som nøgle og dets value som værdi i vores json-objekt. Vi sikrer, at tomme værdier håndteres korrekt ved at bruge || ''.
  5. Endelig returnerer vi det færdige json-objekt.

Dette vil generere et JavaScript-objekt, der ligner dette:

json = {
"ny-opgave-farve": "#000000",
"ny-opgave-dato": "25/04/2013T08:00:00",
"ny-opgave-beskrivelse": "Oprettelse af en simpel to-do applikations tutorial på developerdrive.com",
"ny-opgave-email": "[email protected]",
"ny-opgave-navn": "Opret en simpel to-do applikation",
"ny-opgave-prioritet": "2"
}

Indsendelse af JSON-data med jQuery AJAX

Når vi har vores JSON-dataobjekt, kan vi bruge jQuerys $.ajax()-metode til at sende det til serveren. Denne metode giver dig fuld kontrol over AJAX-anmodningen.

jQuery(document).on('ready', function() {
jQuery('form#add-new-task').bind('submit', function(event){
event.preventDefault(); // Forhindrer standard formularindsendelse
var form = this;
var json = ConvertFormToJSON(form);

$.ajax({
type: "POST",
url: "submit.php",
data: json,
dataType: "json" // Forventer JSON som svar fra serveren
}).done(function(response) {
// Håndter succesfuldt svar fra serveren
// F.eks. opdater UI eller vis en succesmeddelelse
var tbody = jQuery('#to-do-list > tbody');
tbody.append('' + form['new-task-date'].value + '' + form['new-task-priority'].value + '' + form['new-task-name'].value + '' + form['new-task-desc'].value + '' + form['new-task-email'].value + '');
}).fail(function(jqXHR, textStatus, errorThrown) {
// Håndter fejl under anmodningen
alert("Fejl ved tilføjelse af to-do: " + textStatus);
console.error("Fejl: ", errorThrown);
});
return true;
});
});

I dette eksempel:

  • event.preventDefault() er afgørende for at stoppe browserens standard formularindsendelse, så vi kan håndtere den med AJAX.
  • type: "POST" angiver HTTP-metoden.
  • url: "submit.php" er den server-side endpoint, der skal modtage data.
  • data: json er vores JSON-objekt, der sendes til serveren. jQuery håndterer automatisk konverteringen til en passende streng for anmodningen.
  • dataType: "json" fortæller jQuery, at vi forventer et JSON-svar fra serveren.
  • .done() er en callback-funktion, der udføres, når AJAX-anmodningen lykkes. Her kan du opdatere din brugergrænseflade, f.eks. tilføje den nye opgave til en liste.
  • .fail() er en callback-funktion, der udføres, hvis AJAX-anmodningen mislykkes (f.eks. netværksfejl, serverfejl). Her kan du informere brugeren om fejlen.

Denne tilgang giver dig præcis kontrol over dataformatet og reaktionen på serverens svar, hvilket er afgørende for at bygge robuste og interaktive webapplikationer.

How to make a jQuery Ajax form to JSON post?
To make a more realistic json POST, use some solution from Serialize form data to JSON to make formToJson function and add contentType: 'application/json;charset=UTF-8' to the jQuery ajax call parameters. url: 'test.php', type: "POST", dataType: 'json', data: formToJson($("form")), contentType: 'application/json;charset=UTF-8', ...

Send formular data med FormData-objekter og serialize()

Udover at konvertere formular data til JSON manuelt, tilbyder jQuery og moderne JavaScript to primære metoder til at forberede formular data til AJAX-indsendelse: FormData()-objektet og jQuerys serialize()-metode. Begge metoder har deres specifikke anvendelsesområder og fordele.

Implementeringen af AJAX til at sende formular data muliggør indsendelse af data til serveren uden behov for en sidegenindlæsning, hvilket er en potent strategi anvendt i moderne webbaserede applikationer for at forbedre brugerens interaktion og den samlede oplevelse.

Tilgang 1: Brug af FormData()

FormData()-objektet er en moderne JavaScript API, der forenkler håndteringen af formular data, især når det kommer til komplekse data som fil-uploads. Det giver en nem måde at konstruere og administrere data fra HTML-formularer, håndtere filer og andre komplekse formular data. En af dens store fordele er, at den automatisk sætter den korrekte Content-Type header (multipart/form-data) baseret på indholdet, hvilket er afgørende for fil-uploads.

Når du sender et FormData-objekt med jQuery AJAX, skal du huske at indstille processData: false og contentType: false i dine AJAX-indstillinger. Dette forhindrer jQuery i at behandle FormData-objektet og sætte Content-Type headeren, da FormData-objektet allerede håndterer dette korrekt.

Syntaks for AJAX med FormData():

$.ajax({
url: "din-url",
type: "POST",
data: formDataObject, // Dit FormData-objekt
processData: false, // Vigtigt: Forhindrer jQuery i at behandle data
contentType: false, // Vigtigt: Forhindrer jQuery i at sætte Content-Type
success: function(response){
// Håndter succesfuldt svar
},
error: function(xhr, textStatus, error){
// Håndter fejl svar
}
});

Eksempel på brug af FormData():

Forestil dig en formular med felter som brugernavn, efternavn, adresse og email. For at sende disse data ved hjælp af FormData():

jQuery(document).ready(function() {
jQuery('#myForm').submit(function(event) {
event.preventDefault();
var form = document.getElementById('myForm');
var formData = new FormData(form); // Opretter FormData fra formularen

$.ajax({
url: 'https://jsonplaceholder.cypress.io/posts', // Eksempel endpoint
method: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(response) {
alert('Din formular er sendt succesfuldt.');
},
error: function(xhr, status, error) {
alert('Din formular blev ikke sendt succesfuldt.');
console.error(error);
}
});
});
});

Dette kodeeksempel viser, hvordan du opsnapper formularindsendelsen, opretter et FormData-objekt direkte fra HTML-formularen og sender det via AJAX. Denne metode er særligt fordelagtig, når din formular inkluderer fil-inputfelter, da FormData automatisk håndterer binære data.

Tilgang 2: Brug af serialize()

jQuerys serialize()-metode er en ældre, men stadig meget nyttig metode til at konvertere formular-elementer til en URL-enkodet forespørgselsstreng, der er egnet til HTTP-anmodninger. Denne metode fungerer bedst for simple formularer, der kun indeholder tekstbaserede inputfelter (tekst, tal, checkboxe, radio-knapper osv.), og den understøtter ikke fil-uploads direkte.

serialize()-metoden skaber en streng, der ligner den, du ville se i URL'en for en GET-anmodning (f.eks. navn=John&alder=30). Denne streng kan derefter sendes som data-parameteren i din AJAX-anmodning.

Syntaks for AJAX med serialize():

$.ajax({
url: "din-url",
type: "POST", // Kan også være "GET"
data: formDataString, // Streng fra serialize()
success: function(response){
// Håndter succesfuldt svar
},
error: function(jqXHR, textStatus, errorThrown){
// Håndter fejl svar
}
});

Bemærk, at når du bruger serialize(), behøver du ikke at indstille processData: false eller contentType: false, da jQuery automatisk vil håndtere den URL-enkodede streng korrekt.

Eksempel på brug af serialize():

Med den samme formular med brugernavn, efternavn, adresse og email, ville brugen af serialize() se således ud:

jQuery(document).ready(function() {
jQuery('#myForm').submit(function(e) {
e.preventDefault();
var formData = jQuery(this).serialize(); // Opretter URL-enkodet streng

$.ajax({
url: 'https://jsonplaceholder.cypress.io/posts', // Eksempel endpoint
type: 'POST',
data: formData,
success: function(response) {
alert('Din formular er sendt succesfuldt.');
},
error: function(jqXHR, textStatus, errorThrown) {
alert('Din formular blev ikke sendt succesfuldt.');
}
});
});
});

Sammenligning af FormData() og serialize():

FunktionFormData()serialize()
Understøtter fil-uploads?JaNej
Output formatNøgle-værdi par, kan indeholde binære dataURL-enkodet streng
Content-Type headerAutomatisk sat til multipart/form-dataSættes typisk til application/x-www-form-urlencoded
AnvendelseKomplekse formularer, fil-uploadsSimple tekstbaserede formularer
jQuery AJAX indstillingerKræver processData: false, contentType: falseIngen særlige indstillinger udover data

Valget mellem FormData() og serialize() afhænger af kompleksiteten af din formular og den type data, du skal sende. For de fleste tekstbaserede formularer er serialize() en hurtig og nem løsning, mens FormData() er uundværlig, når du skal håndtere fil-uploads eller mere komplekse datastrukturer direkte fra formularen.

Konvertering af jQuery formular til JSON

At konvertere formular data til et JSON-objekt er en almindelig praksis, især når man interagerer med RESTful API'er, der typisk forventer JSON som input. Mens serialize() giver en URL-enkodet streng, og FormData() er fantastisk til filer, er et direkte JSON-objekt ofte det mest fleksible format til programmerbar manipulation på både klient- og server-siden. Som beskrevet tidligere, kan dette gøres ved at kombinere serializeArray() med en iteration.

How to create a JSON data object using jQuery?
jQuery provides a very simple method that helps us create our JSON data object. This method is the serializeArray. To use it, all we are going to create a new JavaScript method and pass in our form reference function ConvertFormToJSON(form) { var array = jQuery (form).serializeArray (); }

Processen indebærer at tage de nøgle-værdi-par, som serializeArray() producerer, og derefter manuelt opbygge et JavaScript-objekt, som kan serialiseres til JSON. Dette giver dig mulighed for at have fuld kontrol over strukturen af dit JSON-objekt, hvilket er nyttigt, hvis du har specifikke navngivningskonventioner eller ønsker at indlejre data på en bestemt måde.

For eksempel, hvis du har en formular med felter som firstname, lastname, email, phone, subject og comments, kan du forestille dig en proces, hvor du bruger serializeArray() og derefter en løkke til at oprette et JSON-objekt, der ligner dette:

{
"firstname": "John",
"lastname": "Doe",
"email": "[email protected]",
"phone": "12345678",
"subject": "Forespørgsel",
"comments": "Dette er en kommentar.",
"createdDate": "2023-10-27T10:00:00Z"
}

Dette kan gøres med den tidligere nævnte ConvertFormToJSON funktion. Når JSON-objektet er oprettet, kan det sendes med $.ajax(), hvor dataType: "json" angiver forventet serverrespons, og data: jsonObject sender dit nyoprettede JSON-objekt i anmodningen.

Denne tilgang er yderst fleksibel og muliggør avancerede scenarier, hvor data skal valideres, transformeres eller kombineres med andre data, før de sendes til serveren. Det er en almindelig og anbefalet metode til at interagere med moderne web-API'er, der er bygget til at forbruge JSON.

Ofte Stillede Spørgsmål (FAQ)

Hvad er fordelen ved AJAX formularindsendelse i jQuery Mobile?

Den primære fordel er en markant forbedret brugeroplevelse. Ved at sende formular data asynkront undgås fulde sidegenindlæsninger, hvilket resulterer i hurtigere, mere flydende og mere interaktive formularer. Det giver en fornemmelse af en "single-page application", hvor indholdet opdateres dynamisk uden afbrydelser, hvilket er særligt vigtigt på mobile enheder med potentielt langsommere netværksforbindelser.

Hvordan forhindrer jeg en formular i at bruge AJAX?

Du kan forhindre en individuel formular i at bruge AJAX ved at tilføje attributten data-ajax="false" til formularens HTML-element. For eksempel: <form id="minForm" data-ajax="false">...</form>. Dette tvinger browseren til at udføre en traditionel fuld sidegenindlæsning ved indsendelse. Du kan også deaktivere AJAX globalt via $.mobile.ajaxEnabled = false;, men dette er sjældent anbefalelsesværdigt for specifikke formularer.

Kan jeg sende filer via AJAX med jQuery?

Ja, du kan sende filer via AJAX med jQuery. Den mest effektive og anbefalede metode er at bruge FormData()-objektet. Dette objekt kan konstrueres direkte fra din formular (new FormData(formElement)) og håndterer automatisk den korrekte kodning af fil-data. Når du sender FormData via $.ajax(), skal du huske at indstille processData: false og contentType: false i dine AJAX-indstillinger.

Hvad er forskellen mellem GET og POST for formularer i jQuery Mobile?

Forskellen er den samme som i almindelig HTTP:

  • GET: Data sendes som en del af URL'en (query string). GET-anmodninger er bogmærkbare og kan caches. De bruges typisk til at hente data.
  • POST: Data sendes i anmodningens krop (body). POST-anmodninger er ikke bogmærkbare og bruges typisk til at indsende data, der ændrer serverens tilstand (f.eks. oprette, opdatere).

jQuery Mobile håndterer begge metoder med AJAX, men kun GET-resultatsider kan bogmærkes via URL-hash-opdatering.

Hvordan konverterer jeg formular data til JSON?

Du kan konvertere formular data til JSON ved først at bruge jQuerys serializeArray()-metode. Denne metode returnerer en array af JavaScript-objekter, hvor hvert objekt har name og value egenskaber for hvert formularfelt. Du kan derefter iterere over denne array og manuelt opbygge et nyt JavaScript-objekt, hvor feltnavnene bliver nøgler, og feltværdierne bliver værdier i dit JSON-objekt. Dette opbyggede objekt kan derefter sendes som data i din $.ajax()-anmodning, ofte med dataType: "json" for at angive, at du forventer JSON som svar fra serveren.

Samlet set giver jQuery Mobile en robust og fleksibel ramme for håndtering af formularindsendelser på mobile webapplikationer. Ved at udnytte dens indbyggede AJAX-funktionalitet og forstå, hvordan man arbejder med JSON-data, kan udviklere skabe overlegne brugeroplevelser, der føles hurtige, flydende og moderne.

Hvis du vil læse andre artikler, der ligner Formularindsendelse med AJAX og JSON i jQuery Mobile, kan du besøge kategorien Teknologi.

Go up