Start · Sprachen · JavaScript · Referenz · Request.destination

Request.destination

Eigenschaft

Schreibgeschützte Eigenschaft, die als String angibt, welche Art von Inhalt ein <code>Request</code> anfordert, z. B. <code>"image"</code>, <code>"script"</code> oder <code>"document"</code>.

seit JavaScript Baseline: alle modernen Browser (Chrome 65+, Firef Kategorie: webapi

Signatur

get Request.destination

Beschreibung

Die Eigenschaft Request.destination gibt an, wofür der Browser eine Ressource lädt. Der Wert wird vom Browser anhand des Kontexts gesetzt, in dem die Anfrage entsteht: Ein <img>-Element ergibt "image", ein <script> ergibt "script", eine Seitennavigation ergibt "document". Der Wert ist eine Zeichenkette aus dem Enum RequestDestination.

Praktisch wichtig ist die Eigenschaft vor allem in Service Workern. Im fetch-Ereignis kann man mit event.request.destination je nach Ressourcentyp eine andere Caching-Strategie wählen, etwa „Cache zuerst“ für Bilder und Schriften und „Netzwerk zuerst“ für HTML-Dokumente. Das ist deutlich zuverlässiger, als den Typ aus der URL-Endung oder dem Accept-Header abzuleiten.

Mögliche Werte sind unter anderem: "" (leerer String, z. B. bei fetch() und XMLHttpRequest), "audio", "audioworklet", "document", "embed", "font", "frame", "iframe", "image", "json", "manifest", "object", "paintworklet", "report", "script", "serviceworker", "sharedworker", "style", "track", "video", "worker" und "xslt".

Die Eigenschaft ist schreibgeschützt. Man kann sie auch über den Request-Konstruktor nicht setzen: Mit new Request() erzeugte Anfragen haben immer den leeren String als destination.

Rückgabewert

Typ
string
Beschreibung
Ein Wert aus dem Enum RequestDestination, z. B. "image", "script", "style", "font", "document", oder "", wenn kein bestimmtes Ziel vorliegt (z. B. bei fetch()).

Beispiele

Destination einer selbst erzeugten Anfrage auslesen

const request = new Request('/api/daten.json');

// Anfragen aus fetch() oder new Request() haben kein spezielles Ziel
console.log(JSON.stringify(request.destination));
""

Caching-Strategie im Service Worker nach Ressourcentyp wählen

// sw.js
const STATISCH = new Set(['image', 'font', 'style', 'script']);

self.addEventListener('fetch', (event) => {
  const { request } = event;

  if (STATISCH.has(request.destination)) {
    // Cache zuerst für statische Ressourcen
    event.respondWith((async () => {
      const cache = await caches.open('statisch-v1');
      const treffer = await cache.match(request);
      if (treffer) return treffer;
      const antwort = await fetch(request);
      cache.put(request, antwort.clone());
      return antwort;
    })());
  } else if (request.destination === 'document') {
    // Netzwerk zuerst für Seiten, bei Offline-Zustand Fallback
    event.respondWith(
      fetch(request).catch(() => caches.match('/offline.html'))
    );
  }
  // alle anderen Anfragen (z. B. destination "") laufen normal durch
});

Ersatzbild für fehlgeschlagene Bildanfragen liefern

// sw.js
self.addEventListener('fetch', (event) => {
  if (event.request.destination !== 'image') return;

  event.respondWith((async () => {
    try {
      const antwort = await fetch(event.request);
      if (!antwort.ok) throw new Error(`HTTP ${antwort.status}`);
      return antwort;
    } catch {
      return caches.match('/bilder/platzhalter.svg');
    }
  })());
});

// Wichtig · Fallstricke

  • Leerer String bei fetch(): Anfragen, die über fetch() oder XMLHttpRequest entstehen, haben die destination "". JSON-API-Aufrufe lassen sich damit also nicht von anderen Skript-Anfragen unterscheiden. Nutze dafür die URL oder die Header.
  • Nicht setzbar: Das Init-Objekt von new Request(url, init) kennt keine Option destination. Der Wert wird ausschließlich vom Browser vergeben.
  • Nicht mit mode verwechseln: Request.mode (z. B. \"navigate\", \"cors\") beschreibt den CORS- bzw. Navigationsmodus, destination dagegen den Inhaltstyp. Für die Erkennung von Navigationen ist oft request.mode === 'navigate' sinnvoll. Bei <iframe>-Navigationen ist destination nämlich \"iframe\" und nicht \"document\".
  • Neuere Werte: Einige Werte wie \"json\" (für JSON-Module) oder \"audioworklet\" kommen erst in neueren Browsern vor. Frage deshalb gezielt bekannte Werte ab, statt mit einer vollständigen Werteliste zu rechnen.
  • Kompatibilität: Die Eigenschaft wird in allen modernen Browsern unterstützt. Der Internet Explorer unterstützt sie nicht, dort gibt es aber auch keine Service Worker.
  • Serverseitig entspricht die Information ungefähr dem Header Sec-Fetch-Dest, den moderne Browser mitsenden.