Как я могу надежно обнаружить браузер без использования window.navigator?

Я знаю, что есть тысячи вопросов о переполнении стека об обнаружении браузера с помощью JavaScript. Мой вопрос: как вы можете обнаружить браузер без window.navigator (который включает navigator.userAgent)?

Во-первых, чтобы уточнить, мне не нужно знать механизм рендеринга, это не для адаптивного макета, и не паникуйте: я уже делаю обнаружение функции. Если почему я спрашиваю об обнаружении браузера, важно прокомментировать, и я буду рад спланировать объяснение, но это, вероятно, сделает вопрос вопиющим долго.

Далее, позвольте мне объяснить, почему мой вопрос не является дубликатом:

  • Обнаружение браузера в Javascript? , потому что ответов 19, 12 из них используют navigator.userAgent специально (в том числе jQuery.browser, который использовал userAgent, и теперь он ушел), 4 использовать navigator.appName (который дает "Netscape" в Chrome...) 1 ставит вопрос, рекомендуя определение функции, которое отличается от обнаружения браузера (я уже использую обнаружение функции, но чтобы узнать, в какой степени я могу их использовать, мне нужно обнаружение браузера) и 2 не являются действительно ответами или специфичны для IE. (Хотя этот не-ответ на самом деле очень объясняет, почему мой вопрос здесь уместен: я стараюсь избегать попадания болевых точек на определенные браузеры, которые могли бы сбить вкладку! ) Поскольку мой вопрос требует ответа (даже взлома?) Без использования window.navigator, это не дубликат этого вопроса.

  • Проверьте, использует ли пользователь IE , потому что из 11 ответов, 10 используют navigator.userAgent, а 1 из них использует IE трюк для обнаружения только IE, чего недостаточно для ответа на мой вопрос (хотя, возможно, это может быть небольшая часть полезного решения, размещенного здесь)?

  • В Javascript, как определить, является ли мой текущий браузер Firefox на компьютере, а не на все остальное? , потому что из 11 ответы, 8 use navigator.userAgent, 2 рекомендую обнаружение функции (опять же, не мой вопрос), и 1 даже не является ответом.

  • Как определить браузер хрома и сафари (webkit) , потому что из 8 ответов, 6 из них используют navigator.userAgent, и 2 являются специфичными для webkit. К сожалению, WebKit не обязательно привязан к Safari, и мне нужно знать браузер, а не механизм рендеринга.

Надеюсь, это кристально ясно.

Я знаю, что есть другие способы сделать это, но я не знаю, насколько хорошо все в порядке. Может быть, объекты или переменные, которые последовательно или надежно подвержены JavaScript в некоторых браузерах? Я знаю, что некоторые экспериментальные API-интерфейсы являются префиксами для поставщиков, но это не похоже на хорошую идею для использования в коммерческом продукте, хотя я желаю опуститься до минимума, если это необходимо. Любые другие возможности?

Ответ 1

Мысль:

  • IE использует ActiveX (до сих пор работает до IE11, унаследовано). Вы можете довольно легко понять, что пользователь использует IE от просмотра доступности ActiveX, однако, если параметры безопасности включены, вам нужно отступить, угадайте, что, другое обнаружение функции.
  • Chrome и Firefox поддерживают использование расширений, возможно, обнаружение этих расширений поможет
  • У Chrome есть объект window['chrome']['webstore'], доступный в глобальной области.
  • Вы можете сортировать оконный объект с помощью Object.keys и искать конкретные имена поставщиков, такие как 'moz' или 'ms' или 'o'.

Если вы комбинируете moz, ms и chrome-объект, вы можете вынюхивать три самых больших браузера.

С другой стороны, обнаружение функций по-прежнему является лучшим вариантом, а не для OP, но для "я-просто-получаю-в-программировании и-я-как-ноу-хау-я" -sniff-out-a-browser-programmers "там.

Ответ 2

Прежде всего, просто чтобы быть ясным, ни один входящий HTTP-запрос не будет гарантированно быть точным, говоря, кто они. На самом деле это то, как работают некоторые хакеры, обманывая поле User-Agent заголовка HTTP. Большинство поставщиков браузеров; однако, хорошо изучите, кто они, говоря это в поле User-agent заголовка входящего HTTP-запроса. Единственная проблема, работающая на уровне Javascript, заключается в том, что это один уровень слишком высокий для просмотра заголовков. Однако есть трюки, и вот один из них:

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);

Я нашел это, немного подумав о проблеме и хорошо знаю, что это касается сети. Подробнее об этом можно узнать здесь: Доступ к HTTP-заголовкам веб-страницы в JavaScript, на самом деле этот вопрос можно рассматривать как дубликат этого ответа, однако не все знают уровень HTTP. Вышеприведенный код притворяется легитимным входящим запросом и открывает document.location с помощью "Get", но ничего не отправляет. Не зная внутренних элементов браузера, я предполагаю, что сама DOM возвращает уже известную информацию заголовка. Просто проанализируйте часть ответа User-Agent, и вы все настроены.