Start · Sprachen · JavaScript · Referenz · Navigator.productSub

Navigator.productSub

Eigenschaft

Die schreibgeschützte Eigenschaft <code>navigator.productSub</code> liefert eine fest eingebaute Build-Nummer, nämlich <code>"20030107"</code> oder <code>"20100101"</code>.

seit JavaScript Baseline: alle Browser (veraltet, nur aus Kompatib Kategorie: webapi

Signatur

Navigator.productSub

Beschreibung

navigator.productSub ist eine schreibgeschützte Eigenschaft des Navigator-Objekts. Sie gibt einen String zurück, der früher eine Build-Nummer des Browsers darstellen sollte. Heute steht der Wert laut HTML-Standard fest: In Chromium-basierten Browsern (Chrome, Edge, Opera) und in Safari ist er "20030107", in Firefox "20100101".

Die Eigenschaft gibt es nur noch, damit alte Webseiten nicht kaputtgehen, die früher per Browser-Sniffing Netscape bzw. Gecko erkannt haben. Über die tatsächliche Browser-Version, das Erscheinungsdatum oder das Betriebssystem sagt sie nichts aus.

In neuem Code solltest du productSub nicht verwenden. Prüfe stattdessen gezielt, ob eine Funktion vorhanden ist (Feature Detection), z. B. mit 'serviceWorker' in navigator. Wenn du wirklich Informationen über den Browser brauchst, nimm navigator.userAgentData (User-Agent Client Hints), sofern verfügbar.

Rückgabewert

Typ
string
Beschreibung
Entweder "20030107" (Chromium, Safari) oder "20100101" (Firefox). Der Wert ist fest vorgegeben und ändert sich nicht mit der Browser-Version.

Beispiele

Wert auslesen

// Gibt den festen Kompatibilitätswert aus
console.log(navigator.productSub);
"20030107" // in Chrome/Edge/Safari "20100101" // in Firefox

Die Eigenschaft ist schreibgeschützt

const vorher = navigator.productSub;
// Zuweisung wird ohne Fehler ignoriert (im Strict Mode kann ein TypeError auftreten)
try {
  navigator.productSub = '19990101';
} catch (err) {
  console.warn('Nicht schreibbar:', err.message);
}
console.log(navigator.productSub === vorher);
true

Besser: Feature Detection statt Browser-Sniffing

// Schlecht: aus productSub auf die Engine schließen
const istGecko = navigator.productSub === '20100101';
console.log('Vermutlich Firefox:', istGecko);

// Gut: direkt prüfen, ob die benötigte API vorhanden ist
if ('clipboard' in navigator && typeof navigator.clipboard.writeText === 'function') {
  await navigator.clipboard.writeText('Hallo Welt');
  console.log('Text kopiert');
} else {
  console.log('Clipboard-API nicht verfügbar');
}
Vermutlich Firefox: false Text kopiert

Moderne Alternative: User-Agent Client Hints

const browserInfo = async () => {
  if (navigator.userAgentData) {
    const { brands, mobile, platform } = navigator.userAgentData;
    return { brands: brands.map(b => `${b.brand} ${b.version}`), mobile, platform };
  }
  // Fallback für Browser ohne Client Hints
  return { userAgent: navigator.userAgent };
};

console.log(await browserInfo());
{ brands: ['Chromium 124', 'Google Chrome 124', ...], mobile: false, platform: 'Windows' }

// Wichtig · Fallstricke

  • Veraltet: Die Eigenschaft bleibt nur aus Kompatibilitätsgründen erhalten. Neuer Code sollte sich nicht darauf verlassen.
  • Kein Datum der Browser-Version: "20030107" bzw. "20100101" sind fest einprogrammiert und ändern sich bei Updates nicht. Für eine Versionsprüfung ist der Wert also nutzlos.
  • Browser-Sniffing ist unzuverlässig: Aus dem Wert lässt sich höchstens grob schließen, ob Gecko (Firefox) läuft. Erweiterungen, Datenschutz-Modi oder Emulationen können den Wert verfälschen. Prüfe lieber, ob eine Funktion vorhanden ist.
  • Fingerprinting: Der Wert unterscheidet sich zwischen den Engines und trägt deshalb ein kleines Stück zum Browser-Fingerprinting bei.
  • Kompatibilität: Verfügbar in allen aktuellen Browsern. Ältere Versionen des Internet Explorer kannten die Eigenschaft nicht (undefined). In Web Workern (WorkerNavigator) gibt es sie nicht.