Chrome определяется как Safari с помощью JavaScript

Я ищу способ обнаружить Safari с помощью JavaScript. Я знаю, что это уже освещалось много раз, но, вероятно, что-то изменилось, и это больше не работает. По крайней мере, в моем случае.

Вот что я делаю:

<script>

    if(!isSafari()){
      alert('not Safari');
    } else {
      alert('I am Safari');
    }


    function isSafari(){    
      var is_safari = navigator.userAgent.indexOf("Safari") > -1;
      if(is_safari){
        return true;
      }
    }
  </script>

jsbin: http://jsbin.com/ewerof/1

Если вы запустите этот код в Safari и Chrome, вы получите одно и то же предупреждение "Я - Safari". Так как же на самом деле обнаруживать только Safari? Моя версия Safari 4.0.3 на всякий случай, если это имеет значение.

4 ответа

Решение

Chrome имеет как Chrome, так и Safari внутри строки userAgent. Safari имеет только "Safari".

Так что это работает:

var is_chrome = navigator.userAgent.indexOf('Chrome') > -1; 
var is_explorer = navigator.userAgent.indexOf('MSIE') > -1; 
var is_firefox = navigator.userAgent.indexOf('Firefox') > -1; 
var is_safari = navigator.userAgent.indexOf("Safari") > -1; 
var is_Opera = navigator.userAgent.indexOf("Presto") > -1; 
if ((is_chrome)&&(is_safari)) {is_safari=false;} 

предупреждение if (is_safari) ("Safari");

Или только для Safari, используйте это:

if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) {alert('Its Safari');} 

Предоставлено: Kabamaru

Если вы наберете это в консоли веб-разработчика, используя Chrome:

navigator.userAgent

Вы получите строку, что-то вроде:

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.92 Safari/537.4"

Эта строка содержит Safari, поэтому вы должны проверить, если строка также содержит Chrome. Вы можете использовать простой однострочник для этого:

var is_safari = /^(?!.*chrome).*safari/i.test(navigator.userAgent);

Если вы посмотрите на своего пользовательского агента, то увидите, что в строку входит "Safari";

Your User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.92 Safari/537.4

var xSAF = isSafari();

if(SAF)
{
    alert('Is Safari');
} else {
    alert('Not Safari');
}

function isSafari()
{
    var xUA = navigator.userAgent;
    if((xUA.indexOf("Safari")) && (xUA.indexOf("Chrome") == -1))
    {
        return true;
    } else {
        return false;
    }
}

Я использую более новую версию Safari, но это все равно должно применяться.

Пользовательский агент Safari:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14

Пользовательский агент Chrome

 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4

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

Другие вопросы по тегам