Start · Sprachen · JavaScript · Referenz · Navigator.plugins

Navigator.plugins

Eigenschaft

Nur lesbare Eigenschaft, die ein <code>PluginArray</code> mit <code>Plugin</code>-Objekten zurückgibt. In modernen Browsern ist das nur noch eine feste Liste von PDF-Viewern oder eine leere Liste.

seit JavaScript Baseline: alle Browser (veraltet, seit ca. 2022 nu Kategorie: webapi

Signatur

get Navigator.plugins

Beschreibung

navigator.plugins liefert ein PluginArray. Das ist eine Liste, die wie ein Array aussieht, aber keines ist. Jeder Eintrag ist ein Plugin-Objekt mit den Eigenschaften name, filename, description und length. Über length und den Index-Zugriff erreicht man die zugehörigen MimeType-Einträge. Früher hat man damit geprüft, ob Browser-Plugins wie Flash, Java oder Silverlight installiert waren.

NPAPI-Plugins gibt es in keinem aktuellen Browser mehr. Deshalb schreibt der HTML-Standard jetzt ein festes Verhalten vor: Kann der Browser PDFs direkt anzeigen, enthält die Liste genau fünf Einträge. Diese heißen "PDF Viewer", "Chrome PDF Viewer", "Chromium PDF Viewer", "Microsoft Edge PDF Viewer" und "WebKit built-in PDF". Jeder Eintrag hat die MIME-Typen application/pdf und text/pdf. Kann der Browser keine PDFs anzeigen, ist die Liste leer. Die Liste sagt also nichts darüber aus, welche Erweiterungen oder Plugins tatsächlich installiert sind.

In neuem Code verwendet man die Eigenschaft praktisch nicht mehr. Um die PDF-Unterstützung zu prüfen, gibt es navigator.pdfViewerEnabled. Die Eigenschaft ist trotzdem noch nützlich, wenn man alten Code pflegt oder verstehen will, wie Browser-Fingerprinting früher funktioniert hat.

Rückgabewert

Typ
PluginArray
Beschreibung
Eine Liste von Plugin-Objekten, die sich live aktualisiert und nur gelesen werden kann. In aktuellen Browsern enthält sie entweder die fünf festen PDF-Viewer-Einträge oder gar keinen Eintrag.

Beispiele

Alle gemeldeten Plugins auflisten

// PluginArray ist kein echtes Array, deshalb erst umwandeln
const plugins = Array.from(navigator.plugins);

plugins.forEach((plugin) => {
  const mimeTypes = Array.from(plugin).map((m) => m.type).join(', ');
  console.log(`${plugin.name} (${plugin.filename}): ${mimeTypes}`);
});

console.log('Anzahl:', navigator.plugins.length);
PDF Viewer (internal-pdf-viewer): application/pdf, text/pdf Chrome PDF Viewer (internal-pdf-viewer): application/pdf, text/pdf Chromium PDF Viewer (internal-pdf-viewer): application/pdf, text/pdf Microsoft Edge PDF Viewer (internal-pdf-viewer): application/pdf, text/pdf WebKit built-in PDF (internal-pdf-viewer): application/pdf, text/pdf Anzahl: 5

PDF-Unterstützung prüfen, mit Fallback für ältere Browser

const canShowPdfInline = () => {
  // Moderner Weg
  if ('pdfViewerEnabled' in navigator) {
    return navigator.pdfViewerEnabled;
  }
  // Fallback für ältere Browser über navigator.plugins
  return Array.from(navigator.plugins).some((plugin) =>
    Array.from(plugin).some((mime) => mime.type === 'application/pdf')
  );
};

const link = document.createElement('a');
link.href = '/docs/handbuch.pdf';
link.textContent = canShowPdfInline() ? 'PDF im Browser öffnen' : 'PDF herunterladen';
if (!canShowPdfInline()) link.download = 'handbuch.pdf';
document.body.append(link);
console.log(link.textContent);
PDF im Browser öffnen

Direkter Zugriff über Name und Index

const byName = navigator.plugins.namedItem('PDF Viewer');
const first = navigator.plugins.item(0); // entspricht navigator.plugins[0]

console.log(byName?.description);
console.log(first?.name ?? 'Keine Plugins gemeldet');
Portable Document Format PDF Viewer

// Wichtig · Fallstricke

  • Veraltet: Die Eigenschaft gibt es nur noch aus Kompatibilitätsgründen. Ab Chrome/Edge 94, Firefox 99 und Safari 15.x liefern alle Browser die gleiche feste PDF-Liste oder eine leere Liste. Installierte Erweiterungen und Plugins sind darin nie zu sehen.
  • Nicht zur Browser-Erkennung verwenden: Da die Liste überall gleich ist, kann man daraus keinen Browser ableiten. Für Feature-Erkennung nimmt man gezielte Prüfungen, zum Beispiel navigator.pdfViewerEnabled.
  • Kein echtes Array: PluginArray hat keine Methoden wie map oder filter. Vorher mit Array.from() oder dem Spread-Operator in ein Array umwandeln.
  • Datenschutz: Früher war die Plugin-Liste ein wichtiger Baustein für Fingerprinting, mit dem sich Nutzer wiedererkennen ließen. Die Vereinheitlichung soll genau das verhindern. Wer versucht, das zu umgehen, handelt gegen den Geist der Spezifikation.
  • Firefox hat die Liste schon vor der Vereinheitlichung teilweise leer zurückgegeben oder nur Flash gemeldet. Alter Code, der sich auf bestimmte Einträge verlässt, funktioniert deshalb nicht mehr.