Navigator.plugins: примеры (JAVASCRIPT)
navigator.plugins: PluginArrayОписание свойства navigator.plugins
Свойство navigator.plugins предоставляет доступ к объекту PluginArray, который содержит информацию о плагинах, установленных в браузере пользователя. Это свойство доступно только для чтения и не является функцией, хотя часто ошибочно называется таковой.
Свойство используется для определения возможностей браузера, проверки поддержки определенных форматов файлов (таких как PDF, Flash, Java) перед их загрузкой или отображением. Оно было особенно полезно в эпоху активного использования плагинов типа Adobe Flash Player или Java Applets.
Структура возвращаемого значения
Свойство возвращает объект PluginArray, который представляет собой коллекцию объектов Plugin. Каждый объект Plugin содержит информацию о конкретном плагине:
- name - название плагина
- filename - имя файла плагина
- description - описание плагина
- version - версия плагина (не всегда доступна)
- length - количество MIME-типов, поддерживаемых плагином
Объект PluginArray имеет методы для доступа к плагинам: item(index), namedItem(name), а также свойство length для определения количества плагинов.
Примеры использования navigator.plugins
Простейшая проверка наличия плагинов в браузере:
// Проверка доступности свойства
if ('plugins' in navigator) {
console.log('Свойство plugins доступно');
console.log('Количество плагинов:', navigator.plugins.length);
} else {
console.log('Свойство plugins недоступно');
}Свойство plugins доступно Количество плагинов: 5
Перебор всех установленных плагинов:
// Получение информации о всех плагинах
for (let i = 0; i < navigator.plugins.length; i++) {
const plugin = navigator.plugins[i];
console.log(`Плагин ${i + 1}:`);
console.log(' Название:', plugin.name);
console.log(' Файл:', plugin.filename);
console.log(' Описание:', plugin.description);
console.log(' Количество MIME-типов:', plugin.length);
}Плагин 1: Название: Chrome PDF Viewer Файл: internal-pdf-viewer Описание: Portable Document Format Количество MIME-типов: 2
Проверка наличия конкретного плагина:
// Проверка наличия PDF плагина
function hasPDFPlugin() {
for (let i = 0; i < navigator.plugins.length; i++) {
if (navigator.plugins[i].name.toLowerCase().includes('pdf')) {
return true;
}
}
return false;
}
console.log('PDF плагин доступен:', hasPDFPlugin());PDF плагин доступен: true
Альтернативные методы в JavaScript
navigator.mimeTypes - предоставляет информацию о MIME-типах, которые браузер может обрабатывать. Этот объект тесно связан с navigator.plugins, так как каждый плагин поддерживает определенные MIME-типы.
Modernizr - библиотека для обнаружения возможностей браузера, которая предоставляет более надежные методы проверки поддержки различных технологий.
Feature Detection - подход, при котором проверяется непосредственно поддержка функциональности, а не наличие конкретного плагина. Например, для проверки поддержки canvas используется document.createElement('canvas').getContext.
Современные API - для многих форматов сейчас существуют встроенные API. Например, для PDF можно использовать PDF.js или встроенный просмотрщик, а для мультимедиа - HTML5 video и audio теги.
Типичные ошибки и проблемы
1. Предположение о постоянной доступности - во многих современных браузерах свойство navigator.plugins возвращает фиктивные данные или пустой массив из соображений конфиденциальности.
// Ошибочное предположение о доступности плагинов
function checkFlash() {
// Этот код может не работать в современных браузерах
for (let plugin of navigator.plugins) {
if (plugin.name === 'Shockwave Flash') {
return true;
}
}
return false;
}
console.log('Flash доступен:', checkFlash());Flash доступен: false (даже если установлен)
2. Отсутствие проверки на поддержку свойства:
// Ошибка: отсутствие проверки доступности свойства
const pluginCount = navigator.plugins.length; // Может вызвать ошибку
console.log('Количество плагинов:', pluginCount);TypeError: Cannot read properties of undefined (если свойство не поддерживается)
3. Ненадежность данных - браузеры могут возвращать неполные или измененные данные о плагинах. Например, Safari может сообщать о наличии PDF плагина, даже если он отключен в настройках.
Изменения в последних версиях браузеров
В современных браузерах свойство navigator.plugins подверглось значительным изменениям из-за проблем с конфиденциальностью и безопасностью:
- Chrome 88+ - свойство возвращает фиксированный набор плагинов, соответствующий стандартным возможностям браузера, без информации о фактически установленных плагинах.
- Firefox 85+ - свойство возвращает пустой массив или ограниченный набор данных для предотвращения fingerprinting.
- Safari - уже много лет возвращает только базовый набор плагинов, скрывая реальную информацию.
- Edge - следует политике Chrome, так как использует движок Chromium.
Эти изменения делают свойство navigator.plugins практически бесполезным для реального обнаружения плагинов в современных веб-приложениях.
Расширенные примеры использования
Создание карты всех плагинов с поддерживаемыми MIME-типами:
// Полная карта плагинов и MIME-типов
function getPluginsMap() {
if (!navigator.plugins) return null;
const pluginsMap = {};
for (let i = 0; i < navigator.plugins.length; i++) {
const plugin = navigator.plugins[i];
pluginsMap[plugin.name] = {
filename: plugin.filename,
description: plugin.description,
mimeTypes: []
};
// Получение MIME-типов для каждого плагина
for (let j = 0; j < plugin.length; j++) {
const mimeType = plugin[j];
if (mimeType) {
pluginsMap[plugin.name].mimeTypes.push({
type: mimeType.type,
description: mimeType.description,
suffixes: mimeType.suffixes
});
}
}
}
return pluginsMap;
}
const plugins = getPluginsMap();
console.log('Карта плагинов:', plugins);Карта плагинов: {
"Chrome PDF Viewer": {
"filename": "internal-pdf-viewer",
"description": "Portable Document Format",
"mimeTypes": [{"type": "application/pdf", ...}]
}
}Определение возможностей браузера на основе плагинов:
// Анализ возможностей браузера
function analyzeBrowserCapabilities() {
const capabilities = {
pdf: false,
flash: false,
java: false,
silverlight: false
};
if (!navigator.plugins) return capabilities;
for (let plugin of navigator.plugins) {
const name = plugin.name.toLowerCase();
const description = plugin.description.toLowerCase();
if (name.includes('pdf') || description.includes('pdf')) {
capabilities.pdf = true;
}
if (name.includes('flash') || description.includes('flash')) {
capabilities.flash = true;
}
if (name.includes('java') || description.includes('java')) {
capabilities.java = true;
}
if (name.includes('silverlight')) {
capabilities.silverlight = true;
}
}
return capabilities;
}
console.log('Возможности браузера:', analyzeBrowserCapabilities());Возможности браузера: {
pdf: true,
flash: false,
java: false,
silverlight: false
}Сравнение плагинов между сессиями:
// Отслеживание изменений в плагинах
class PluginMonitor {
constructor() {
this.previousPlugins = this.getPluginNames();
}
getPluginNames() {
if (!navigator.plugins) return [];
return Array.from(navigator.plugins).map(p => p.name);
}
checkForChanges() {
const currentPlugins = this.getPluginNames();
const added = currentPlugins.filter(p => !this.previousPlugins.includes(p));
const removed = this.previousPlugins.filter(p => !currentPlugins.includes(p));
if (added.length > 0 || removed.length > 0) {
console.log('Обнаружены изменения в плагинах:');
console.log('Добавлены:', added);
console.log('Удалены:', removed);
this.previousPlugins = currentPlugins;
return { added, removed };
}
return null;
}
}
const monitor = new PluginMonitor();
// При изменении плагинов будет выведено сообщениеАльтернативы в других языках программирования
В других языках программирования аналогичные проверки обычно выполняются на стороне сервера или для других целей.
PHP - определение возможностей клиента через HTTP-заголовки User-Agent:
// PHP: анализ User-Agent
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($userAgent, 'Chrome') !== false) {
echo 'Браузер Chrome';
} elseif (strpos($userAgent, 'Firefox') !== false) {
echo 'Браузер Firefox';
} else {
echo 'Другой браузер';
}Браузер Chrome
Python - анализ заголовков User-Agent с помощью библиотек:
# Python с использованием user-agents
from user_agents import parse
ua_string = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
user_agent = parse(ua_string)
print(f'Браузер: {user_agent.browser.family}')
print(f'Версия: {user_agent.browser.version_string}')Браузер: Chrome Версия: 94.0
Важное отличие: серверные языки не имеют прямого доступа к информации о плагинах браузера. Они могут только анализировать строку User-Agent, которая содержит ограниченную информацию о браузере и ОС.