Signatur
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
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-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);
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');
// 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:
PluginArrayhat keine Methoden wiemapoderfilter. Vorher mitArray.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.