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

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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

Изменить Здесь я нашел полные ресурсы.

Изменить 2. Я протестировал этот document.all также поддерживается 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) { ... }

Я не тестировал обнаружение сафари, может ли кто-нибудь помочь?

Ответ 3

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

Ответ 4

Для всех стандартов нацистов... иногда вы можете использовать кровотечение "стандартных технологий", которые еще не являются стандартными, но они будут... Такие, как css3.

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

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

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

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

Ответ 5

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

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

(кредит: http://davidwalsh.name/detecting-google-chrome-javascript)


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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Я использую этот код для создания закладок для каждого браузера (или отображения сообщения для 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'); }

Ответ 10

isIE:!! (! window.addEventListener & window.ActiveXObject),

isIE6: typeof document.createElement('DIV'). style.maxHeight == "undefined",

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

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

isGecko: navigator.product == 'Gecko',

isOpera:!! window.opera,

isChrome:!! window.chrome,

isWebkit:!! (! window.opera &! navigator.taintEnable & document.evaluate && navigator.product!= 'Gecko'),