Хобрук: Ваш путь к мастерству в программировании

Как определить, в каком браузере выполняется фоновый скрипт вашего расширения?

Я говорю о расширениях Chrome, Firefox WebExtensions, расширениях Edge...

Есть ли в фоновом скрипте, а не в скрипте контента, четкий способ узнать, какой браузер я использую? Мне нужно выполнять разные операции для разных браузеров.

Да, navigator.userAgent может быть полезным, но это не очень понятно.

Есть ли какой-либо API расширения, который можно использовать для этого? Что-то вроде chrome.extension.browserType. (Конечно, этого на самом деле не существует..)


Ответы:


1

Не существует специального API для определения того, какой браузер используется в данный момент. Одним из преимуществ перехода основных браузеров на поддержку общей структуры расширений является возможность иметь единую кодовую базу, которая поддерживает несколько браузеров. Хотя набор функций, доступных во всех применимых браузерах, растет, всегда будут некоторые различия. Эти различия заключаются не только в том, что поддерживается, но в некоторых случаях в особенностях эффектов для конкретного API или в том, как должен использоваться API.1,2 Таким образом, для некоторых вещей необходимо иметь возможность определить, в каком браузере в данный момент запущен код.

В ответе с наибольшим количеством голосов на вопрос "Как определить браузеры Safari, Chrome, IE, Firefox и Opera?" можно найти хороший код.< /а>. Однако для работы в среде расширения требуется некоторая модификация.

На основе кода в этом ответе будет обнаружено следующее:

  • Хром
  • Край
  • Fire Fox
  • Опера
  • двигатель Бинка
// Opera 8.0+ (tested on Opera 42.0)
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera 
                || navigator.userAgent.indexOf(' OPR/') >= 0;

// Firefox 1.0+ (tested on Firefox 45 - 53)
var isFirefox = typeof InstallTrigger !== 'undefined';

// Internet Explorer 6-11
//   Untested on IE (of course). Here because it shows some logic for isEdge.
var isIE = /*@cc_on!@*/false || !!document.documentMode;

// Edge 20+ (tested on Edge 38.14393.0.0)
var isEdge = !isIE && !!window.StyleMedia;

// Chrome 1+ (tested on Chrome 55.0.2883.87)
// This does not work in an extension:
//var isChrome = !!window.chrome && !!window.chrome.webstore;
// The other browsers are trying to be more like Chrome, so picking
// capabilities which are in Chrome, but not in others is a moving
// target.  Just default to Chrome if none of the others is detected.
var isChrome = !isOpera && !isFirefox && !isIE && !isEdge;

// Blink engine detection (tested on Chrome 55.0.2883.87 and Opera 42.0)
var isBlink = (isChrome || isOpera) && !!window.CSS;

/* The above code is based on code from: https://stackoverflow.com/a/9851769/3773011 */    
//Verification:
var log = console.log;
if(isEdge) log = alert; //Edge console.log() does not work, but alert() does.
log('isChrome: ' + isChrome);
log('isEdge: ' + isEdge);
log('isFirefox: ' + isFirefox);
log('isIE: ' + isIE);
log('isOpera: ' + isOpera);
log('isBlink: ' + isBlink);

  1. Различные реализации API, которые взаимодействуют с чем-то столь же сложным и разнообразным, как разные браузеры, всегда будут иметь, как минимум, тонкие различия между реализациями. В настоящее время многие различия не столь тонкие.
  2. Mozilla прямо заявила, что намерена реализовать функциональность WebExtensions, которая в настоящее время недоступна в других браузерах, путем расширения chrome.*/browser.* API. Один из способов сделать это — использовать механизм под названием WebExtensions Experiments, который предназначен для разработчиков, отличных от Mozilla, для реализации дополнительных функций для WebExtensions. Намерение состоит в том, что такая функциональность, если она будет одобрена, будет перенесена в стандартные сборки Firefox.
24.01.2017
  • @johnktejik Вы, вероятно, спрашиваете номер версии браузера, но можете спрашивать что-то еще. Просьба уточнить. Если вы ищете номер версии браузера, было бы уместно задать новый вопрос. Вам может понадобиться один вопрос на браузер. 18.04.2020
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..