Signatur
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
"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);
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);
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');
}
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());
// 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.