Gegevens ophalen en browser-API's

Leer gegevens te laden en te versturen met fetch, de resultaten op een webpagina te tonen en kleine hoeveelheden gegevens in de browser te bewaren. Je leest HTTP-verzoeken, HTTP-antwoorden en JSON, handelt laad- en foutstatussen af en geeft datums en prijzen uit een API de juiste opmaak voor elke lezer. Je ontdekt waarom CORS-fouten ontstaan en waarom geheime API-sleutels niet thuishoren in frontendcode. Daarna gebruik je localStorage, sessionStorage en browserfuncties zoals geolocatie en het klembord.

BeginnerLes 8 van 9 in Cursus JavaScript programmeren: DOM, events, asynchrone code en modules

Wat je leert

  1. Leg uit hoe een HTTP-verzoek en een HTTP-antwoord werken, laad JSON-gegevens met fetch en verstuur gegevens naar een API met de juiste methode, headers en verzoekinhoud.
    • Lees HTTP-verzoeken en HTTP-antwoorden
      Beschrijf de onderdelen van een HTTP-verzoek en een HTTP-antwoord, koppel elke HTTP-methode aan de handeling die ze uitvoert en lees statuscodes en headers in de ontwikkelaarstools van de browser.
    • Laad JSON-gegevens met fetch
      Roep fetch aan, controleer de status van het antwoord, lees en ontleed de JSON-inhoud en bouw verzoek-URL's met correct gecodeerde queryparameters.
    • Verstuur gegevens met POST, PUT, PATCH en DELETE
      Geef een optieobject door aan fetch om JSON of formuliergegevens te versturen en handel het antwoord van de server af nadat je een record hebt gemaakt, bijgewerkt of verwijderd.
  2. Zet API-resultaten om in pagina-inhoud, geef datums en geldbedragen de juiste opmaak voor de lezer en houd de pagina duidelijk terwijl gegevens worden geladen, het laden mislukt of resultaten in een andere volgorde binnenkomen.
    • Render API-resultaten op de pagina
      Bouw pagina-elementen op uit de arrays en objecten in een JSON-antwoord, voeg API-tekst veilig in en handel ontbrekende velden, lege resultaten en resultaten op meerdere pagina's af.
    • Geef datums, getallen en geldbedragen uit API-gegevens de juiste opmaak
      Zet de datumstrings, tijdstempels en bedragen die API's versturen met de opmaakfuncties van Intl om in leesbare tekst voor de taal, regio en tijdzone van de lezer.
    • Toon laad-, fout- en leegtestatussen
      Houd de fasen van een verzoek bij, toon de gebruiker voor elke fase een duidelijke melding en herstel van fouten met nieuwe pogingen.
    • Annuleer verzoeken, stel tijdslimieten in en combineer verzoeken
      Annuleer verzoeken die niet meer nodig zijn, stel tijdslimieten in, voorkom dat verouderde antwoorden nieuwere vervangen en voer meerdere verzoeken parallel of na elkaar uit.
  3. Leg het beleid voor dezelfde oorsprong en CORS-fouten uit en bescherm API-sleutels en gebruikersgegevens wanneer een pagina met andere servers communiceert.
    • Begrijp het beleid voor dezelfde oorsprong en CORS
      Bepaal de oorsprong van een URL, leg uit waarom de browser sommige antwoorden van een andere oorsprong blokkeert en herken hoe CORS-headers en voorafgaande toestemmingsverzoeken een server in staat stellen die antwoorden toe te staan.
    • Bescherm API-sleutels en gebruikersgegevens
      Leg uit wat API-sleutels en tokens doen, waarom een geheim in frontendcode openbaar is en hoe je inloggegevens verstuurt en verantwoord met gebruikersgegevens omgaat.
  4. Sla kleine hoeveelheden gegevens op, lees ze uit en werk ze bij met localStorage en sessionStorage, en bepaal wat verstandig en veilig is om in de browser te bewaren.
    • Sla gegevens op en lees ze uit met localStorage en sessionStorage
      Gebruik de methoden van Web Storage, leg uit hoe lang elk soort opslag bewaard blijft en wie die kan lezen, en converteer getallen, booleaanse waarden en objecten naar opgeslagen strings en terug.
    • Gebruik browseropslag in een app
      Herstel opgeslagen toestand wanneer een pagina wordt geladen, cache API-antwoorden met een vervaltijd, houd tabbladen gesynchroniseerd en bepaal wat je niet moet opslaan.
  5. Detecteer en gebruik browser-API's die een veilige pagina of toestemming van de gebruiker nodig hebben, zoals geolocatie en het klembord, en geef gebruikers een terugvaloptie wanneer een functie niet beschikbaar is.
    • Vraag de locatie van de gebruiker op met de Geolocation API
      Controleer of een browser-API beschikbaar is, leg veilige contexten en toestemmingsverzoeken uit en gebruik de Geolocation API met de opties, fouten en een terugvaloptie.
    • Kopieer tekst en gebruik andere browser-API's
      Kopieer tekst met de klembord-API, reageer op wijzigingen in de verbinding, lees parameters uit het adres van de pagina en volg één methode om elke nieuwe browser-API te leren kennen.

Gegevens ophalen en browser-API's: uitleg

5 hoofdstukken

1

Doe verzoeken en lees de antwoorden

Een pagina kan een server om gegevens vragen zonder een nieuwe pagina te laden. Het verzoek geeft aan welke resource je wilt en wat je ermee wilt doen; het antwoord vertelt wat er is gebeurd. Je volgt die uitwisseling in het tabblad Network, zet een JSON-antwoord om in JavaScript-gegevens en stuurt wijzigingen terug naar de server. De belangrijke controlepunten zijn de methode, de status en de structuur van de inhoud: het binnenkomen van een antwoord betekent op zichzelf niet dat de bewerking is geslaagd.

1.1 De onderdelen van een HTTP-uitwisseling

Met een web-API kan een programma gegevens lezen of wijzigen via aangeduide URL's die API-eindpunten heten. JavaScript op de pagina is de client. Die verstuurt een HTTP-verzoek; de server antwoordt met een HTTP-antwoord. Veel API's versturen JSON-tekst, die objecten, arrays, strings, getallen, booleaanse waarden en null kan weergeven.

Lees een verzoek

Bekijk GET https://api.example.com/books?author=Le%20Guin&limit=5. De methode is GET, het pad /books selecteert de resource en de querystring bevat twee parameters. De waarde van author is “Le Guin”; %20 codeert de spatie. Een ampersand scheidt de parameters. De API-documentatie legt uit welke parameternamen de API accepteert en wat elke waarde betekent.

Een verzoek kan ook headers bevatten, naam-waardeparen, en verzoekinhoud, met de ingediende gegevens. Accept: application/json vraagt om een JSON-antwoord. Content-Type: application/json beschrijft de inhoud die wordt verstuurd. Authorization bevat inloggegevens. Headernamen zijn niet hoofdlettergevoelig, dus content-type en Content-Type duiden dezelfde header aan.

Kies de handeling
MethodeBedoelde handelingGebruikelijk voorbeeld
GETLezenEen lijst met notities ophalen
POSTMaken of indienenEen notitie toevoegen
PUTVervangenDe volledige vervangende notitie versturen
PATCHEen deel wijzigenEén notitie als voltooid markeren
DELETEVerwijderenEen notitie verwijderen

GET en HEAD zijn veilige methoden: ze zijn bedoeld om te lezen, dus gebruik GET niet voor een verwijderknop. GET, PUT en DELETE zijn idempotent. Als je hetzelfde verzoek herhaalt, blijft de server in dezelfde bedoelde toestand als na eenmaal uitvoeren. Het verwijderen van een al verwijderde notitie kan een andere status teruggeven, maar de notitie blijft afwezig. Het herhalen van een POST kan een tweede record maken.

Interpreteer het antwoord

Het antwoord bevat een statuscode, headers en meestal inhoud. Het eerste cijfer deelt de uitkomst in:

  • 2xx: succes. 200 OK bevat meestal gegevens, 201 Created meldt dat iets is aangemaakt en 204 No Content heeft geen inhoud.
  • 3xx: doorverwijzing. Standaard volgt fetch doorverwijzingen.
  • 4xx: een probleem met het verzoek of de toegang. 400 betekent een ongeldig verzoek; 401 betekent ontbrekende of ongeldige inloggegevens; 403 betekent dat de server het verzoek begrijpt maar weigert; 404 betekent niet gevonden; 429 betekent te veel verzoeken.
  • 5xx: een serverprobleem, zoals 500 Internal Server Error of 503 Service Unavailable.

Een aanroep van /books/42 kan 200, een JSON-inhoudstype en {"id":42,"title":"The Dispossessed","year":1974} teruggeven. Een aanroep van /books/9999 kan 404 en {"error":"Book not found"} teruggeven. Beide aanroepen hebben een antwoord ontvangen. Bij een verbindingsfout is er geen HTTP-status die JavaScript kan onderzoeken.

Onderzoek voordat je gaat gissen

Open de ontwikkelaarstools, selecteer Network en activeer de handeling. Bekijk de methode, volledige URL, status, headers, inhoud en timing. Vergelijk die met het API-eindpunt, de vereiste parameters, inloggegevens, verzoeklimieten en het voorbeeldantwoord in de documentatie. Als de server de juiste gegevens teruggaf, onderzoek je de paginacode; als de verzoek-URL verkeerd is, herstel je die voordat je de renderfunctie wijzigt.

Belangrijkste punten

  • Een API-eindpunt is een URL die een API beschikbaar stelt voor een bewerking.
  • De methode kiest de handeling; de URL kiest de resource en parameters.
  • Verzoek- en antwoordheaders beschrijven de uitwisseling.
  • Een 404 is een antwoord, terwijl een verbindingsfout geen HTTP-status heeft.
  • Bekijk het tabblad Network en vergelijk de uitwisseling met de API-documentatie.

1.2 Laad JSON in twee asynchrone stappen

fetch(url) verstuurt een GET-verzoek en geeft een promise terug. Het resultaat is een Response-object, dat beschikbaar is zodra de headers binnenkomen. De inhoud lezen is een aparte asynchrone bewerking. response.json() leest die inhoud en ontleedt die tot JavaScript-gegevens.

Wacht, controleer en lees
async function loadBook(id) {
  const response = await fetch(`https://api.example.com/books/${id}`);
  if (!response.ok) {
    throw new Error(`HTTP error ${response.status}`);
  }
  return await response.json();
}

Bij loadBook(42) haalt de eerste await het antwoord op. De voorwaarde zorgt bij een niet-succesvolle HTTP-uitkomst voor een afwijzing. De tweede await haalt het ontlede boek op, zoals { id: 42, title: "The Dispossessed", year: 1974 }. De functie zelf geeft een promise terug, dus de aanroeper wacht ook op het resultaat.

response.ok is waar voor statuscodes van 200 tot en met 299. Een HTTP-fout zoals 404 of 500 wijst de fetch-promise niet af: een server heeft geantwoord. Een netwerkfout, een geblokkeerde CORS-uitwisseling, een ongeldige verzoek-URL of annulering kan de promise wel afwijzen. Door bij !response.ok een fout op te werpen, kan een omringende try/catch ook HTTP-fouten afhandelen.

Begrijp de inhoud

Zonder await slaat const data = response.json() een promise op, niet het boek. Als je dan data.title opvraagt, krijg je undefined. Als je await bij fetch weglaat, krijg je op dezelfde manier een promise waar de code een Response verwacht.

Kies de methode om de antwoordinhoud te lezen: json() voor JSON, text() voor tekst of blob() voor binaire gegevens. Inhoud kan maar eenmaal worden gelezen. Sla het ontlede resultaat op en gebruik het opnieuw. Om ook ruwe JSON-tekst te bekijken, lees je eenmaal text() en roep je daarna JSON.parse(text) aan op die opgeslagen string.

Ongeldige JSON leidt tot een afwijzing met een SyntaxError. Een HTML-foutpagina veroorzaakt vaak een melding “Unexpected token '<'”. Lege inhoud, ook bij een 204-antwoord, kan evenmin als JSON worden ontleed. Controleer eerst de status en bekijk response.headers.get("Content-Type") wanneer je twijfelt over het formaat. Een successtatus alleen garandeert geen JSON-inhoud.

Bouw veilig een query
const url = new URL("https://api.example.com/search");
url.searchParams.set("q", "rock & roll");
url.searchParams.set("limit", 10);

Het resulterende adres is https://api.example.com/search?q=rock+%26+roll&limit=10. De ampersand in de waarde wordt als onderdeel van de waarde gecodeerd. Als je invoer aan "?q=" vastplakt, kunnen &, # of + hun URL-betekenis krijgen en de zoekopdracht veranderen. Een relatieve URL volgt de normale adresbepaling: vanaf https://notes.example.org/app/index.html laadt fetch("data/books.json") het pad /app/data/books.json op die oorsprong.

Volg de teruggegeven structuur

Bij {"results":[{"title":"Dune"}],"total":1} is de eerste titel data.results[0].title. Het buitenste object is niet de resultatenarray. Gebruik de voorbeeldweergave van het antwoord om de array te vinden voordat je die met een lus doorloopt.

Een gedeelde hulpfunctie getJSON(url, options) kan voor veel aanroepen dezelfde statuscontrole en leesbewerking uitvoeren. Geef in een .then()-keten response.json() terug vanuit de callback voor het antwoord, zodat de volgende callback ontlede gegevens ontvangt. Voeg aan het einde .catch() toe om afgewezen stappen af te handelen.

Belangrijkste punten

  • fetch en response.json() geven afzonderlijke promises terug.
  • Controleer response.ok; een HTTP-fout zorgt er niet voor dat fetch wordt afgewezen.
  • Lees de inhoud van een antwoord eenmaal en gebruik de opgeslagen waarde opnieuw.
  • Gebruik URL.searchParams om querywaarden te coderen.
  • Lees geneste JSON volgens de werkelijke structuur van objecten en arrays.
  • Een succesvol antwoord kan nog steeds lege of ongeldige JSON-inhoud bevatten.

1.3 Verstuur een wijziging en gebruik het resultaat van de server

Het tweede argument van fetch configureert een verzoek. De opties omvatten method, headers, body, signal en credentials. Zonder deze opties is het verzoek een GET zonder inhoud. Om JSON in te dienen, moet je zowel de tekst als het inhoudstype voorbereiden.

Verstuur JSON
const response = await fetch("https://api.example.com/notes", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ title: "Shopping", text: "Rice, lentils" }),
});

JSON.stringify produceert {"title":"Shopping","text":"Rice, lentils"}. De header vertelt de server hoe die tekst moet worden gelezen. Als je het object rechtstreeks als inhoud doorgeeft, wordt "[object Object]" verstuurd. Als je de JSON-string zonder de header verstuurt, krijgt die het label text/plain;charset=UTF-8. Veel JSON-eindpunten wijzen die af met 400 of 415 Unsupported Media Type.

Als iets succesvol is aangemaakt, krijg je vaak 201 terug met het opgeslagen record, zoals {"id":17,"title":"Shopping","text":"Rice, lentils"}. Gebruik dit teruggegeven object om de pagina bij te werken: de nieuwe id van de server is nodig voor latere wijzigingen en verwijdering.

Vervang of werk bij
VerzoekInhoudBetekenis
PATCH /notes/17{"done":true}Het opgegeven veld wijzigen
PUT /notes/17De volledige vervangende notitieDe resource vervangen
DELETE /notes/17Vaak geenDe resource verwijderen

Als een veld ontbreekt in de inhoud van een PUT, kan dat veld worden verwijderd of teruggezet, afhankelijk van de API. Gebruik de gedocumenteerde methode voor de bedoelde wijziging. PUT en PATCH kunnen een bijgewerkt record met 200 teruggeven, of 204 zonder inhoud.

Handel succes af zonder aan te nemen dat er altijd JSON volgt:

if (!response.ok) {
  throw new Error(`HTTP error ${response.status}`);
}
const saved = response.status === 204
  ? null
  : await response.json();

Dit patroon past bij API-eindpunten die volgens de documentatie JSON of 204 teruggeven. Een verwijdering kan slagen en toch een ontleedfout opleveren als code zonder controle json() aanroept op de lege inhoud.

Kies het formaat van de inhoud

new FormData(formElement) verzamelt formuliervelden met een naam en geselecteerde bestanden. Geef dit rechtstreeks door als body. Laat de browser Content-Type: multipart/form-data en het bijbehorende scheidingsteken instellen; een handmatig opgegeven header kan het scheidingsteken missen dat nodig is om de velden te scheiden. Inhoud van het type URLSearchParams gebruikt application/x-www-form-urlencoded.

Verzoeken met GET en HEAD kunnen via fetch geen inhoud bevatten. Plaats zoektermen en filters in de querystring van de URL. Een poging om een GET met inhoud te versturen, wordt afgewezen met een TypeError voordat die als zoekverzoek kan dienen.

Rond veilig af na succes of een fout

Schakel de verzendknop uit voordat je op een verzoek om iets aan te maken wacht en schakel die daarna weer in met finally. Een dubbele klik kan anders twee POST-verzoeken versturen en twee records maken. Herhaal een aanmaakbewerking waarvan de uitkomst onzeker is niet automatisch: een verloren antwoord maakt niet duidelijk of de server de wijziging heeft uitgevoerd.

Bij een foutstatus kan de inhoud een nuttige melding bevatten zoals {"error":"title is required"}. Lees die eenmaal als de inhoud JSON is; vang een mislukte ontleding af en behoud een algemene HTTP-melding voor lege antwoorden of HTML-antwoorden. Houd de door de gebruiker ingevoerde tekst beschikbaar, zodat die het verzoek kan corrigeren.

Belangrijkste punten

  • JSON-verzoeken hebben JSON.stringify en een bijpassend inhoudstype nodig.
  • Gebruik PATCH voor een gedeeltelijke wijziging en PUT voor een volledige vervanging.
  • Sla het ontleden van JSON over bij 204 No Content.
  • Laat de browser de header voor meerdelige inhoud instellen wanneer je FormData verstuurt.
  • Gebruik het antwoord van de server, inclusief de toegekende ID, om de pagina bij te werken.
  • Voorkom dubbele verzendingen en herstel bedieningselementen in finally.
2

Zet antwoorden om in een bruikbare pagina

Gegevens ophalen is maar het eerste deel van een interface. Lezers hebben bruikbare resultaten, leesbare datums en prijzen en een duidelijke melding tijdens het wachten nodig. Je bouwt de weergave op vanuit de structuur van het antwoord, voorkomt dat ontbrekende waarden die verstoren en maakt succes, lege resultaten en fouten zichtbaar. Je houdt ook overlappende verzoeken onder controle zodat een langzaam antwoord geen nieuwere resultaten kan vervangen, en kiest wanneer onafhankelijke verzoeken tegelijk kunnen worden uitgevoerd.

2.1 Bouw de weergave op uit gegevens

Renderen zet een array of object om in elementen op de pagina. Bewaar de opgehaalde gegevens in een variabele en geef ze aan een renderfunctie. Door die scheiding kun je dezelfde gegevens sorteren of filteren zonder ze opnieuw bij de server op te vragen.

Maak één element per item
function renderBooks(books, list) {
  list.replaceChildren();
  for (const book of books) {
    const item = document.createElement("li");
    item.textContent = `${book.title} (${book.year})`;
    list.append(item);
  }
}

Bij [{"title":"Kindred","year":1979},{"title":"Beloved","year":1987}] maakt dit twee lijstitems: “Kindred (1979)” en “Beloved (1987)”. Door de container eerst leeg te maken, vervangt een nieuwe zoekopdracht de vorige. Zonder die stap worden de oude en nieuwe lijsten bij elkaar opgeteld.

Houd externe tekst als tekst

Gebruik textContent voor titels, beschrijvingen en andere tekst uit een API. innerHTML ontleedt een string als opmaak. Een titel met <img src="x" onerror="alert(1)"> kan dan code uitvoeren. Dit heet cross-site scripting, of XSS. Tekst uit formulieren en opslag heeft dezelfde behandeling nodig, omdat die ook van een niet-vertrouwde bron kan komen.

Met elementeigenschappen stel je afzonderlijke waarden in, zoals img.alt = book.title. Daarmee wordt niet elk soort waarde automatisch veilig. Een link uit een API moet nog steeds op het protocol worden gecontroleerd:

try {
  const target = new URL(book.url, location.href);
  if (target.protocol === "https:" || target.protocol === "http:") {
    link.href = target.href;
  }
} catch {
  link.removeAttribute("href");
}

Deze code werkt op een nieuw gemaakte link zonder bestaande href. Bij een ongeldige of niet-toegestane URL blijft de link zonder bestemming. Een javascript:-URL is geen gewone webnavigatie. Geef afbeeldingen waar mogelijk een betekenisvolle alt-tekst die uit de gegevens is opgebouwd.

Geef standaardwaarden zonder echte waarden te verliezen

Optionele velden kunnen ontbreken of null zijn. book.author?.name ?? "Unknown author" probeert eerst de geneste naam en geeft daarna een standaardwaarde. Optionele ketenvorming voorkomt dat een eigenschap van een ontbrekende auteur wordt opgevraagd.

De operator maakt verschil: 0 || "n/a" geeft "n/a", terwijl 0 ?? "n/a" de waarde 0 behoudt. De operator || vervangt alle falsy-waarden, inclusief nul en een lege string; ?? vervangt alleen null en undefined. Bij een boek waarvan nul exemplaren beschikbaar zijn, moet nul worden weergegeven.

Een lege resultatenarray is een geslaagde zoekopdracht zonder treffers. Toon “Geen boeken gevonden voor je zoekopdracht.” zodat lezers dit kunnen onderscheiden van een pagina die nog niet is geladen.

Vervang een zoekopdracht, voeg een volgende pagina toe

Veel API's geven pagina's terug met page, limit, een totaalaantal total of een next-URL. Bij 47 resultaten en 10 per pagina bevatten vier volle pagina's 40 records en bevat de vijfde er 7. Een nieuwe zoekopdracht wist de vorige lijst; “Meer laden” voegt de volgende pagina toe aan de huidige lijst. Houd die twee weergavehandelingen gescheiden.

Om een lokale kopie te sorteren met de nieuwste boeken eerst, gebruik je [...books].sort((a, b) => b.year - a.year) en render je die kopie. De spreadsyntaxis maakt een nieuwe array, zodat de opgeslagen volgorde van het antwoord beschikbaar blijft. Bekijk de structuur van het antwoord voordat je de array selecteert: een API met paginering plaatst die vaak in data.results.

Belangrijkste punten

  • Render vanuit opgeslagen gegevens zodat lokaal sorteren geen nieuw verzoek vereist.
  • Voeg niet-vertrouwde tekst in met textContent.
  • Valideer het protocol van een API-link voordat je de bestemming toewijst.
  • Gebruik ?. voor ontbrekende geneste gegevens en ?? wanneer nul nul moet blijven.
  • Vervang resultaten bij een nieuwe zoekopdracht; voeg resultaten van een volgende pagina toe.

2.2 Geef datums en bedragen een leesbare opmaak

API's geven waarden terug die programma's eenvoudig kunnen uitwisselen. Lezers hebben datums, tijden en bedragen nodig die zijn opgemaakt voor hun taal en regio. Houd de opgeslagen waarde gescheiden van de tekst die voor de weergave wordt gebruikt.

Lees eerst het datumformaat

"2026-03-05T14:30:00Z" duidt één moment aan: 14.30 uur UTC op 5 maart 2026. De Z betekent UTC. new Date(...) zet dit om in een JavaScript-Date. Een string met alleen een datum, zoals "2026-03-05", wordt geïnterpreteerd als middernacht UTC; een datum en tijd zonder offset, zoals "2026-03-05T14:30", wordt geïnterpreteerd als lokale tijd.

Een Unix-tijdstempel telt vanaf 1 januari 1970, UTC. API's tellen vaak seconden, maar Date gebruikt milliseconden. new Date(1772721000 * 1000) geeft hetzelfde moment op 5 maart. Als je de vermenigvuldiging weglaat, krijg je een datum in januari 1970. Lees de API-documentatie om de eenheid te bepalen.

Kies een landinstelling en tijdzone
const date = new Date("2026-03-05T14:30:00Z");
const dateFormat = new Intl.DateTimeFormat("en-US", {
  dateStyle: "medium",
  timeStyle: "short",
  timeZone: "UTC",
});
dateFormat.format(date);

De uitvoer is “Mar 5, 2026, 2:30 PM”. Met en-GB is dat “5 Mar 2026, 14:30”. Korte datums geven “3/5/26” in en-US, “05/03/2026” in en-GB en “05.03.26” in de-DE.

De landinstelling bepaalt de presentatie; de tijdzone bepaalt de lokale tijd. Zonder timeZone gebruikt de opmaakfunctie de tijdzone van het apparaat. Dat moment is 09.30 uur in New York, 15.30 uur in Amsterdam en 23.30 uur in Tokio. Bewaar en verstuur momenten in UTC en converteer ze voor de weergave. Een kalenderdatum zoals een verjaardag vraagt aandacht: als je middernacht UTC opmaakt in een tijdzone ten westen van UTC, kan de vorige dag worden getoond.

Houd valuta en landinstelling gescheiden
const priceFormat = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "EUR",
});
priceFormat.format(1234.5);

Dit geeft €1,234.50. Voor hetzelfde bedrag geeft de-DE met EUR 1.234,50 €; en-US met USD geeft $1,234.50; en-US met JPY geeft ¥1,235. JPY heeft geen kleinere munteenheid, dus de normale weergave heeft geen decimalen. Een landinstelling selecteren rekent geen valuta's om. Gebruik de valutacode die bij het bedrag wordt geleverd.

Sommige betaal-API's versturen gehele getallen in de onderverdeling van de munteenheid. Bij USD betekent 1999 cent 19.99 Amerikaanse dollar: deel door 100 voordat je het bedrag opmaakt. Pas die deling niet toe op JPY. Het optellen van gehele aantallen centen geeft 1999 + 2550 = 4549, wat wordt opgemaakt als $45.49. Dit voorkomt het bekende resultaat van decimale rekenkunde 0.1 + 0.2, dat gelijk is aan 0.30000000000000004.

Gebruik de opmaakfunctie opnieuw

Maak voor een lijst eenmaal een opmaakfunctie. Gebruik undefined als landinstelling om de standaardinstelling van de browser te kiezen; navigator.language vermeldt de voorkeurstaalcode van de browser. Andere opties maken 0.256 op als “26%”, of 12.5 met de eenheid "kilometer-per-hour" als “12.5 km/h”. new Intl.RelativeTimeFormat("en", { numeric: "auto" }).format(-1, "day") geeft “yesterday”. Met de hand opgebouwde datums zoals “03/05/2026” blijven per regio dubbelzinnig.

Belangrijkste punten

  • Controleer of tijdstempels seconden of milliseconden gebruiken.
  • Een expliciete tijdzone maakt de weergave van datum en tijd voorspelbaar.
  • De landinstelling bepaalt de opmaak; de valuta komt uit de gegevens.
  • Converteer de gedocumenteerde onderverdeling van een munteenheid voordat je geldbedragen opmaakt.
  • Gebruik Intl-opmaakobjecten opnieuw voor een hele lijst.
  • Strings met alleen een datum worden als UTC ontleed en kunnen bij weergave in een andere tijdzone een dag verschuiven.

2.3 Toon wat het verzoek doet

Een verzoek heeft een zichtbare levenscyclus: inactief, laden en daarna succes of fout. Succes kan gegevens of een leeg resultaat bevatten. De pagina moet elke toestand uitleggen, zodat lezers weten of ze moeten wachten, een zoekopdracht moeten aanpassen of het opnieuw moeten proberen.

Houd voorbereiding en opruiming bij elkaar

In deze handler controleert getJSON de HTTP-status en ontleedt die de inhoud, bouwt searchUrl de verzoek-URL en werkt renderResults de lijst bij. De knop en het statuselement bestaan al op de pagina.

async function search(query) {
  button.disabled = true;
  status.textContent = "Loading…";
  try {
    const data = await getJSON(searchUrl(query));
    renderResults(data.results);
    status.textContent = data.results.length === 0 ? "No results." : "";
  } catch (error) {
    status.textContent = "Could not load results. Check your connection and try again.";
    console.error(error);
  } finally {
    button.disabled = false;
  }
}

De voorbereiding gebeurt voordat er wordt gewacht. Het pad voor succes rendert de resultaten en handelt een lege array af. De catch vervangt de laadmelding als een stap waarop wordt gewacht mislukt. finally herstelt de knop na beide paden. Als het opruimen alleen na een succesvolle await zou staan, zou een fout het bedieningselement uitgeschakeld laten.

Leg de relevante oorzaak uit

Een HTTP-fout heeft een status die richting geeft aan de melding. Zeg bij 404 dat het item niet is gevonden. Vraag de gebruiker bij 401 om in te loggen; leg bij 403 uit dat toegang niet is toegestaan. Vraag de gebruiker bij 429 om te wachten. Leg bij 5xx uit dat de dienst een probleem heeft en stel voor het later opnieuw te proberen.

Een TypeError van fetch kan duiden op een netwerkfout, een geblokkeerd CORS-verzoek of een ongeldige URL. JavaScript krijgt geen betrouwbare gedetailleerde diagnose van CORS; bekijk de browserconsole en het tabblad Network. Een SyntaxError van json() wijst op ongeldige JSON. Annulering en tijdslimieten leveren fouten op zoals AbortError en TimeoutError. Bewaar technische details in de console en geef lezers een handeling die ze begrijpen.

Maak wijzigingen merkbaar

Gebruik een bestaand statuselement zoals <p role="status"></p>. Wijzigingen daarin worden aangekondigd aan schermlezers zonder de focus te verplaatsen. aria-live="polite" dient een vergelijkbaar doel; role="alert" is geschikt voor dringende fouten. Een laadindicator alleen communiceert geen leeg resultaat of mislukt verzoek.

Een knop Opnieuw proberen roept de laadfunctie opnieuw aan. Ongewijzigde verzoeken die 400 of 404 opleverden, opnieuw proberen herhaalt meestal het probleem. Tijdelijke netwerk- of dienststoringen kunnen een korte, begrensde reeks nieuwe pogingen rechtvaardigen. Een exponentieel oplopende wachttijd vergroot de pauze, bijvoorbeeld 1 seconde, 2 seconden en dan 4 seconden. Respecteer een antwoordheader Retry-After; die kan een vertraging in seconden of een HTTP-datum geven. Probeer een aanmaakverzoek dat mogelijk al is geslaagd niet automatisch opnieuw.

Als verversen mislukt maar eerdere gegevens nog bruikbaar zijn, houd die dan zichtbaar met een melding zoals “Resultaten van 10.42 uur worden getoond. Verversen is niet gelukt.” Laat oude resultaten niet zonder toelichting actueel lijken.

Test de moeilijke situaties

Gebruik de ontwikkelaarstools om de verbinding te vertragen, offline te gaan en een ontbrekend pad op te vragen. Controleer of de laadmelding direct verschijnt, een mislukt verzoek die vervangt, een leeg succesvol resultaat een eigen melding heeft en bedieningselementen weer bruikbaar worden.

Belangrijkste punten

  • Maak laden, leeg succes, succes met gegevens en fouten zichtbaar.
  • Plaats gezamenlijke opruiming in finally.
  • Geef lezers een bruikbare handeling en houd technische details in de console.
  • Kondig statuswijzigingen aan via een geschikt livegebied.
  • Beperk het aantal nieuwe pogingen en respecteer de door de server gevraagde wachttijd.

2.4 Houd overlappende en parallelle verzoeken onder controle

Verzoeken kunnen langer duren dan de handeling waardoor ze zijn gestart. Een zoekantwoord kan binnenkomen nadat de lezer iets anders heeft getypt en een trage dienst kan een pagina te lang laten wachten. Bepaal welke resultaten nog relevant zijn en of elk verzoek is geslaagd.

Annuleer werk dat je niet meer nodig hebt

Maak een AbortController, geef de bijbehorende signal door aan fetch en roep daarna abort() aan om het verzoek te annuleren. Annulering kan zowel het wachten op headers als het lezen van de inhoud onderbreken. De afwijzing heet normaal gesproken "AbortError".

const controller = new AbortController();
const response = await fetch(url, { signal: controller.signal });
// A cancel button can call controller.abort().
const data = await response.json();

Handel fouten rond beide wachtbewerkingen af. Als je code een verouderde zoekopdracht bewust annuleert, keer je bij die verwachte annulering terug zonder de gebruiker te melden dat de dienst is mislukt.

fetch heeft geen ingebouwde optie timeout. Gebruik een signaal zoals AbortSignal.timeout(5000) om het verzoek te beperken tot 5000 ms, of 5 seconden actieve tijd. Voordat de headers binnenkomen, leidt dit tot een afwijzing met TimeoutError; nadat de headers zijn binnengekomen, kan het lezen van de inhoud worden onderbroken.

Voorkom dat oude zoekopdrachten winnen

Een raceconditie ontstaat wanneer de volgorde van voltooiing het resultaat verandert. Een lezer typt “ka” en daarna “kat”. Als “ka” als laatste terugkomt en wordt gerenderd, komt het scherm niet meer overeen met de invoer.

Een aanpak annuleert het vorige verzoek vóór elk nieuw verzoek. Een andere geeft elke aanroep een nummer en laat alleen de nieuwste aanroep de pagina bijwerken:

let latest = 0;
async function search(query) {
  const request = ++latest;
  try {
    const data = await getJSON(searchUrl(query));
    if (request !== latest) return;
    renderResults(data.results);
  } catch (error) {
    if (request !== latest) return;
    showError(error);
  }
}

De controle voorkomt ook dat een oude fout een nieuwer succes vervangt. Pas dezelfde relevantiecontrole toe op laadmeldingen en het herstellen van bedieningselementen wanneer aanroepen overlappen.

Uitstellen tot na een rustperiode vermindert het aantal aanroepen dat start. Wis bij elke toetsaanslag de vorige timer en start een nieuwe, bijvoorbeeld voor 300 ms. Als je snel “parijs” typt, start na de pauze één verzoek. Dit bespaart verzoeken, maar voorkomt op zichzelf niet dat een eerder antwoord dat nog onderweg is laat binnenkomt.

Bepaal wat samen kan worden uitgevoerd

Onafhankelijke verzoeken kunnen samen starten:

const [user, posts] = await Promise.all([
  getJSON(userUrl),
  getJSON(postsUrl),
]);

Bij duur van 300 ms en 500 ms duren beide samen ongeveer 500 ms in plaats van ongeveer 800 ms na elkaar. Promise.all wordt afgewezen zodra één invoer wordt afgewezen, maar annuleert de andere bewerkingen niet.

Gebruik Promise.allSettled wanneer gedeeltelijke resultaten nuttig zijn. Dit wacht op elke invoer en rapporteert die als { status: "fulfilled", value } of { status: "rejected", reason }. Een dashboard kan dan geslaagde panelen naast een mislukt paneel tonen.

Afhankelijke verzoeken moeten na elkaar worden uitgevoerd. Als een tweede URL een ID nodig heeft die het eerste verzoek teruggeeft, wacht je op die ID voordat je het tweede verzoek opbouwt.

Belangrijkste punten

  • Geef een annuleringssignaal door voordat je abort() aanroept.
  • Vang fouten af bij zowel het ophalen als het lezen van de inhoud.
  • Negeer verouderde resultaten en verouderde fouten.
  • Uitstellen tot na een rustperiode vermindert aanroepen; een relevantiecontrole voorkomt verouderde updates.
  • Gebruik Promise.all voor onafhankelijk werk dat samen moet slagen.
  • Gebruik Promise.allSettled wanneer gedeeltelijke resultaten nuttig zijn.
  • Wacht op vereiste gegevens voordat je een afhankelijk verzoek start.
3

Lees gegevens van andere oorsprongen en bescherm inloggegevens

Een verzoek kan er correct uitzien en toch mislukken in een browser doordat de pagina en de API bij verschillende oorsprongen horen. Die grens wordt gezamenlijk bepaald door browserregels en de antwoordheaders van de server. Je bepaalt de oorsprong, interpreteert voorafgaande toestemmingsverzoeken en CORS-fouten en onderscheidt toestemming om een antwoord te lezen van toestemming om een handeling uit te voeren. Voor inloggegevens is een afzonderlijke beslissing nodig: alles wat aan een browser wordt geleverd, kan door de gebruiker ervan worden bekeken.

3.1 Begrijp de oorsprongsgrens van de browser

Een oorsprong combineert het schema, de host en de poort van een URL. Een pad maakt er geen deel van uit. https://shop.example.com/cart en /help op dezelfde site delen een oorsprong. Als je dit wijzigt naar http://shop.example.com, https://api.example.com of https://shop.example.com:8443, verandert de oorsprong. HTTPS gebruikt normaal poort 443.

Wie staat toe dat het antwoord wordt gelezen?

Het beleid voor dezelfde oorsprong beperkt welke resources een paginascript mag lezen. Bij een fetch-verzoek naar een andere oorsprong laat CORS de API-server via antwoordheaders toegang verlenen. Een pagina op https://notes.example.org die https://api.example.com/weather aanroept, heeft toestemming van de API nodig om het antwoord te lezen.

Access-Control-Allow-Origin: https://notes.example.org verleent die oorsprong toegang. De waarde * staat elke oorsprong toe voor een verzoek zonder inloggegevens. Als het antwoord geen passende toestemming bevat, verbergt de browser het voor de pagina en wordt fetch afgewezen met een TypeError. De console geeft de CORS-diagnose; JavaScript ontvangt de gedetailleerde reden niet.

Als je Access-Control-Allow-Origin toevoegt aan het JavaScript-verzoek, verleent dat geen toestemming. Het is een antwoordheader die door de server wordt bepaald. Een eigen verzoekheader toevoegen kan in plaats daarvan een extra voorafgaande controle veroorzaken.

Waarom OPTIONS vóór POST verschijnt

Sommige verzoeken naar een andere oorsprong hebben een voorafgaand toestemmingsverzoek nodig. De browser verstuurt eerst OPTIONS, met de beoogde methode in Access-Control-Request-Method en niet-standaard toegestane headernamen in Access-Control-Request-Headers. De server staat die toe met Access-Control-Allow-Methods en Access-Control-Allow-Headers, samen met de toestemming voor de oorsprong.

Een eenvoudige GET, HEAD of POST met alleen toegestane headers kan zonder voorafgaand toestemmingsverzoek. De toegestane inhoudstypen omvatten text/plain, application/x-www-form-urlencoded en multipart/form-data. Een JSON-POST, een Authorization-header, PUT of DELETE vereist een voorafgaand toestemmingsverzoek, tenzij een geldige eerdere toestemming is gecachet. Als het voorafgaande verzoek wordt geweigerd, wordt het eigenlijke verzoek niet verstuurd.

Bij een eenvoudig verzoek kan het eigenlijke verzoek de server bereiken, ook als de browser later het lezen van het antwoord blokkeert. CORS vervangt daarom geen autorisatie of invoercontrole op de server.

Cookies stellen een extra eis

De standaardinstelling credentials: "same-origin" verstuurt cookies alleen voor verzoeken met dezelfde oorsprong. credentials: "include" staat toe dat daarvoor in aanmerking komende cookies ook met verzoeken naar andere oorsprongen meegaan. Cookiebeperkingen van SameSite en beleid voor cookies van derden blijven gelden.

Om JavaScript een antwoord op een verzoek met inloggegevens te laten lezen, moet de server Access-Control-Allow-Credentials: true versturen en de oorsprong van de pagina expliciet noemen. Access-Control-Allow-Origin: * werkt niet met inloggegevens. Deze headers dwingen een browser niet om een cookie te versturen die anders zou worden geblokkeerd.

Onderzoek zonder het probleem te verbergen

mode: "no-cors" geeft een ondoorzichtig antwoord met status 0 en zonder leesbare inhoud of headers. Het kan geen JSON aan een pagina leveren. Een verzoek dat werkt in curl bewijst evenmin dat de browser CORS-toestemming heeft: terminalclients handhaven dat browserbeleid niet.

Bekijk de console en het tabblad Network. Controleer of het voorafgaande toestemmingsverzoek is mislukt of dat het uiteindelijke antwoord geen toestemming bevatte. Herstel de antwoordconfiguratie van de API of laat de aanroep via je eigen server lopen. Stel pagina's tijdens de ontwikkeling beschikbaar via een lokale server: pagina's met file:// hebben vaak een ondoorzichtige oorsprong. Een lokale server heeft nog steeds CORS-toestemming nodig wanneer die een andere oorsprong aanroept.

Belangrijkste punten

  • Een oorsprong bestaat uit schema, host en poort.
  • De antwoordheaders van de server verlenen toestemming om vanaf een andere oorsprong te lezen.
  • Een voorafgaand toestemmingsverzoek controleert een voorgestelde methode en headers vóór het eigenlijke verzoek.
  • CORS kan een antwoord verbergen nadat een eenvoudig verzoek al is verwerkt.
  • Antwoorden op verzoeken met inloggegevens vereisen een expliciete oorsprong en een header voor inloggegevens.
  • no-cors levert een ondoorzichtig antwoord op, geen leesbare JSON.

3.2 Houd geheime sleutels buiten de pagina

Een API-sleutel identificeert een aanroepende toepassing voor gebruik, limieten en facturering. Een toegangstoken verleent toegang voor een gebruiker of sessie. Iedereen die bruikbare inloggegevens bezit, kan mogelijk met de bijbehorende rechten handelen. Bepaal dus waar ze thuishoren voordat je ze aan een verzoek toevoegt.

Headers beschermen de plaats, niet de geheimhouding voor de gebruiker

Aanbieders kunnen Authorization: Bearer <token>, X-API-Key: <key> of een queryparameter zoals api_key vereisen. Volg de API-documentatie. Een header voorkomt dat de inloggegevens in een volledige URL terechtkomen die in logboeken en analyses kan belanden. Een Authorization-header of eigen header bij een aanroep naar een andere oorsprong leidt normaal tot een voorafgaand toestemmingsverzoek.

Een header is nog steeds zichtbaar in de ontwikkelaarstools. Bezoekers kunnen de JavaScript die ze downloaden en de verzoeken die deze verstuurt bekijken. Code minificeren of een waarde achter een variabele verbergen maakt die niet geheim.

Volg de sleutel in een weerverzoek

Stel dat browsercode https://api.weather.example/v1/current?city=Lima&key=sk_live_4f9a2c aanroept. Iedereen die Network opent, kan de sleutel kopiëren en het quotum van het account gebruiken. Die waarde verplaatsen naar een omgevingsvariabele tijdens het bouwen helpt niet als de build die invoegt in de JavaScript die aan de pagina wordt geleverd.

Een geheim op de server verandert de route:

  1. De pagina roept de eigen site aan op /api/weather?city=Lima.
  2. De server van die site voegt het geheim toe en neemt contact op met de weeraanbieder.
  3. De server geeft de weergegevens terug aan de pagina en houdt het geheim buiten het antwoord.

De server moet de toegang tot en het gebruik van het eigen API-eindpunt nog steeds beheersen. Het geheim voor de achterliggende dienst op een server bewaren maakt onbeperkt openbaar gebruik niet onschadelijk.

Sommige aanbieders geven browsersleutels uit die openbaar mogen zijn. Pas de domeinbeperkingen van de aanbieder toe, beperk toegestane API's en stel gebruiksquota in. Gebruik een sleutel alleen zo wanneer het gedocumenteerde ontwerp dat toestaat; een geheime serversleutel wordt geen browsersleutel door een domeinbeperking toe te voegen.

Reageer op openbaarmaking

Houd bestanden met inloggegevens buiten versiebeheer, bijvoorbeeld door .env in .gitignore op te nemen. Dit voorkomt dat het bestand wordt gecommit; het voorkomt niet dat een frontendbuild een waarde publiceert die de code insluit. Als een sleutel is uitgelekt, trek je die in en geef je een vervangende sleutel uit. Als je die uit de nieuwste commit verwijdert, blijven eerdere geschiedenis en eventuele kopieën intact.

Bescherm de uitwisseling en beperk verspilling

Gebruik HTTPS voor API-aanroepen zodat gegevens en inloggegevens onderweg zijn versleuteld. Een fetch van een HTTPS-pagina naar een HTTP-API wordt geblokkeerd als gemengde inhoud. Versleuteling voorkomt niet dat de persoon die de browser gebruikt het eigen verzoek ziet.

Een verzoeklimiet begrenst het gebruik, bijvoorbeeld tot 60 verzoeken per minuut. Aanroepen boven de limiet kunnen 429 Too Many Requests teruggeven. Cache geschikte resultaten, stel zoekinvoer uit tot na een rustperiode en voorkom dubbele aanroepen. Als de server Retry-After levert, respecteer je de wachttijd in plaats van steeds direct opnieuw te proberen.

Validatie aan de clientkant maakt formulieren gemakkelijker te gebruiken, maar iedereen kan een API-eindpunt aanroepen zonder je formulier. De server moet verzoeken zelf valideren en handelingen zelf autoriseren. Blijf strings bij het tonen van het antwoord als niet-vertrouwde tekst behandelen en voeg ze in met textContent.

Belangrijkste punten

  • Code en verzoeken die aan de browser worden geleverd, maken de inloggegevens die ze bevatten zichtbaar.
  • Een geheime sleutel hoort op de server die de aanbieder aanroept.
  • Beperk openbare browsersleutels op domein, API en quotum.
  • Trek een uitgelekte sleutel in; die alleen uit de huidige code verwijderen is onvoldoende.
  • HTTPS versleutelt gegevens onderweg, terwijl de server verzoeken nog steeds valideert en autoriseert.
4

Bewaar kleine hoeveelheden toestand in de browser

Een instelling of concept kan na het opnieuw laden bewaard blijven zonder een nieuw serververzoek. Browseropslag maakt dit gemakkelijk, maar de waarden zijn strings en de levensduur hangt af van de gekozen opslag. Je slaat kleine delen van de toestand op en herstelt ze, valideert oude gegevens voordat je ze gebruikt en geeft gecachte API-resultaten een vervaltijd. Je bepaalt ook welke gegevens elders thuishoren, omdat lokale opslag geen geheime kluis is en ook niet de enige veilige kopie van belangrijk werk.

4.1 Sla strings op en herstel hun typen

Web Storage biedt twee opslagplaatsen voor sleutel-waardeparen: localStorage en sessionStorage. Ze gebruiken dezelfde methoden, dus de belangrijkste keuze is hoe lang de gegevens moeten blijven bestaan en welke tabbladen ze moeten delen.

Kies de levensduur
OpslagLevensduurDelen
localStorageBlijft na het sluiten van tabblad en browser bewaard totdat de gegevens worden verwijderd of gewistGedeeld door pagina's van dezelfde oorsprong
sessionStorageBlijft bewaard bij opnieuw laden tijdens de paginasessie van het tabbladApart voor elk tabblad en elke oorsprong

Als je het tabblad sluit, eindigt de sessieopslag ervan. Een nieuw geopende pagina met een opener kan beginnen met een kopie van de sessieopslag van de opener, maar latere wijzigingen blijven gescheiden. Gebruik sessieopslag niet om informatie geheim te houden voor scripts.

Opslag volgt oorsprongen. https://app.example.com kan de opslag niet delen met http://app.example.com. Paden op dezelfde oorsprong delen die wel, dus een voorvoegsel zoals "notes-app:settings" helpt om de sleutels van meerdere apps te onderscheiden.

Gebruik de opslagmethoden
localStorage.setItem("notes-app:theme", "dark");
const theme = localStorage.getItem("notes-app:theme");
localStorage.removeItem("notes-app:theme");

setItem maakt een item of overschrijft het. getItem geeft de stringwaarde terug of null als het item ontbreekt. removeItem verwijdert één item. clear() verwijdert alle items uit dat opslaggebied voor de oorsprong, wat andere functies op dezelfde site kan beïnvloeden. Met length en key(index) kun je de sleutels bekijken.

Gebruik deze methoden in plaats van eigenschapstoewijzingen zoals localStorage.theme = "dark". Sleutels zoals "length" of "key" kunnen botsen met ingebouwde leden wanneer je ze als eigenschappen benadert.

Converteer waarden bewust

Na localStorage.setItem("count", 5) geeft uitlezen "5". Als je daar rechtstreeks 1 bij optelt, ontstaat "51". Number(localStorage.getItem("count")) + 1 levert 6 op.

Een opgeslagen booleaanse waarde heeft een vergelijkbare valkuil. setItem("darkMode", false) slaat "false" op en een niet-lege string is truthy. Lees de waarde met localStorage.getItem("darkMode") === "true" wanneer dat de twee verwachte opgeslagen strings zijn.

Objecten en arrays hebben JSON nodig:

localStorage.setItem("settings", JSON.stringify({
  theme: "dark",
  fontSize: 18,
}));
const settings = JSON.parse(localStorage.getItem("settings"))
  ?? { theme: "light", fontSize: 16 };

Zonder serialisatie wordt een gewoon object "[object Object]". JSON.parse(null) geeft null, dus de standaardwaarde vangt een ontbrekend item op. Een onjuist gevormde opgeslagen string vereist nog steeds try/catch en ontlede gegevens hebben vóór gebruik een structuurcontrole nodig.

Houd de belasting klein

Aanroepen van Web Storage zijn synchroon: JavaScript wacht op elke aanroep op de hoofdthread. Gebruik de opslag voor instellingen, een concept of een korte lijst, niet voor grote collecties of bestanden. IndexedDB biedt asynchrone opslag voor grotere hoeveelheden gestructureerde gegevens.

Actuele browsers staan gewoonlijk ongeveer 5 MiB per Web Storage-gebied per oorsprong toe. Een volle opslag kan ertoe leiden dat setItem een QuotaExceededError opwerpt; toegang kan ook mislukken door privacyinstellingen van de browser. Handel fouten af zonder de rest van de app te blokkeren. Ontwikkelaarstools tonen de opslagplaatsen in het tabblad Application van Chrome en Edge of het tabblad Storage van Firefox. Daar helpt het verwijderen van items om eerste bezoeken te testen.

Belangrijkste punten

  • Kies localStorage voor blijvende gedeelde instellingen en sessionStorage voor toestand tijdens een tabbladsessie.
  • Opslaggebieden zijn per oorsprong gescheiden.
  • getItem geeft een string of null terug.
  • Serialiseer objecten met JSON en herstel hun typen bij het uitlezen.
  • Handel opslagfouten af en houd synchrone schrijfbewerkingen klein.

4.2 Herstel toestand en laat gecachte gegevens vervallen

Een app laadt meestal bij het starten en slaat op bij een wijziging. Lees een opgeslagen lijst wanneer de pagina wordt geopend, render die en sla de bijgewerkte lijst op na een bewerking. Browseropslag is een handige kopie: die kan ontbreken, beschadigd of verouderd zijn of worden gewist.

Valideer voordat je herstelt

Deze laadfunctie verwacht een opgeslagen array met strings:

function loadTodos() {
  try {
    const value = JSON.parse(localStorage.getItem("todos"));
    if (Array.isArray(value) && value.every(item => typeof item === "string")) {
      return value;
    }
  } catch {
    // Continue with an empty list if reading or parsing fails.
  }
  return [];
}

JSON.parse alleen bewijst niet dat de waarde een array is of dat de items bij de app passen. Geldige JSON zoals 42 heeft nog steeds de verkeerde structuur. Een waarde met een versienummer zoals { version: 2, todos: [...] } laat nieuwere code oudere formaten herkennen en die converteren of een standaardwaarde herstellen.

Sla de lijst in het geheugen na elke wijziging op met localStorage.setItem("todos", JSON.stringify(todos)). Vang ook schrijffouten af; een pagina moet kunnen blijven werken, zelfs wanneer die de toestand voor de volgende keer laden niet kan bewaren. Een formulierconcept dat alleen bij één bezoek hoort, kan sessionStorage gebruiken.

Geef gecachte antwoorden een tijdstempel
localStorage.setItem("weather", JSON.stringify({
  savedAt: Date.now(),
  data,
}));

Valideer bij een latere keer laden eerst de structuur en het tijdstempel van het gecachte object. De ouderdom is Date.now() - savedAt. Gebruik het alleen zolang die ouderdom kleiner is dan 10 * 60 * 1000, ofwel 600.000 ms. Een waarde die om 10.00.00 uur is opgeslagen, is om 10.07.30 uur 450.000 ms oud en kan worden gebruikt. Om 10.12.00 uur is die 720.000 ms oud, dus haal je een nieuwe waarde op. Bij precies 600.000 ms is de waarde volgens deze regel vervallen.

De vervalgrens maakt deel uit van de applogica: localStorage verwijdert een item niet wanneer je versheidsinterval eindigt. Wijs een ontbrekend of ongeldig tijdstempel af in plaats van een onbekende ouderdom als vers te behandelen. Je kunt verouderde gegevens zichtbaar houden tijdens een mislukte verversing als ze als oud zijn aangeduid.

Synchroniseer andere tabbladen

Wanneer één tabblad localStorage wijzigt, ontvangen andere tabbladen met dezelfde oorsprong een storage-event. Het schrijvende tabblad ontvangt het eigen event niet. Het event bevat key, oldValue, newValue en url.

window.addEventListener("storage", (event) => {
  if (event.key === "theme") applyTheme(event.newValue);
});

Pas het thema ook direct toe in het schrijvende tabblad. Handel null af wanneer een sleutel wordt verwijderd. Een storage-event vervangt het bijwerken van de toestand van je eigen pagina niet.

Bepaal wat elders thuishoort

Plaats geen wachtwoorden, betaalkaartnummers of geheime API-sleutels in Web Storage. Scripts op de oorsprong kunnen die opslag lezen, inclusief code van derden en geïnjecteerde scripts. Wis relevante persoonsgegevens bij het uitloggen op gedeelde apparaten. Bewaar belangrijk werk op een server of bied een exportmogelijkheid, omdat gebruikers sitegegevens kunnen wissen en privésessies die verwijderen.

Cookies verschillen: passende verzoeken sturen ze naar de server en HttpOnly-cookies kunnen niet door paginascripts worden gelezen. Ze zijn klein, ongeveer 4 KB per stuk. Web Storage blijft in de browser en is leesbaar voor scripts. IndexedDB is geschikt voor grotere hoeveelheden gestructureerde gegevens via een asynchrone API.

Belangrijkste punten

  • Valideer ontlede gegevens en gebruik een terugvaloptie als ze ontbreken of beschadigd zijn.
  • De versheid van een cache volgt uit een tijdstempel en een door de app bepaalde ouderdomsgrens.
  • Het storage-event bereikt andere tabbladen met dezelfde oorsprong, niet het schrijvende tabblad.
  • Houd geheimen en onvervangbare gegevens buiten Web Storage.
5

Gebruik locatie- en klembordfuncties

Browser-API's verbinden een pagina met functies zoals locatie en het klembord. De beschikbaarheid hangt af van de browser, de beveiligingscontext van de pagina en de keuzes van de gebruiker. Je detecteert een functie voordat je die aanroept, vraagt op een passend moment om toestemming en handelt succes of weigering af. Een volledige interactie omvat zichtbare feedback en een andere manier om de taak af te ronden, zoals een stad invoeren of geselecteerde tekst kopiëren met het toetsenbord.

5.1 Vraag een locatie op met een terugvaloptie

Geolocatie is een browser-API: een functie die de browser biedt, los van de JavaScript-taal. Net als andere apparaatfuncties kan die niet beschikbaar zijn of worden geweigerd. Een weerpagina moet blijven werken wanneer een lezer ervoor kiest een stad te typen.

Controleer de functie en de context

Detecteer de functie zelf met "geolocation" in navigator. De naam van een browser controleren is minder betrouwbaar: versies en instellingen veranderen wat beschikbaar is. Geolocatie heeft een veilige context nodig, normaal gesproken HTTPS; http://localhost voldoet ook voor ontwikkeling. window.isSecureContext geeft aan of de huidige pagina voldoet. Gewoon HTTP op het netwerkadres van een ander apparaat is niet hetzelfde als localhost.

Leg uit waarom locatie nuttig is en vraag die op wanneer de lezer op “Gebruik mijn locatie” klikt. De browser beheert het toestemmingsverzoek. Iemand kan toestemming geven of weigeren en een eerdere weigering kan ertoe leiden dat een latere aanroep zonder nieuw verzoek mislukt. De gebruiker kan die beslissing wijzigen in de site-instellingen.

Lees het resultaat van de callback

navigator.geolocation.getCurrentPosition(success, error, options) gebruikt callbacks. Bij succes bevat position.coords de breedtegraad en lengtegraad in decimale graden en accuracy in meters. De nauwkeurigheid is een geschatte onzekerheidsstraal, geen extra precisie in decimalen. Bij een fout betekent code 1 dat toestemming is geweigerd, 2 dat de positie niet beschikbaar is en 3 dat de tijdslimiet is overschreden.

De opties bepalen de poging:

  • enableHighAccuracy: vraagt om hogere nauwkeurigheid; standaard false.
  • timeout: maximale wachttijd in milliseconden; standaard Infinity.
  • maximumAge: maximale ouderdom van een acceptabele gecachte positie; standaard 0.

Gebruik een eindige tijdslimiet zodat de pagina niet hoeft te blijven wachten. watchPosition volgt wijzigingen in de loop van de tijd en geeft een ID terug; geef die ID door aan clearWatch wanneer het volgen moet stoppen.

Verpak callbacks wanneer je await gebruikt
function getPosition(options) {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(resolve, reject, options);
  });
}

async function useLocation() {
  if (!("geolocation" in navigator)) {
    showCityInput();
    return;
  }
  try {
    const { coords } = await getPosition({ timeout: 10000 });
    const url = new URL("https://api.example.com/weather");
    url.searchParams.set("lat", coords.latitude.toFixed(2));
    url.searchParams.set("lon", coords.longitude.toFixed(2));
    await loadWeather(url);
  } catch {
    showCityInput();
  }
}

Hier toont showCityInput het bedieningselement voor handmatige invoer en vraagt en rendert loadWeather het weer. Koppel useLocation aan de locatieknop. De catch dekt zowel een locatiefout als het weerverzoek; in beide gevallen blijft handmatige invoer beschikbaar.

Vraag alleen nuttige precisie

Een positie met breedtegraad 52.3676, lengtegraad 4.9041 en nauwkeurigheid 35 heeft een geschatte straal van ongeveer 35 m. Afronden op 52.37 en 4.90 vermindert de precisie die naar de weerdienst wordt gestuurd. Een interval van 0,01° breedtegraad is ongeveer 1,1 km; de afstand tussen lengtegraden varieert met de breedtegraad. Die regionale precisie is geschikt voor een weersverwachting zonder de meest gedetailleerde coördinaten te delen.

Waar de Permissions API beschikbaar is, rapporteert navigator.permissions.query({ name: "geolocation" }) de waarde "granted", "denied" of "prompt". Detecteer en handel ook die API af. De toestand helpt de interface aan te passen, maar vervangt de foutafhandeling voor de locatieaanroep niet.

Belangrijkste punten

  • Detecteer geolocatie en gebruik een veilige context.
  • Vraag de locatie op na een duidelijke gebruikersactie en vermeld het doel.
  • Breedtegraad en lengtegraad gebruiken graden; nauwkeurigheid gebruikt meters.
  • Stel een eindige tijdslimiet in en bied handmatige invoer aan bij een fout.
  • Verstuur alleen de locatieprecisie die de functie nodig heeft.
  • De toestemmingstoestand garandeert geen bruikbare positie.

5.2 Kopieer tekst en leer een andere browser-API kennen

Met de klembord-API kan een pagina tekst kopiëren zonder de lezer te vragen die eerst te selecteren. Net als geolocatie vereist dit functiecontroles, een passende gebruikersactie, foutafhandeling en een terugvaloptie.

Kopieer tijdens de klik

navigator.clipboard.writeText(text) geeft een promise terug. Wacht daarop voordat je succes meldt. Een veilige context is vereist en een geweigerde bewerking kan worden afgewezen met NotAllowedError. Roep de methode rechtstreeks aan vanuit een klikhandler: Firefox en Safari vereisen een recente gebruikersinteractie, terwijl de eisen van Chromium ook kunnen afhangen van toestemming om naar het klembord te schrijven.

copyButton.addEventListener("click", async () => {
  try {
    if (!navigator.clipboard?.writeText) {
      throw new Error("Copy unavailable");
    }
    await navigator.clipboard.writeText(codeField.value);
    copyButton.textContent = "Copied!";
  } catch {
    codeField.focus();
    codeField.select();
    copyButton.textContent = "Copy selected text: Ctrl+C / Cmd+C";
  }
  setTimeout(() => {
    copyButton.textContent = "Copy";
  }, 2000);
});

codeField is een tekstinvoerveld of tekstvak en copyButton is de knop van de pagina. Als kopiëren mislukt, biedt het selecteren van de tekst een route via het toetsenbord: Ctrl+C op veel systemen of Cmd+C op macOS. Het label wordt na 2000 ms weer “Copy”. Toon nooit “Copied!” voordat de promise succesvol is voltooid.

Lezen gebruikt navigator.clipboard.readText() en kent strengere controles omdat een klembord privémateriaal uit andere apps kan bevatten. Een browser kan toestemming vereisen of een plakverzoek tonen. Toestemming om te schrijven betekent niet dat er toestemming is om te lezen.

Beschouw verbindingsstatus als aanwijzing

navigator.onLine en de events online en offline van het venster helpen om een verbindingsmelding te tonen. Ze bewijzen niet dat je API bereikbaar is. Een apparaat kan een netwerkverbinding hebben terwijl de API-server uitgevallen of onbereikbaar is.

window.addEventListener("offline", () => {
  status.textContent = "You are offline.";
});

Blijf fouten rond fetch afhandelen, ook wanneer navigator.onLine waar is. Gebruik een geschikt livegebied voor de statusmelding.

Lees een deelbare zoekopdracht

De URL-API leest behalve voor het bouwen van API-URL's ook de querystring van de pagina zelf. Op https://books.example.org/search?q=dune geeft new URL(location.href).searchParams.get("q") de waarde "dune" terug. Lees die waarde bij het laden om een zoekopdracht vanuit een gedeelde link te herstellen. Een ontbrekende parameter geeft null terug, dus bepaal wat het beginscherm dan moet tonen.

Gebruik één leermethode

Lees voor een andere browser-API de syntaxis, regels voor veilige context en toestemming, ondersteuningstabel en Baseline-status op MDN. Detecteer daarna de functie, roep die zo nodig aan vanuit een gebruikersactie, handel de promise of callbacks af en bied een alternatief als de functie ontbreekt of wordt geweigerd.

De Notifications API toont systeemmeldingen na toestemming; Web Share opent een deelmenu van het apparaat waar dat wordt ondersteund; Canvas tekent afbeeldingen; media-API's sturen audio en video aan. Een kaarten-API van een derde partij kan een bibliotheek en een sleutel van de aanbieder toevoegen. Voor de inloggegevens gelden dezelfde regels voor geheime sleutels als bij elke andere dienst. Als je één browser via localhost test, bewijst dat niet dat een ander apparaat of een andere browser dezelfde ondersteuning en context heeft.

Belangrijkste punten

  • Wacht op writeText voordat je meldt dat het kopiëren is geslaagd.
  • Behoud een terugvaloptie om met het toetsenbord te kopiëren als toegang tot het klembord mislukt.
  • Voor het lezen van het klembord gelden afzonderlijke, strengere toestemmingsregels.
  • Een onlinestatus bewijst niet dat de API bereikbaar is.
  • Gebruik URL-parameters om een deelbare zoekopdracht te herstellen.
  • Controleer ondersteuning, detecteer functies en handel weigering af voor elke browser-API.

Gegevens ophalen en browser-API's: voorbeelden

5 Walkthroughs

1

Bouw een leeslijst en werk die bij

14 stappen
Volg een verzoek vanaf de URL tot en met het JSON-antwoord, dien daarna een nieuw record in en handel het resultaat van de server af.
  1. 1
    IntroductieVolg één uitwisseling

    Een leeslijstpagina moet boeken laden en een notitie over een van die boeken toevoegen. De pagina is de client; de API is de server. Elke uitwisseling heeft een verzoek dat de handeling beschrijft en een antwoord dat de uitkomst beschrijft.

    We lezen eerst de uitwisseling, verbinden daarna de twee asynchrone stappen bij het laden van JSON en dienen ten slotte een wijziging in. Het antwoord van de server bepaalt wat de pagina daarna veilig kan tonen.

  2. 2
    VoorbeeldLees de resource en filters

    De pagina vraagt GET https://api.example.com/books?author=Le%20Guin&limit=5 op.

    GET vraagt om te lezen. /books duidt de resource aan. De query filtert op auteur en beperkt het aantal resultaten. %20 staat voor de spatie in “Le Guin”. De API-documentatie bepaalt deze parameternamen; de pagina kan niet zomaar een andere naam kiezen en verwachten dat de dienst die begrijpt.

  3. 3
    KernpuntOnderscheid status en verbinding

    Een antwoord kan 200 OK met een boek of 404 Not Found met een fout melden. Beide bewijzen dat een server heeft geantwoord. Een verbindingsfout levert geen HTTP-status aan de pagina.

    Bekijk het tabblad Network voor de volledige URL, methode, status, headers en inhoud. Als de API de verwachte JSON teruggaf, onderzoek je vervolgens de code die die gegevens leest of toont.

  4. 4
    UitdagingKies een methode voor een wijziging

    Een notitie bestaat al. De pagina moet alleen het veld done wijzigen en de tekst behouden. Welke HTTP-methode past bij die bewerking en waarom zou GET verkeerd zijn?

    ---reveal---

    Gebruik PATCH voor de gedeeltelijke wijziging. GET is een veilige leesmethode en mag niet worden gebruikt om een gegevenswijziging aan te vragen. PUT zou een volledige vervanging beschrijven en zou velden die in de inhoud ontbreken kunnen terugzetten.

  5. 5
    UitlegWacht op het antwoord

    Begin met const response = await fetch(url). Dit wacht totdat de antwoordheaders binnenkomen en levert een Response op, niet de ontlede boeken.

    Het antwoord kan nog steeds een HTTP-fout zijn. fetch wordt bij een 404 succesvol voltooid omdat er een antwoord is. Controleer response.ok voordat je de bewerking als geslaagd beschouwt; dit is waar voor statuscodes 200 tot en met 299.

  6. 6
    VoorbeeldControleer en lees de inhoud

    Ga verder binnen de asynchrone functie:

    if (!response.ok) {
      throw new Error(`HTTP error ${response.status}`);
    }
    const data = await response.json();
    

    De tweede wachtstap leest en ontleedt de inhoud. Nu is data een JavaScript-waarde. Een omringende try/catch kan zowel de hier opgeworpen statusfout als fouten bij het ophalen of ontleden van de inhoud afhandelen.

  7. 7
    VoorbeeldZoek de geneste array

    Stel dat de inhoud {"results":[{"title":"Dune"}],"total":1} is.

    De eerste stap, data.results, bereikt de array. [0] bereikt het eerste object daarin. .title geeft "Dune". Een renderfunctie moet data.results ontvangen, niet het hele buitenste object. De voorbeeldweergave van het antwoord in Network is nuttig wanneer de structuur van de API verschilt van wat de pagina verwachtte.

  8. 8
    UitdagingOnderzoek de ontbrekende waarde

    De code gebruikt const data = response.json() en probeert daarna data.results[0]. De inhoud is inderdaad geldige JSON met een array results. Wat ontbreekt er?

    ---reveal---

    Wacht op de inhoud: const data = await response.json(). Zonder die wachtstap is data een promise en heeft die geen eigenschap results. De eerste await fetch(...) wachtte niet ook op het ontleden van de JSON.

  9. 9
    TipBehoud leestekens in een zoekopdracht

    Bouw queryparameters met de URL-API:

    const url = new URL("https://api.example.com/search");
    url.searchParams.set("q", "rock & roll");
    

    De waarde wordt rock+%26+roll. De ampersand blijft binnen de zoekterm in plaats van de query te splitsen. Gebruik het ontlede antwoord na het laden opnieuw: een tweede methode aanroepen om de inhoud van hetzelfde antwoord te lezen mislukt omdat de inhoud al is gelezen.

  10. 10
    VoorbeeldBereid een JSON-verzending voor

    Om een notitie aan te maken, serialiseer je de velden en vermeld je hun formaat:

    const response = await fetch("https://api.example.com/notes", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ title: "Read", done: false }),
    });
    

    De methode vraagt om aanmaken, de header geeft JSON aan en de inhoud bevat JSON-tekst in plaats van een gewoon object.

  11. 11
    VerbandGebruik het opgeslagen record

    De server kan 201 Created teruggeven met {"id":31,"title":"Read","done":false}. Voeg dat teruggegeven record toe aan de toestand van de pagina. Met de ID kan een latere handeling /notes/31 aanroepen.

    Geef voor een formulier met bestanden FormData door in plaats van JSON en laat de browser het scheidingsteken voor de meerdelige inhoud instellen. Een GET-verzoek kan via fetch geen inhoud bevatten; zoekvelden horen in de querystring.

  12. 12
    UitdagingHandel succes zonder inhoud af

    Het verwijderen van een opgeslagen notitie geeft 204 terug. De code controleert response.ok, roept daarna response.json() aan en toont een fout. Is de verwijdering noodzakelijkerwijs mislukt en wat moet veranderen?

    ---reveal---

    Nee: 204 meldt succesvolle voltooiing zonder inhoud. Sla voor die status het ontleden van JSON over en werk de pagina bij na de statuscontrole. De ontleedfout ontstond doordat de code lege inhoud probeerde te lezen, niet doordat vaststaat dat de verwijdering is mislukt.

  13. 13
    UitdagingBekijk een volledige verzendstroom

    Een opslagknop kan tweemaal worden aangeklikt terwijl een POST loopt. Een succesvol antwoord levert een nieuwe ID. Noem de twee handelingen van de pagina die een onbedoeld duplicaat voorkomen en die ID bewaren.

    ---reveal---

    Schakel de knop uit tijdens het verzoek en herstel die in finally. Werk de pagina bij succes bij vanuit het teruggegeven record, inclusief de ID. De knop voorkomt herhaalde klikken; het serverresultaat levert waarden die niet in de ingediende gegevens bestonden.

  14. 14
    SamenvattingControleer de uitwisseling bij elke grens

    Wanneer een verzoek zich onverwacht gedraagt, onderzoek je de bewerking in volgorde: de gedocumenteerde URL en methode, de werkelijke status, de gekozen methode om de inhoud te lezen en de gegevensstructuur die aan de pagina wordt doorgegeven.

    Controleer bij een schrijfbewerking ook het inhoudstype en de geserialiseerde inhoud. Succes zonder inhoud vereist geen JSON-lezer. Een antwoord op een aanmaakverzoek moet het opgeslagen record leveren dat voor de volgende wijziging of verwijdering wordt gebruikt.

2

Bouw een zoekpagina die actueel blijft

18 stappen
Render een lijst, geef een prijs en datum de juiste opmaak en houd de verzoekstatus correct bij trage, mislukte en overlappende zoekopdrachten.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieHoud het scherm gekoppeld aan de zoekopdracht
  2. 2
    VoorbeeldVervang de vorige lijst
  3. 3
    KernpuntHoud nul en ontbrekende gegevens uit elkaar
  4. 4
    UitdagingVerwerk externe tekst en links
  5. 5
    VoorbeeldLees de tijdseenheid
  6. 6
    UitlegKies de tijdzone voor de weergave
  7. 7
    VoorbeeldMaak gedocumenteerde kleinere munteenheden op
  8. 8
    UitdagingHoud landinstelling en waarde gescheiden
  9. 9
    UitlegBegin met zichtbaar wachten
  10. 10
    VoorbeeldRond alle paden af
  11. 11
    UitdagingHerken een geslaagde lege zoekopdracht
  12. 12
    TipWacht voor een nieuwe poging bij een tijdelijk probleem
  13. 13
    VoorbeeldLet op de volgorde van voltooiing
  14. 14
    VoorbeeldAnnuleer een verouderd verzoek
  15. 15
    VerbandVerminder aanroepen tijdens het typen
  16. 16
    UitdagingKies voor gedeeltelijk succes
  17. 17
    UitdagingBescherm de hele huidige interactie
  18. 18
    SamenvattingTest de interface met onvolmaakte antwoorden
3

Onderzoek een API-aanroep naar een andere oorsprong

10 stappen
Volg de toestemming van de browser om te lezen afzonderlijk van de autorisatie door de server en de bescherming van een aanbiedersleutel.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieHoud twee toestemmingsvragen gescheiden
  2. 2
    VoorbeeldVergelijk de volledige oorsprongen
  3. 3
    UitlegLees de toestemming van de server
  4. 4
    VoorbeeldVolg eerst het voorafgaande toestemmingsverzoek
  5. 5
    UitdagingLeg uit waarom iets alleen in de terminal slaagt
  6. 6
    VoorbeeldZoek de zichtbare sleutel
  7. 7
    VerbandVerplaats de grens van het geheim
  8. 8
    UitdagingOnderscheid transport en geheimhouding
  9. 9
    UitdagingControleer cookies en leesbare antwoorden
  10. 10
    SamenvattingOnderzoek welke grens de fout veroorzaakte
4

Herstel een opgeslagen lijst zonder de pagina te verstoren

12 stappen
Kies de levensduur van opslag, behoud gegevenstypen, valideer herstelde gegevens en pas een regel toe voor de versheid van de cache.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieBewaar een handige lokale kopie
  2. 2
    UitlegKies wat bewaard moet blijven
  3. 3
    VoorbeeldBewaar een array als tekst
  4. 4
    UitdagingHerstel het bedoelde type
  5. 5
    TipHandel een schrijfbewerking af die niet past
  6. 6
    VoorbeeldControleer meer dan de JSON-syntaxis
  7. 7
    VoorbeeldVoeg een cachetijd toe
  8. 8
    UitdagingBereken welke cache vers is
  9. 9
    VerbandVolg een thema over tabbladen
  10. 10
    KernpuntBescherm belangrijke gegevens
  11. 11
    UitdagingHerstel van een oud opgeslagen formaat
  12. 12
    SamenvattingTest een eerste en een terugkerend bezoek
5

Voeg bruikbare locatie- en kopieerknoppen toe

13 stappen
Bouw interacties die rekening houden met toestemming, met functiedetectie, duidelijke feedback en handmatige alternatieven.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieMaak de handeling begrijpelijk
  2. 2
    UitlegControleer de context en functie
  3. 3
    TipVraag toestemming wanneer de functie nuttig is
  4. 4
    VoorbeeldStel een eindige wachttijd in
  5. 5
    VoorbeeldLees alleen nuttige precisie
  6. 6
    UitdagingHerstel na een weigering
  7. 7
    VoorbeeldSchrijf tijdens de klik
  8. 8
    KernpuntWacht voordat je het kopiëren als geslaagd meldt
  9. 9
    UitdagingBeschouw een verbindingssignaal als aanwijzing
  10. 10
    VerbandHerstel een zoekopdracht vanuit een link
  11. 11
    TipControleer een andere browserfunctie
  12. 12
    UitdagingBekijk beide knoppen samen
  13. 13
    SamenvattingTest ook de keuzes van de gebruiker

Gegevens ophalen en browser-API's: oefenvragen

40 Oefenvragen in 4 sets

Set 1: Verzoeken, resultaten en browserfuncties10 Oefenvragen

Vraag 1 van 10

Een antwoord heeft status 403. Wat vertelt die status aan de pagina?
  1. De server kon het verzoek helemaal niet ontvangen.
  2. De server moet de URL van de resource doorverwijzen.
  3. De server begreep het verzoek maar weigerde het.
  4. De server accepteerde het verzoek met lege inhoud.
Toon antwoordVerberg antwoord
Antwoord: C
Een 403-antwoord betekent dat de server het verzoek begreep en weigert uit te voeren. Het bewijst niet dat de gebruiker geldige inloggegevens heeft opgegeven of dat inloggen de weigering oplost. Een mislukte netwerkverbinding zou geen HTTP-status opleveren die de pagina kan lezen.

Vraag 2 van 10

Een API geeft 200 terug met {"items":[{"name":"Cedar"}]}. Welke toewijzing slaat de naam van het eerste item op na const response = await fetch(url)?
  1. const name = (await response.json()).items[0].name;
  2. const name = response.json().items[0].name;
  3. const name = (await response.json())[0].items.name;
  4. const name = (await response.text()).items[0].name;
Toon antwoordVerberg antwoord
Antwoord: A
Wacht op json() om de inhoud te lezen en te ontleden en volg daarna de buitenste eigenschap items naar het eerste object van de array. Als je json() zonder await aanroept, houd je een promise over die geen array items heeft. Lezen met text() geeft een string, niet het ontlede object dat nodig is om eigenschappen te benaderen.

Vraag 3 van 10

Een API-eindpunt accepteert JSON-inhoud. Welke waarde moet body krijgen wanneer je { label: "Read" } verstuurt?
  1. JSON.parse({ label: "Read" })
  2. String({ label: "Read" })
  3. { label: "Read" }.toString()
  4. JSON.stringify({ label: "Read" })
Toon antwoordVerberg antwoord
Antwoord: D
JSON.stringify zet het object om in geldige JSON-tekst voor de verzoekinhoud. Een gewoon object converteren met String of toString() levert "[object Object]" op, wat het JSON-eindpunt niet kan ontleden. Het verzoek heeft ook de gedocumenteerde methode en een header met het JSON-inhoudstype nodig.

Vraag 4 van 10

Een API geeft { remaining: 0, owner: null } terug. Hoe kan de pagina het resterende aantal tonen en voor de ontbrekende naam van de eigenaar "Unknown" gebruiken?
  1. data.remaining || "n/a"; data.owner?.name ?? "Unknown";
  2. data.remaining ?? "n/a"; data.owner?.name ?? "Unknown";
  3. data.remaining ?? "n/a"; data.owner.name ?? "Unknown";
  4. data.remaining || "n/a"; data.owner.name || "Unknown";
Toon antwoordVerberg antwoord
Antwoord: B
Terugval bij null of undefined behoudt het geldige aantal nul en optionele ketenvorming voorkomt dat name uit null wordt gelezen. Als je || voor het aantal gebruikt, wordt nul vervangen omdat nul falsy is. Een terugvaloptie na data.owner.name helpt niet wanneer het opvragen van name al een fout heeft opgeworpen.

Vraag 5 van 10

Een API documenteert amount: 3785, currency: "USD" als een geheel aantal kleinere munteenheden. Welk getal moet aan de valutaopmaakfunctie worden doorgegeven?
  1. 3785
  2. 37.85
  3. 378.5
  4. 0.3785
Toon antwoordVerberg antwoord
Antwoord: B
USD heeft 100 kleinere munteenheden per hoofdeenheid, dus het gedocumenteerde gehele getal staat voor 37,85 Amerikaanse dollar. Als je 3785 rechtstreeks doorgeeft, wordt een bedrag getoond dat 100 keer te groot is. Intl.NumberFormat maakt het getal op dat het ontvangt; het leidt niet af dat een API-bedrag in centen is.

Vraag 6 van 10

Een zoekopdracht schakelt de knop uit en wacht daarna op een verzoek. De knop wordt pas weer ingeschakeld nadat succesvolle resultaten zijn gerenderd. Na een mislukt verzoek blijft de knop uitgeschakeld. Waar hoort de gezamenlijke instructie om de knop weer in te schakelen?
  1. In de succestak na het wissen van de status.
  2. In een timer die vóór de antwoordcontrole start.
  3. In een catch-blok dat alle opruiming bij succes vervangt.
  4. In een finally-blok rond het werk waarop wordt gewacht.
Toon antwoordVerberg antwoord
Antwoord: D
finally wordt na het beschermde werk uitgevoerd, of dat nu slaagt of een fout opwerpt. Het is dus de juiste plaats voor opruiming die op beide paden nodig is. Als de knop alleen in catch wordt hersteld, gebeurt dat niet bij succes; als dat pas na het renderen gebeurt, ontbreekt het bij een fout. Een timer zou bedieningselementen herstellen zonder te weten of het verzoek is voltooid.

Vraag 7 van 10

Een pagina staat op https://studio.example.org/edit. Wat is de oorsprong van die pagina?
  1. https://studio.example.org
  2. https://studio.example.org/edit
  3. https://example.org
  4. http://studio.example.org
Toon antwoordVerberg antwoord
Antwoord: A
De oorsprong bestaat uit schema, host en poort; HTTPS gebruikt de standaardpoort wanneer er geen wordt getoond. Het pad /edit duidt een resource binnen de oorsprong aan en maakt geen deel uit van de oorsprong zelf. Als je het schema wijzigt naar HTTP, ontstaat een andere oorsprong, ook bij dezelfde host.

Vraag 8 van 10

Een frontendbuild leest een geheime aanbiederssleutel uit een genegeerd omgevingsbestand en verstuurt die in een HTTPS-verzoekheader. Een bezoeker kopieert de sleutel uit Network. Welke wijziging beschermt een vervangende sleutel tegen bezoekers in de browser?
  1. Verwijder het genegeerde bestand en behoud dezelfde gedownloade build.
  2. Bouw opnieuw met een kortere variabelenaam en behoud dezelfde header.
  3. Trek de uitgelekte sleutel in en laat een server de vervanging toevoegen.
  4. Plaats een vervangende sleutel in de verzoekinhoud en verwijder de header.
Toon antwoordVerberg antwoord
Antwoord: C
Trek de gekopieerde sleutel in en bewaar de vervanging op een server die de aanbieder aanroept. Een genegeerd omgevingsbestand beschermt het versiebeheer, terwijl een frontendbuild de waarden nog steeds kan publiceren. HTTPS beschermt het transport en de sleutel verplaatsen tussen velden van een browserverzoek verbergt die niet voor de gebruiker van de browser.

Vraag 9 van 10

Wat is na localStorage.setItem("visits", 8) de waarde van localStorage.getItem("visits") + 1?
  1. "81"
  2. 9
  3. "9"
  4. 81
Toon antwoordVerberg antwoord
Antwoord: A
Web Storage geeft de string "8" terug, dus + 1 schakelt strings aaneen en geeft "81". Het numerieke type dat aan setItem is doorgegeven, wordt niet hersteld. Converteer de opgeslagen string met Number voordat je optelt als het bedoelde resultaat het getal 9 is.

Vraag 10 van 10

Een locatieverzoek mislukt met geolocatiefoutcode 1. Welke reactie aan de gebruiker past bij deze fout?
  1. Leg uit dat de tijdslimiet is verstreken en probeer direct opnieuw.
  2. Leg uit dat er geen positie bestaat en verberg het weerformulier.
  3. Leg uit dat locatietoegang is geweigerd en bied invoer van een stad aan.
  4. Leg uit dat geen positie beschikbaar was en bied een nieuwe poging aan.
Toon antwoordVerberg antwoord
Antwoord: C
Geolocatiefoutcode 1 betekent dat toestemming is geweigerd, dus bied een andere manier aan om de locatie in te voeren. Een overschreden tijdslimiet heeft code 3 en verklaart deze fout niet. Herhaalde verzoeken kunnen toestemming niet afdwingen; bij een onthouden weigering moet de gebruiker mogelijk de site-instellingen van de browser wijzigen.
Set 2: Volg gegevens door de interface10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een aanroep van fetch geeft een Response met status 502 terug. De code heeft een catch-handler maar controleert nooit response.ok. Waarom verschijnt de HTTP-foutmelding mogelijk nooit?
  1. Een HTTP-fout wordt pas afgewezen nadat de catch-handler terugkeert.
  2. Bij een HTTP-fout wordt fetch succesvol voltooid; de code moet de status controleren.
  3. Een 502-antwoord blijft verborgen totdat de JSON-inhoud is gelezen.
  4. Een catch-handler ontvangt serverstatussen alleen met no-cors.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een gedocumenteerd API-eindpunt voor verwijderen geeft bij succes 204 terug. Wat moet de pagina doen voordat ze JSON probeert te ontleden?
  1. Herken 204 als fout en herhaal dezelfde verwijdering.
  2. Herken 204 als succes en ontleed een leeg object.
  3. Herken 204 als doorverwijzing en haal dezelfde URL op.
  4. Herken 204 als succes en sla het lezen van de inhoud over.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een nieuwe zoekopdracht voegt de items toe aan de oude resultaten. Een afzonderlijke knop “Meer laden” moet pagina's blijven toevoegen. Hoe moet het rendergedrag verschillen?
  1. Wis bij een nieuwe zoekopdracht; voeg toe bij een volgende pagina.
  2. Voeg toe bij een nieuwe zoekopdracht; wis bij een volgende pagina.
  3. Wis bij beide acties voordat je de resultaten toevoegt.
  4. Voeg bij beide acties toe en verwijder alleen lege items.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Twee onafhankelijke leesbewerkingen duren ongeveer 240 ms en 680 ms. Hoe lang duurt het wachten op beide via Promise.all, afgezien van bijkomende verwerkingstijd?
  1. Ongeveer 920 ms.
  2. Ongeveer 240 ms.
  3. Ongeveer 680 ms.
  4. Ongeveer 440 ms.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een zoekopdracht naar “lo” start, daarna start een zoekopdracht naar “lotus”. Het voltooien van een oudere opdracht kan de nieuwe laadmelding verbergen en een oudere fout kan nieuwere resultaten vervangen. Annulering is niet beschikbaar in de omhullende functie voor verzoeken. Welk bijwerkbeleid houdt het hele scherm gekoppeld aan de huidige zoekopdracht?
  1. Alleen geslaagde aanroepen vergelijken hun nummer vóór het renderen.
  2. Alleen mislukte aanroepen vergelijken hun nummer vóór een foutmelding.
  3. Alleen de nieuwste aanroep mag resultaten, fouten of laadstatus bijwerken.
  4. Elke aanroep wist de lijst wanneer het eigen verzoek wordt voltooid.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een pagina verstuurt vanaf een andere oorsprong een JSON-POST met Content-Type: application/json. Er is geen toestemming voor een voorafgaand verzoek gecachet. Wat moet de browser controleren voordat die de POST verstuurt?
  1. Een GET-antwoord met dezelfde JSON als de geplande POST.
  2. Een OPTIONS-antwoord dat de oorsprong, methode en headers toestaat.
  3. Een OPTIONS-verzoek met de antwoordheader voor toegestane oorsprong.
  4. Een POST-antwoord dat meldt dat de pagina oorsprongsregels uitschakelde.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een formulier met meerdere stappen moet in het tabblad opnieuw laden overleven, maar eindigen met de sessie van dat tabblad. Welke opslagkeuze past daarbij?
  1. Gebruik localStorage en laat het item staan totdat code het verwijdert.
  2. Bewaar de voortgang alleen in een JavaScript-variabele in het geheugen.
  3. Gebruik localStorage en wis het item telkens wanneer de pagina laadt.
  4. Gebruik sessionStorage om de huidige voortgang van het tabblad te bewaren.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een cache vervalt na 6 minuten. Die is om 09.12.00 uur opgeslagen en om 09.19.30 uur gelezen. Hoe moet de app die behandelen?
  1. De cache is 450.000 ms oud en vereist nieuwe gegevens.
  2. De cache is 75.000 ms oud en kan als vers worden gebruikt.
  3. De cache is 450.000 ms oud en kan als vers worden gebruikt.
  4. De cache is 7.500 ms oud en vereist nieuwe gegevens.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een weerapp werkt op http://localhost, maar de locatiefunctie ontbreekt wanneer de app op een telefoon via een HTTP-netwerkadres wordt geopend. De app stopt ook met werken wanneer desktopgebruikers locatietoegang weigeren. Welk ontwerp verhelpt beide problemen?
  1. Vraag locatie opnieuw bij het laden en verberg stadsinvoer na weigering.
  2. Gebruik HTTPS, detecteer geolocatie en houd stadsinvoer beschikbaar.
  3. Controleer de browsernaam en vraag locatie zonder tijdslimiet op.
  4. Behoud HTTP, stel hoge nauwkeurigheid in en verwijder toestemmingscontroles.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een kopieerhandler wacht op navigator.clipboard.writeText(text). Op welk moment moet die “Copied!” tonen?
  1. Nadat die promise succesvol is voltooid.
  2. Zodra writeText iets teruggeeft.
  3. Wanneer functiedetectie slaagt.
  4. Zodra de gebruiker klikt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Spoor fouten op in verzoeken, opslag en toestemming10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een dienst documenteert PUT /profiles/29 als vervanging van het profiel. Wat betekent idempotentie wanneer hetzelfde volledige verzoek tweemaal wordt verstuurd?
  1. De twee antwoorden moeten exact dezelfde status en headers bevatten.
  2. Het tweede verzoek moet worden afgewezen voordat het de dienst bereikt.
  3. De server moet voor elk identiek verzoek een nieuw profiel maken.
  4. Het bedoelde opgeslagen profiel is hetzelfde als na één verzoek.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een aanmaakverzoek overschrijdt de tijdslimiet nadat de server het mogelijk heeft ontvangen. De pagina probeert direct opnieuw, rendert alleen de ingediende velden en verstuurt daarna een wijziging naar een ongedefinieerde ID. Welk ontwerp moet deze reeks vervangen?
  1. Voorkom herhaling, onderzoek onzekere aanmaakacties en bewaar teruggegeven ID's.
  2. Herhaal na tijdslimieten, behoud ingediende velden en leid ID's af uit de lijstvolgorde.
  3. Voorkom klikken, herhaal na elke tijdslimiet en behoud alleen ingediende velden.
  4. Sta herhaling toe, negeer teruggegeven ID's en gebruik de aanmaak-URL voor wijzigingen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een event-API documenteert het tijdstempel in seconden. Een pagina geeft dat rechtstreeks door aan new Date en toont januari 1970. Welke conversie moet vóór het opmaken van de datum plaatsvinden?
  1. Deel het tijdstempel door 1000.
  2. Tel de UTC-offset van de lezer erbij op.
  3. Vermenigvuldig het tijdstempel met 1000.
  4. Vervang de landinstelling van de opmaakfunctie.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een catalogus behoudt de gegevens van gisteren nadat verversen 503 met Retry-After: 12 teruggeeft. Welk gedrag maakt de toestand duidelijk en ondersteunt herstel?
  1. Verberg de fout en vermeld bij de oude gegevens dat ze zojuist zijn bijgewerkt.
  2. Duid de gegevens aan als oud en wacht minstens 12 seconden voor een begrensde nieuwe poging.
  3. Wis de lijst en herhaal direct totdat een successtatus binnenkomt.
  4. Behandel het antwoord als leeg succes en schakel alle toekomstige verversingen uit.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een accountweergave heeft een profiel en de naam van het bijbehorende team nodig. Het profiel geeft teamId terug. Meldingen zijn onafhankelijk en mogen mislukken zonder accountgegevens te verbergen. Hoe moet het werk worden ingedeeld?
  1. Start alle verzoeken samen en wijs de hele weergave af bij elke fout.
  2. Voer een profiel-naar-teamketen uit naast meldingen; handel elke uitkomst apart af.
  3. Wacht na elkaar op meldingen, profiel en team met één gedeelde foutafhandeling.
  4. Start meldingen na het profiel; start het team alleen als meldingen ook slagen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een geheime sleutel van een aanbieder is gecommit naar een repository. Welke actie pakt het gebruik van de uitgelekte inloggegevens aan?
  1. Verwijder de sleutel alleen uit de nieuwste commit.
  2. Hernoem de sleutel in de JavaScript-broncode.
  3. Verplaats de sleutel naar een openbare verzoekheader.
  4. Trek de sleutel in en maak een vervanging.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een opgeslagen booleaanse waarde wordt hersteld met if (localStorage.getItem("compact")). De opgeslagen tekst is "false", maar toch gaat de compacte modus aan. Waarom?
  1. Web Storage herstelt booleaanse waarden met hun oorspronkelijke type.
  2. Een ontbrekende opslagsleutel geeft standaard de string "true" terug.
  3. Een niet-lege string is truthy, ook als de tekst "false" is.
  4. De if-instructie verandert de opgeslagen tekst in een ware waarde.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Twee tabbladen met dezelfde oorsprong delen de compacte modus als de strings “true” of “false”. Tabblad A slaat “false” op maar wacht op het eigen storage-event; tabblad B handelt het event af met Boolean(event.newValue). Als de sleutel wordt verwijderd, moet de compacte modus uitgaan. Welke bijwerkregel behandelt alle drie gevallen?
  1. Pas wijzigingen toe in het schrijvende tabblad en de listeners; schakel alleen in voor de string “true”.
  2. Vertrouw op events in beide tabbladen; schakel in voor elke niet-lege opgeslagen string.
  3. Pas wijzigingen alleen toe in het schrijvende tabblad; behoud de vorige modus in andere tabbladen.
  4. Laad het schrijvende tabblad opnieuw; gebruik Boolean op eventwaarden en behoud de modus na verwijdering.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een locatieresultaat heeft breedtegraad -12.0464, lengtegraad -77.0428 en nauwkeurigheid 80. Wat beschrijft 80?
  1. Een geschatte positie op 80 meter boven zeeniveau.
  2. Een kans van 80 procent dat de locatie exact is.
  3. Een garantie dat het apparaat zich binnen 80 meter bevindt.
  4. Een geschatte horizontale onzekerheidsstraal van 80 meter.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een pagina op https://recipes.example.org/search?q=green+tea leest new URL(location.href).searchParams.get("q"). Welke waarde krijgt de pagina?
  1. "green+tea"
  2. "q=green+tea"
  3. "green tea"
  4. null
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Ontwerp betrouwbare API-functies10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een API beperkt een toepassing tot 80 aanroepen per minuut. Verzoeken boven die limiet krijgen 429. Wat betekent die status?
  1. Het opgevraagde record is verdwenen.
  2. Er zijn te veel verzoeken gedaan.
  3. Een volledige vervanging is vereist.
  4. Het API-eindpunt is definitief verplaatst.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een zoekopdracht moet de exacte waarde “A+B & C” versturen. Welke code stelt die waarde in zonder de leestekens als URL-structuur te behandelen?
  1. url.search = "q=" + "A+B & C";
  2. url.hash = "q=" + "A+B & C";
  3. url.searchParams.set("q", "A+B & C");
  4. url.pathname += "?q=" + "A+B & C";
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een API-record heeft een titel met letterlijke <b>-tekst, een javascript:-link en remaining: 0. De pagina moet de letterlijke titel tonen, alleen gewone weblinks toestaan en het aantal behouden. Welk renderplan voldoet aan alle drie eisen?
  1. Gebruik textContent, controleer HTTP(S)-URL's en geef het aantal een standaardwaarde met ??.
  2. Gebruik innerHTML, controleer HTTP(S)-URL's en geef het aantal een standaardwaarde met ??.
  3. Gebruik textContent, wijs elke href toe en geef het aantal een standaardwaarde met ??.
  4. Gebruik textContent, controleer HTTP(S)-URL's en geef het aantal een standaardwaarde met ||.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Twee lezers bekijken hetzelfde UTC-moment met Intl.DateTimeFormat en een vaste landinstelling en-US, maar zonder de optie timeZone. Hun weergegeven kloktijden verschillen. Wat verklaart het verschil?
  1. De landinstelling kiest de UTC-offset van elke lezer.
  2. De Date wijzigt het opgeslagen moment per apparaat.
  3. De Z aan het einde wordt zonder timeZone genegeerd.
  4. De opmaakfunctie gebruikt de tijdzone van elk apparaat.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een zoekopdracht geeft geldige JSON terug met een lege resultatenarray. De handler toont de algemene foutmelding en houdt de knop uitgeschakeld. Welke toestandsovergang past bij deze uitkomst?
  1. Toon leeg succes, behoud de laadstatus en blijf pagina's opvragen.
  2. Toon een dienstfout, wis de laadstatus en probeer onbeperkt opnieuw.
  3. Toon leeg succes, wis de laadstatus en herstel het bedieningselement.
  4. Toon succes met oude resultaten en houd het bedieningselement uitgeschakeld.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een dashboard laadt een account in 400 ms en heeft daarna de teruggegeven ID nodig om een team in 200 ms te laden. Onafhankelijke meldingen duren 700 ms en mogen mislukken zonder accountgegevens te verbergen. Welke indeling ondersteunt dat gedrag en hoe lang duurt het ongeveer als elke leesbewerking slaagt?
  1. Start alle drie samen en wijs de weergave af bij een fout; ongeveer 700 ms.
  2. Laad account en dan team naast meldingen, met aparte afhandeling; ongeveer 700 ms.
  3. Laad account, team en dan meldingen met één gedeelde catch; ongeveer 1300 ms.
  4. Laad account naast meldingen en daarna team als beide slagen; ongeveer 900 ms.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een JSON-PATCH naar een andere oorsprong gebruikt credentials: "include". Het voorafgaande toestemmingsverzoek staat dit toe. Het uiteindelijke antwoord heeft een wildcard voor toegestane oorsprongen en staat inloggegevens toe, waardoor JavaScript het niet kan lezen. De server neemt ook aan dat CORS gebruikerscontroles overbodig maakt. Welk antwoord- en toegangsbeleid herstelt dit ontwerp?
  1. Behoud de wildcard, schrap toestemming voor inloggegevens en autoriseer elke handeling.
  2. Noem de paginaoorsprong, behoud toestemming voor inloggegevens en gebruik CORS als autorisatie.
  3. Behoud de wildcard en toestemming voor inloggegevens, maar autoriseer elke handeling.
  4. Noem de paginaoorsprong, behoud toestemming voor inloggegevens en autoriseer elke handeling.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een aanbieder documenteert een kaartsleutel als geschikt voor openbaar gebruik in de browser. Welke configuratie beperkt de toegestane sites, API-bewerkingen en het totale gebruik van die sleutel?
  1. Beperk domeinen en API's en stel gebruiksquota in.
  2. Beperk domeinen en API's, maar laat gebruik onbeperkt.
  3. Beperk API's en quota, maar sta elk domein toe.
  4. Beperk domeinen en quota, maar sta elke API toe.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een laadfunctie voor concepten ontleedt opgeslagen tekst en roept direct .map aan. Sommige gebruikers hebben geldige JSON {"version":1,"items":[]} van oudere code, anderen hebben beschadigde tekst. Welk herstelplan behandelt beide gevallen?
  1. Vang alleen schrijffouten af en gebruik elke ontlede waarde als array.
  2. Vervang JSON.parse door JSON.stringify voordat je .map aanroept.
  3. Vang lees- en ontleedfouten af en valideer of converteer de opgeslagen structuur.
  4. Gebruik ?? [] na het ontleden en neem aan dat waarden die niet null zijn arrays zijn.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een laptop meldt navigator.onLine === true, maar een API-aanroep wordt afgewezen. Wat moet de pagina afleiden over de verbinding en vervolgens afhandelen?
  1. De API is bereikbaar; interpreteer de afwijzing alleen als ongeldige JSON.
  2. Er is een netwerk gedetecteerd, maar de API kan onbereikbaar zijn; handel de verzoekfout af.
  3. De API is onbereikbaar; verander de onlinevlag van de browser naar false.
  4. De API is bereikbaar; probeer direct opnieuw totdat die een antwoord geeft.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

68 Kernbegrippen, elk met een definitie

A

AbortController
Een AbortController levert een signaal voor een annuleerbare bewerking en kan annulering aanvragen door de abort-methode aan te roepen.
De zoekfunctie maakt een AbortController en geeft het signaal door aan fetch voordat een latere actie het verzoek annuleert.
AbortSignal
Een AbortSignal koppelt annulering of een tijdslimiet aan een asynchrone bewerking zoals fetch en het lopende lezen van de inhoud.
Een AbortSignal van AbortSignal.timeout(4000) begrenst een verzoek tot vier seconden actieve tijd.
antwoordinhoud
Antwoordinhoud is de inhoud die na de antwoordheaders wordt verstuurd en die JSON, tekst, binaire gegevens of helemaal geen inhoud kan bevatten.
De pagina leest de antwoordinhoud eenmaal en bewaart het resulterende object voor zowel renderen als filteren.
API-eindpunt
Een API-eindpunt is een API-adres dat een gedocumenteerd verzoek voor een resource of bewerking accepteert, vaak met een bepaalde HTTP-methode.
Het API-eindpunt voor notities accepteert een POST om een notitie aan te maken en geeft de identificatiecode van het nieuwe record terug.
API-sleutel
Een API-sleutel is een inloggegeven dat een aanroepende toepassing identificeert, zodat een aanbieder toegang kan beheersen, gebruik kan tellen en limieten of kosten kan toepassen.
Een API-sleutel die zichtbaar is in de browser kan worden gekopieerd, dus een geheime aanbiederssleutel moet op de aanroepende server blijven.

B

Baseline
Baseline is de samenvatting van MDN over de beschikbaarheid van functies in belangrijke browsers, die naast gedetailleerde informatie over ondersteuning en vereisten wordt gebruikt.
Baseline controleren helpt bij het plannen van browsertests voordat de pagina afhankelijk wordt van een pas geleerde browser-API.
beleid voor dezelfde oorsprong
Het beleid voor dezelfde oorsprong is een beveiligingsgrens van de browser die beperkt hoe een script resources van een andere oorsprong kan lezen.
Door het beleid voor dezelfde oorsprong hangt een fetch-verzoek naar een andere oorsprong af van de CORS-leestoestemming van de API-server.

C

cache
Een cache is een opgeslagen kopie van gegevens om herhaling van werk of verzoeken te voorkomen, met een door de app bepaald beleid om te beslissen wanneer die vers is.
Een weercache kan direct een recente weersverwachting tonen, terwijl een vervallen item een nieuw verzoek activeert.
CORS
CORS is het mechanisme met HTTP-headers waarmee een server browserscripts op andere oorsprongen toestemming kan geven om zijn antwoorden te lezen.
De API gebruikt CORS om een pagina op een genoemde site weergegevens van een andere host te laten lezen.
cross-site scripting
Cross-site scripting is het uitvoeren van een niet-vertrouwd script in een pagina, wat kan gebeuren wanneer externe strings als HTML worden geïnterpreteerd.
Door textContent voor API-titels te gebruiken, voorkom je de HTML-interpretatie die cross-site scripting mogelijk kan maken.

E

exponentieel oplopende wachttijd
Een exponentieel oplopende wachttijd vergroot de pauze tussen nieuwe pogingen met een vermenigvuldigingsfactor, waardoor herhaalde belasting bij een tijdelijke fout afneemt.
Bij een exponentieel oplopende wachttijd kunnen de pauzes tussen een begrensde reeks nieuwe pogingen één, twee en vier seconden duren.

F

FormData
FormData is een browserobject dat formuliervelden en bestanden verzamelt om te versturen, zodat fetch een meerdelige verzoekinhoud kan opbouwen.
Als je FormData als inhoud doorgeeft, kan de browser de geselecteerde afbeelding naast de tekstvelden van het formulier versturen.
functiedetectie
Functiedetectie controleert of een functie beschikbaar is voordat code die gebruikt, zodat de pagina een ondersteunde route of terugvaloptie kan kiezen.
Functiedetectie met "geolocation" in navigator bepaalt of de pagina de apparaatlocatie kan aanbieden.

G

gebruikersactivering
Gebruikersactivering is door de browser herkende interactie, zoals een recente klik, die vereist kan zijn voordat een beperkte functie wordt toegestaan.
Een schrijfbewerking naar het klembord rechtstreeks in een klikhandler aanroepen levert gebruikersactivering waar de browser die vereist.
gemengde inhoud
Gemengde inhoud ontstaat wanneer een veilige pagina een onveilige resource opvraagt; browsers blokkeren HTTP-fetch-aanroepen van HTTPS-pagina's.
Een HTTP-URL voor een weersverwachting veroorzaakt een fout door gemengde inhoud wanneer de weerpagina zelf via HTTPS is geladen.
geolocatie
Geolocatie is een browser-API die met toestemming van de gebruiker een geschatte apparaatpositie verkrijgt en succes of een fout meldt.
Geolocatie kan coördinaten leveren voor een weersverwachting in de buurt; na een weigering kan de gebruiker een stad intypen.

H

header
Een header is een benoemde waarde bij een verzoek of antwoord die de uitwisseling, de inhoud of de toegangsvereisten beschrijft.
Een Content-Type-header vertelt het ontvangende programma dat de bijbehorende inhoud JSON bevat.
HTTP-antwoord
Een HTTP-antwoord is het antwoord van een server op een verzoek, met een statuscode, headers en meestal inhoud met gegevens of een fout.
Het HTTP-antwoord meldt 404 en legt in de inhoud uit dat het opgevraagde boek niet is gevonden.
HTTP-verzoek
Een HTTP-verzoek is een bericht van een client aan een server met een methode, URL, headers en, voor sommige bewerkingen, inhoud.
Het HTTP-verzoek vraagt /books op en bevat een queryparameter die het aantal resultaten beperkt.
HttpOnly
HttpOnly is een cookieattribuut dat voorkomt dat JavaScript op de pagina de cookie leest, terwijl die nog steeds met passende verzoeken kan meegaan.
Een cookie met het kenmerk HttpOnly verschilt van localStorage-gegevens, die scripts op de oorsprong kunnen lezen.

I

idempotentie
Idempotentie betekent dat herhaling van een identieke bewerking hetzelfde bedoelde effect op de servertoestand heeft als de bewerking eenmaal uitvoeren.
Een notitie tweemaal verwijderen illustreert idempotentie: de notitie blijft afwezig, ook als de tweede status verschilt.
IndexedDB
IndexedDB is de asynchrone database van de browser voor grotere hoeveelheden gestructureerde gegevens en bestanden die minder geschikt zijn voor kleine Web Storage-taken.
Een pagina met een grote gestructureerde collectie kan IndexedDB gebruiken in plaats van die herhaaldelijk als één opslagstring weg te schrijven.
Intl.NumberFormat
Intl.NumberFormat is een JavaScript-opmaakfunctie die leesbare strings voor getallen, valuta, percentages of eenheden maakt voor een gekozen landinstelling.
De pagina gebruikt Intl.NumberFormat opnieuw voor elke prijs in plaats van voor elk item een valutastring opnieuw op te bouwen.

J

JSON
JSON is een tekstformaat voor gestructureerde gegevens, waaronder objecten en arrays, dat moet worden ontleed voordat code de geneste waarden gebruikt.
De pagina ontleedt JSON en leest de array in de eigenschap results voordat ze lijstitems opbouwt.

K

klembord-API
Met de klembord-API kan een pagina de inhoud van het systeemklembord asynchroon lezen of schrijven, afhankelijk van de regels voor veilige context en browsertoegang.
Een kopieerknop gebruikt de klembord-API na een klik en wacht voordat de succesmelding wordt getoond.

L

laadstatus
Een laadstatus vertelt de lezer dat een asynchrone bewerking bezig is terwijl de pagina op het resultaat wacht.
De laadstatus toont “Zoeken…” voordat het verzoek begint en verdwijnt wanneer het verzoek is voltooid.
landinstelling
Een landinstelling bepaalt taal- en regionale opmaakconventies voor de weergave van waarden zoals datums, getallen en geldbedragen.
De landinstelling en-US schrijft een datum anders dan en-GB, ook wanneer beide hetzelfde moment opmaken.
leegtestatus
Een leegtestatus is de interface die wordt getoond nadat een succesvolle bewerking geen overeenkomende gegevens teruggeeft, zodat die uitkomst verschilt van een fout.
De leegtestatus meldt “Geen records komen overeen met je filter” nadat de API een geldige lege array teruggeeft.
livegebied
Een livegebied is een deel van een pagina waarvan inhoudswijzigingen door ondersteunende technologie kunnen worden aangekondigd zonder de toetsenbordfocus te verplaatsen.
Een livegebied met role="status" kondigt “Laden…” en de latere melding over zoekresultaten aan.
localStorage
localStorage is het blijvende Web Storage-gebied van een oorsprong, gedeeld door de tabbladen daarvan en bewaard na het sluiten van de browser totdat het wordt verwijderd of gewist.
Een thema dat in localStorage is opgeslagen, kan bij het volgende bezoek worden hersteld en door een ander tabblad met dezelfde oorsprong worden gelezen.
locatienauwkeurigheid
Locatienauwkeurigheid beschrijft de geschatte horizontale onzekerheid rond een gemelde positie, gemeten in meters in plaats van graden.
Een locatienauwkeurigheid van 60 meter beschrijft de geschatte onzekerheidsstraal rond de gemelde positie.

O

onderverdeling van een munteenheid
Een onderverdeling van een munteenheid is een kleinere eenheid van een valuta, zoals een cent voor USD, die sommige API's gebruiken voor gehele bedragen.
Wanneer een API kleinere USD-munteenheden documenteert, staat het gehele getal 4680 voor 46.80 Amerikaanse dollar.
ondoorzichtig antwoord
Een ondoorzichtig antwoord verbergt statusdetails, headers en inhoud voor paginacode en geeft als statuswaarde nul.
Een no-cors-fetch geeft een ondoorzichtig antwoord, zodat de pagina de JSON die ze wilde tonen niet kan verkrijgen.
ontleedfout
Een ontleedfout ontstaat wanneer tekst niet in het verwachte formaat kan worden geïnterpreteerd, zoals een HTML-pagina die aan een JSON-lezer wordt doorgegeven.
Lege inhoud bij 204 veroorzaakt een JSON-ontleedfout, ook al heeft de server de bewerking succesvol voltooid.
oorsprong
Een oorsprong is de combinatie van het schema, de host en de poort van een URL, die de browser gebruikt om verschillende toegangsgrenzen te bepalen.
Twee paden op één HTTPS-host delen een oorsprong, maar als je die host of de poort wijzigt, ontstaat een andere oorsprong.
opslagquotum
Een opslagquotum is een door de browser opgelegde limiet voor opgeslagen gegevens; als de beschikbare Web Storage-ruimte wordt overschreden, kan een schrijfbewerking een fout opwerpen.
Een app die een lijst in het geheugen bewaart, vangt een opslagquotumfout af en blijft die lijst gebruiken, ook wanneer opslaan niet lukt.
optionele ketenvorming
Optionele ketenvorming stopt een eigenschapstoegang veilig wanneer de waarde vóór ?. null of undefined is en geeft undefined terug.
Met optionele ketenvorming kan book.author?.name omgaan met een boek waarvan het auteurobject in het antwoord ontbreekt.

P

paginering
Paginering verdeelt een verzameling resultaten in kleinere groepen die een API afzonderlijk teruggeeft, meestal via pagina- of cursorparameters.
Dankzij paginering kan een knop “Meer laden” de volgende groep opvragen terwijl de al weergegeven items behouden blijven.
Promise.all
Promise.all combineert invoerpromises tot één resultatenarray wanneer ze allemaal succesvol worden voltooid en wordt afgewezen zodra een invoerpromise wordt afgewezen.
De pagina gebruikt Promise.all voor twee onafhankelijke leesverzoeken waarvan beide resultaten beschikbaar moeten zijn voor de weergave.
Promise.allSettled
Promise.allSettled wacht op elke invoerpromise en geeft voor elk een uitkomstobject terug met succes of fout.
Met Promise.allSettled kan een dashboard twee geslaagde panelen tonen en tegelijk de fout van een derde paneel uitleggen.

Q

queryparameter
Een queryparameter is een benoemde waarde in het deel van een URL na ?, die een API-eindpunt gebruikt voor invoer zoals zoekopdrachten of paginalimieten.
De queryparameter limit=12 vraagt het zoek-eindpunt om maximaal twaalf resultaten terug te geven.

R

raceconditie
Een raceconditie is een resultaat dat afhangt van de volgorde waarin asynchroon werk wordt voltooid, zoals een oudere zoekopdracht die nieuwere resultaten vervangt.
Een controle van het verzoeknummer voorkomt een raceconditie wanneer een tragere eerdere zoekopdracht na de huidige wordt voltooid.
renderen
Renderen zet gegevens om in zichtbare pagina-inhoud, bijvoorbeeld door voor elk object in de resultatenarray van een API een lijstelement te maken.
Het renderen van een nieuwe zoekopdracht begint met het wissen van de vorige lijst, waarna de huidige resultaatitems worden toegevoegd.
Response-object
Een Response-object vertegenwoordigt de headers en status die fetch teruggeeft en biedt methoden om de antwoordinhoud te lezen.
Het Response-object heeft status 200, maar de pagina wacht nog op json() om de boekgegevens te verkrijgen.
Retry-After
De header Retry-After vertelt een client wanneer die het opnieuw moet proberen, met een wachttijd in seconden of een HTTP-datum in een passend antwoord.
Een Retry-After-waarde van 15 vraagt de pagina om vijftien seconden te wachten vóór een volgend verzoek.

S

scheidingsteken voor meerdelige inhoud
Een scheidingsteken voor meerdelige inhoud scheidt velden en bestanden in meerdelige inhoud en wordt vermeld in de inhoudstypeheader.
De browser levert het scheidingsteken voor meerdelige inhoud wanneer de pagina FormData verstuurt zonder zelf Content-Type in te stellen.
serialisatie
Serialisatie zet een waarde om in een formaat dat kan worden opgeslagen of verstuurd, zoals een JavaScript-object omzetten in JSON-tekst.
Serialisatie met JSON.stringify bewaart de velden van een notitie wanneer die als JSON-verzoekinhoud worden verstuurd.
sessionStorage
sessionStorage is Web Storage met het bereik van een oorsprong en een paginasessie van een tabblad, dat waarden tijdens die sessie behoudt als de pagina opnieuw wordt geladen.
Een formulier gebruikt sessionStorage voor voortgang die opnieuw laden moet overleven zonder gedeelde blijvende toestand te worden.
statuscode
Een statuscode is een HTTP-waarde van drie cijfers die de uitkomst van een verzoek meldt, zoals succes, weigering of een serverprobleem.
Een statuscode 201 vertelt de pagina dat de server als antwoord op het verzoek een resource heeft aangemaakt.
storage-event
Een storage-event meldt een opslagwijziging aan andere daarvoor in aanmerking komende contexten met dezelfde oorsprong; een schrijver naar localStorage ontvangt het eigen event niet.
Een storage-event werkt het thema in een ander tabblad bij, terwijl het schrijvende tabblad het thema rechtstreeks toepast.
synchrone bewerking
Een synchrone bewerking wordt voltooid voordat de volgende instructie verdergaat, zodat een langdurige opslagaanroep de hoofdthread van de pagina kan blokkeren.
Een grote schrijfbewerking naar Web Storage is een synchrone bewerking die het afhandelen van de volgende gebruikersinteractie kan vertragen.

T

terugval bij null of undefined
Terugval bij null of undefined levert met ?? alleen een terugvalwaarde wanneer de waarde links null of undefined is, en behoudt geldige nullen.
Terugval bij null of undefined behoudt een API-aantal van nul in plaats van dat te vervangen door de tekst “niet beschikbaar”.
terugvaloptie
Een terugvaloptie is een alternatieve manier om een taak te voltooien wanneer de gewenste functie niet wordt ondersteund, wordt geweigerd of niet kan worden voltooid.
Een linkveld selecteren om met het toetsenbord te kopiëren biedt een terugvaloptie als automatische toegang tot het klembord mislukt.
textContent
De eigenschap textContent leest of stelt de tekst van een element in zonder de opgegeven string als HTML-opmaak te interpreteren.
Als je een titel aan textContent toewijst, worden de punthaken letterlijk weergegeven en wordt er geen HTML-element gemaakt.
tijdzone
Een tijdzone bepaalt de lokale kalenderdatum en kloktijd voor de weergave van een moment, inclusief de toepasselijke offsetregels.
Een expliciete UTC-tijdzone laat elke lezer de kloktijd van een gebeurtenis in UTC zien in plaats van in de tijdzone van het apparaat.
toegangstoken
Een toegangstoken is een inloggegeven dat bepaalde toegang verleent voor een gebruiker of sessie en de houder toestaat toegestane verzoeken te doen.
De Authorization-header van het verzoek bevat een toegangstoken voor de toegestane bewerking van de ingelogde gebruiker.
toestemming
Toestemming is een door de browser beheerde beslissing om een pagina toegang te geven tot een beschermde functie, zoals de apparaatlocatie, of die toegang te weigeren.
Een onthouden weigering van toestemming kan een locatieverzoek laten mislukken zonder een tweede toestemmingsverzoek te tonen.

U

uitstellen tot na een rustperiode
Uitstellen tot na een rustperiode vertraagt een bewerking totdat herhaalde events stoppen, waarbij de wachttijd na elk event opnieuw begint zodat een reeks minder aanroepen oplevert.
Door zoekverzoeken uit te stellen tot na een rustperiode voorkom je een afzonderlijk verzoek voor elke toetsaanslag in een snel getypt woord.
Unix-tijdstempel
Een Unix-tijdstempel meet de verstreken tijd vanaf 1 januari 1970, UTC; de gedocumenteerde eenheid kan seconden of milliseconden zijn.
Een Unix-tijdstempel in seconden moet met 1000 worden vermenigvuldigd voordat het een JavaScript-Date-waarde wordt.
URL-codering
URL-codering geeft tekens veilig weer binnen URL-onderdelen, zodat leestekens in gegevens niet worden verward met adresstructuur.
URL-codering houdt de ampersand in de naam van een band binnen de querywaarde, in plaats van een nieuwe parameter te beginnen.
UTC
UTC is de gedeelde tijdreferentie om momenten over tijdzones heen aan te duiden, weergegeven door Z aan het einde van een ISO-datum en -tijd.
De API geeft een moment in UTC terug en de pagina maakt dat moment op voor een lezer in een andere tijdzone.

V

veilige context
Een veilige context is een browsercontext die als betrouwbaar wordt beschouwd voor beperkte API's, meestal geleverd door HTTPS of een geschikte lokale oorsprong.
Een veilige context op localhost ondersteunt ontwikkeling, terwijl een gewoon HTTP-netwerkadres mogelijk niet voldoet.
vervalgrens
Een vervalgrens is een ouderdomsgrens of tijdstip; daarna beschouwt een app een opgeslagen waarde niet meer als vers, ook als die waarde in de opslag blijft staan.
Bij een vervalgrens van tien minuten vergelijkt een app de huidige tijd met het tijdstip dat naast het gecachte antwoord is opgeslagen.
verzoekinhoud
Verzoekinhoud draagt ingediende inhoud naar een server, zoals een geserialiseerd JSON-record of formuliervelden in een aanmaakverzoek.
De verzoekinhoud bevat de titel en tekst van een notitie, terwijl de methode aangeeft dat de notitie moet worden aangemaakt.
verzoeklimiet
Een verzoeklimiet begrenst hoeveel bewerkingen een client of inloggegeven binnen een tijdsinterval mag uitvoeren en helpt een dienst het gebruik te beheersen.
Een verzoeklimiet voor zoeken kan worden overschreden door één verzoek per toetsaanslag, dus uitstellen tot na een rustperiode vermindert onnodige aanroepen.
voorafgaand toestemmingsverzoek
Een voorafgaand toestemmingsverzoek is een door de browser verstuurd OPTIONS-verzoek dat toestemming voor een bedoelde methode en verzoekheaders bij een andere oorsprong controleert.
Een JSON-POST kan een voorafgaand toestemmingsverzoek nodig hebben voordat de browser het record verstuurt dat de pagina wil aanmaken.

W

Web Storage
Web Storage biedt synchrone browseropslagplaatsen voor sleutel-waardeparen met kleine stringwaarden, gescheiden naar oorsprong en gekozen levensduur.
Web Storage bewaart een geserialiseerd instellingenobject dat de pagina herstelt wanneer die opnieuw start.
web-API
Een web-API stelt bewerkingen beschikbaar die een programma via URL's aanroept om gegevens in een ander systeem te lezen of te wijzigen.
Met een weer-web-API kan een pagina een weersverwachting voor een stad opvragen zonder een nieuwe pagina te laden.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag