Безопасный функциональный способ обнаружения Google Chrome с помощью Javascript?

StackOverflow https://stackoverflow.com/questions/81099

Вопрос

Как указано в названии, мне было бы интересно найти безопасный функциональный (то есть без использования navigator.AppName или navigator.appVersion) способ обнаружения Google Chrome.

Под функционально ориентированным я подразумеваю, например:

if(window.ActiveXObject) {
    // internet explorer!
}

Редактировать: Как уже указывалось, вопрос не имеет особого смысла (очевидно, что если вы хотите реализовать функцию, вы тестируете ее, если вы хотите определить для определенного браузера, вы проверяете пользовательский агент), извините, сейчас 5 утра ;) Позвольте мне сформулировать это так:Существуют ли какие-либо объекты javascript и / или функции, уникальные для Chrome...

Это было полезно?

Решение

isChrome = function() {
    return Boolean(window.chrome);
}

Другие советы

Этот ответ очень устарел, но тогда, в каменном веке, это было очень актуально.

Я думаю, что обнаружение функций более полезно, чем синтаксический анализ navigator.UserAgent, поскольку я погуглил неоднозначность Opera здесь.Никто не может знать, будет ли IE16 анализировать /MSIE 16.0;/ regexp - но мы можем быть совершенно уверены, что документ будет.вся поддержка.В реальной жизни эти функции обычно являются синонимами браузеров, например: "Нет XMLHttpRequest?Это чертов IE6!" Ни один другой браузер не поддерживает document.all, но некоторые браузеры, такие как Maxthon, могут зашифровывать UserAgent.(Конечно, скрипт может определять document.по какой-то причине все в Firefox, но это легко контролируется.) Поэтому я предлагаю это решение.

Редактировать Здесь Я нашел исчерпывающие ресурсы.

Правка 2 Я протестировал этот документ.все это также поддерживается Opera!

var is = {
  ff: window.globalStorage,
  ie: document.all && !window.opera,
  ie6: !window.XMLHttpRequest,
  ie7: document.all && window.XMLHttpRequest && !XDomainRequest && !window.opera,
  ie8: document.documentMode==8,
  opera: Boolean(window.opera),
  chrome: Boolean(window.chrome),
  safari: window.getComputedStyle && !window.globalStorage && !window.opera
}

Использование очень простое:

if(is.ie6) { ... }

Не совсем ответ на этот вопрос...но если вы пытаетесь определить конкретную марку браузера, смысл проверки функций отчасти теряется.Я сильно сомневаюсь, что какие-либо другие браузеры используют строку Chrome UserAgent, поэтому, если ваш вопрос "является ли этот браузер Chrome", вы должны просто посмотреть на это.(Кстати, window.ActiveXObject не гарантирует IE, есть плагины для других браузеров, которые предоставляют этот объект.Что в некотором роде иллюстрирует мысль, которую я пытался донести.)

По всем стандартам нацистов...иногда вы можете захотеть использовать устаревшие "стандартные технологии", которые еще не стали стандартными, но будут...Например, функции css3.

Именно по этой причине я нашел эту страницу.

По какой-то причине Safari отлично выполняет комбинацию border-radius с box-shadow, но chrome не отображает эту комбинацию корректно.Поэтому было бы неплохо найти способ обнаружить chrome, даже если это webkit, чтобы отключить эту комбинацию.

Я сталкивался с сотнями причин для определения конкретного браузера / версии, которые обычно заканчиваются отказом от идеи создания классной функции, потому что то, что я хочу сделать, не поддерживается big evil...

Но иногда некоторые функции просто слишком круты, чтобы не использовать их, даже если они еще не стандартизированы.

Итак, если вы примете точку зрения Марийн и являются заинтересованы в тестировании строки пользовательского агента с помощью javascript:

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

(Заслуга: http://davidwalsh.name/detecting-google-chrome-javascript )


Вот действительно хороший анализ / разбивка строки пользовательского агента chromes: http://www.simonwhatley.co.uk/whats-in-google-chromes-user-agent-string

Я часто использую определение поведения / возможностей.Непосредственно проверьте, поддерживает ли браузер функциональность, прежде чем работать с ней, вместо того, чтобы работать с ней на основе того, что может быть именем браузера (user-agent).

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

http://diveintohtml5.ep.io/everything.html

Вы не должны специально обнаруживать Chrome.Во всяком случае, вы должны обнаружить WebKit, поскольку в том, что касается рендеринга страницы, Chrome должен вести себя точно так же, как другие браузеры WebKit (Safari, Epiphany).

Если вам нужно не только обнаружить WebKit, но и точно выяснить, какая версия используется, смотрите эту ссылку: http://trac.webkit.org/wiki/DetectingWebKit

Но опять же, как говорили другие люди выше, вы должны обнаруживать не браузеры, а функции.Подробнее об этом читайте в этой статье ADC: http://developer.apple.com/internet/webcontent/objectdetection.html

Одна из причин, по которой вам, возможно, понадобится знать, что это браузер Chrome, заключается в том, что он "чертовски" соответствует стандартам.Я уже сталкивался с проблемами со старым кодом JavaScript, который, как я думал, соответствовал стандартам (по стандартам FF или Opera - которые довольно хороши), но Chrome оказался еще более придирчивым.Это вынудило меня переписать кое-какой код, но иногда было бы проще использовать трюк if (isChrome) {бла ... бла), чтобы запустить его.Chrome, кажется, работает очень хорошо (я за соответствие стандартам), но иногда вам просто нужно знать, что пользователь запускает в мельчайших деталях.

Кроме того, Chrome работает очень быстро.Проблема в том, что некоторый код JavaScript непреднамеренно зависит от медлительности правильной работы других браузеров, т.е.:загрузка страницы, загрузка iframe, размещение ссылок на таблицы стилей и javascript-ссылки в заголовке страницы и т.д.Это может вызвать новые проблемы, связанные с тем, когда функции действительно доступны для взаимодействия с элементами страницы.Так что на данный момент вам действительно, возможно, нужно знать...

Я использую этот код для создания закладок для каждого браузера (или отображения сообщения для webkit).

if (window.sidebar) { 
// Mozilla Firefox Bookmark
window.sidebar.addPanel(title, url,"");
} else if( window.external ) { // IE Favorite
  if(window.ActiveXObject) {
  //ie
  window.external.AddFavorite( url, title);
  } else {
  //chrome
  alert('Press ctrl+D to bookmark (Command+D for macs) after you click Ok');
  }
} else if(window.opera && window.print) { 
// Opera
  return true; }
 else { //safri
 alert('Press ctrl+D to bookmark (Command+D for macs) after you click Ok'); }

Могут быть ложноположительные результаты, поскольку opera также имеет window.chrome объект.В качестве хорошего решения я использую;

var isOpera = !!window.opera || !!window.opr;// Opera 8.0+

var isChrome = !!window.chrome && !isOpera;

Это решение почти всегда работает.Однако одна вещь, которую я обнаружил, заключается в том, что, isChrome ВОЗВРАТ false в iPad Chrome версии 52.0 как window.chrome ВОЗВРАТ false.

Изи:!!(!window.addEventListener && окно.ActiveXObject),

isIE6:тип документа.createElement('DIV').style.maxHeight == "не определено",

isIE7:!!(!window.addEventListener && window.XMLHttpRequest && !document.querySelectorAll),

isIE8:!!(!window.addEventListener && document.querySelectorAll && document.documentMode == 8),

исКекко:навигатор.продукт == "Геккон",

изОпера:!!окно.opera,

Ишром:!!окно.chrome,

isWebkit:!!(!window.opera && !navigator.taintEnable && document.evaluate && navigator.product != 'Геккон'),

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top