Signatur
Beschreibung
Ein Plugin-Objekt steht für ein im Browser registriertes Plugin. Ihr erzeugt es nicht selbst, sondern bekommt es über navigator.plugins (ein PluginArray) oder über MimeType.enabledPlugin. Das Objekt ist schreibgeschützt und bietet folgende Eigenschaften und Methoden:
name– Anzeigename des Plugins, z. B."PDF Viewer".filename– Dateiname der Plugin-Bibliothek; heute meist"internal-pdf-viewer".description– Beschreibungstext, z. B."Portable Document Format".length– Anzahl der MIME-Typen, die das Plugin verarbeitet.item(index)undnamedItem(name)– liefern einzelneMimeType-Objekte. Ein Zugriff per Index (plugin[0]) oder per Name (plugin["application/pdf"]) funktioniert ebenfalls.
Früher diente das Interface dazu, NPAPI-Plugins wie Flash, Java oder Silverlight zu erkennen. Diese Plugins gibt es in keinem aktuellen Browser mehr. Außerdem legt der HTML-Standard die Plugin-Liste inzwischen fest: Kann der Browser PDFs direkt anzeigen, liefert navigator.plugins immer dieselben fünf Einträge ("PDF Viewer", "Chrome PDF Viewer", "Chromium PDF Viewer", "Microsoft Edge PDF Viewer", "WebKit built-in PDF"). Kann er das nicht, ist die Liste leer. Jeder dieser Einträge verweist auf die MIME-Typen application/pdf und text/pdf.
In der Praxis braucht ihr Plugin also fast nur noch für Altcode oder zur Diagnose. Für neuen Code nehmt ihr navigator.pdfViewerEnabled, wenn ihr prüfen wollt, ob der Browser PDFs direkt anzeigt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $index Pflicht | number | Nur für item(index): nullbasierter Index des gewünschten MimeType-Eintrags. |
|
| $name Pflicht | string | Nur für namedItem(name): MIME-Typ als Zeichenkette, z. B. "application/pdf". |
Rückgabewert
Plugin-Objekt aus navigator.plugins. item() und namedItem() geben ein MimeType-Objekt zurück. Gibt es keinen passenden Eintrag, ist das Ergebnis null (bzw. undefined beim direkten Zugriff per Index oder Name).Beispiele
Alle Plugins mit ihren Eigenschaften auflisten
// Plugin-Objekte bekommt man nur über navigator.plugins
const plugins = Array.from(navigator.plugins);
if (plugins.length === 0) {
console.log('Keine Plugins gemeldet (kein eingebauter PDF-Viewer).');
}
for (const plugin of plugins) {
console.log(`${plugin.name} | ${plugin.filename} | ${plugin.description} | MIME-Typen: ${plugin.length}`);
}
MIME-Typen eines Plugins mit item() und namedItem() lesen
const plugin = navigator.plugins.namedItem('PDF Viewer');
if (plugin) {
// Zugriff per Index
for (let i = 0; i < plugin.length; i++) {
const mime = plugin.item(i);
console.log(`${mime.type} (.${mime.suffixes})`);
}
// Zugriff per MIME-Typ-Name
const pdf = plugin.namedItem('application/pdf');
console.log('Zugehöriges Plugin:', pdf?.enabledPlugin.name);
} else {
console.log('Kein PDF-Viewer-Plugin vorhanden.');
}
Moderne Alternative: PDF-Unterstützung erkennen
const canShowPdfInline = () => {
// Bevorzugt: eigene Eigenschaft dafür
if ('pdfViewerEnabled' in navigator) {
return navigator.pdfViewerEnabled;
}
// Rückfall für ältere Browser über das Plugin-Interface
return Array.from(navigator.plugins).some(
(p) => p.namedItem('application/pdf') !== null
);
};
const link = document.createElement('a');
link.href = '/dokumente/rechnung.pdf';
link.textContent = canShowPdfInline() ? 'PDF ansehen' : 'PDF herunterladen';
if (!canShowPdfInline()) link.download = 'rechnung.pdf';
document.body.append(link);
console.log(link.textContent);
// Wichtig · Fallstricke
Veraltet: Plugin, PluginArray und navigator.plugins gelten als veraltet und bleiben nur für die Kompatibilität mit bestehenden Websites erhalten. Seit Chrome 94, Firefox 99 und Safari 15.x liefern Browser nur noch die festgelegte PDF-Viewer-Liste. Auf Flash, Java und andere Plugins lässt sich damit nicht mehr prüfen.
- Nutzt die Plugin-Liste nicht zur Browser- oder Funktionserkennung. Prüft stattdessen gezielt, ob eine Funktion vorhanden ist (
'xyz' in window), oder nehmtnavigator.pdfViewerEnabled. - Datenschutz: Früher war die Plugin-Liste ein starkes Merkmal für Browser-Fingerprinting. Deshalb wurde sie vereinheitlicht. Die Einträge sind heute für alle Nutzer gleich und taugen daher nicht mehr zum Fingerprinting.
- In Firefox und Chrome kann die Liste leer sein, wenn Nutzer den eingebauten PDF-Viewer abgeschaltet haben (z. B.
pdfjs.disabledin Firefox). Pluginist kein echtes Array. Wollt ihrmap,filterusw. nutzen, wandelt ihr es vorher mitArray.from()um.- Den Konstruktor könnt ihr nicht selbst aufrufen:
new Plugin()wirft einenTypeError.