Обнаружение браузера Safari

Как определить браузер Safari с помощью JavaScript? Я пробовал код ниже, и он обнаруживает не только Safari, но и браузер Chrome.

function IsSafari() {

  var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
  return is_safari;

}

14 ответов


вы можете легко использовать индекс Chrome для фильтрации Chrome:

var ua = navigator.userAgent.toLowerCase(); 
if (ua.indexOf('safari') != -1) { 
  if (ua.indexOf('chrome') > -1) {
    alert("1") // Chrome
  } else {
    alert("2") // Safari
  }
}

Примечание: всегда пытайтесь обнаружить конкретное поведение, которое вы пытаетесь исправить, вместо того, чтобы нацеливать его на isSafari?

в крайнем случае, обнаружение Safari с помощью этого регулярного выражения:

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

Он использует отрицательный взгляд-вокруг и он исключает Chrome, Edge и все браузеры Android, которые включают Safari имя в их агенте пользователя.


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

Если вы все еще хотите сделать это и протестировать любую версию Safari, я бы предложил использовать это

var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 &&
               navigator.userAgent &&
               navigator.userAgent.indexOf('CriOS') == -1 &&
               navigator.userAgent.indexOf('FxiOS') == -1;

Это будет работать с любой версией Safari на всех устройствах: Mac, iPhone, iPod, устройство iPad.

редактировать

для тестирования в текущем браузере:https://jsfiddle.net/j5hgcbm2/

Изменить 2

Обновлено в соответствии с Chrome docs для правильного обнаружения Chrome на iOS

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

редактировать 3

Обновление ПО Firefox docs для правильного обнаружения Firefox на iOS


просто использовать:

var isSafari = window.safari !== undefined;
if (isSafari) console.log("Safari, yeah!");

этот код используется для обнаружения только браузера safari

if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0) 
{
   alert("Browser is Safari");          
}

поскольку userAgent для chrome и safari почти одинаковы, может быть проще посмотреть на поставщика браузера

сафари

navigator.vendor ==  "Apple Computer, Inc."

Chrome

navigator.vendor ==  "Google Inc."

в Firefox (почему он пустой?)

navigator.vendor ==  ""

IE (почему это не определено?)

navigator.vendor ==  undefined

только сафари whitout Chrome:

после попытки других кодов я не нашел никаких, которые работают с новыми и старыми версиями Safari.

наконец, я сделал этот код, который работает очень хорошо для меня:

var ua = navigator.userAgent.toLowerCase(); 
var isSafari = false;
try {
  isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);
}
catch(err) {}
isSafari = (isSafari || ((ua.indexOf('safari') != -1)&& (!(ua.indexOf('chrome')!= -1) && (ua.indexOf('version/')!= -1))));

//test
if (isSafari)
{
  //Code for Safari Browser (Desktop and Mobile)
  document.getElementById('idbody').innerHTML = "This is Safari!";
}
else
{
  document.getElementById('idbody').innerHTML = "Not is Safari!";
}
<body id="idbody">
</body>

Я использую этот

function getBrowserName() {
    var name = "Unknown";
    if(navigator.userAgent.indexOf("MSIE")!=-1){
        name = "MSIE";
    }
    else if(navigator.userAgent.indexOf("Firefox")!=-1){
        name = "Firefox";
    }
    else if(navigator.userAgent.indexOf("Opera")!=-1){
        name = "Opera";
    }
    else if(navigator.userAgent.indexOf("Chrome") != -1){
        name = "Chrome";
    }
    else if(navigator.userAgent.indexOf("Safari")!=-1){
        name = "Safari";
    }
    return name;   
}

if( getBrowserName() == "Safari" ){
    alert("You are using Safari");
}else{
    alert("You are surfing on " + getBrowserName(name));
}

изменено регулярное выражение для ответа выше

var isSafari = /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent);
  • Криос - хром
  • fxios-Firefox

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

function isSafari() {
    var ua = window.navigator.userAgent;
    var iOS = !!ua.match(/iP(ad|od|hone)/i);
    var hasSafariInUa = !!ua.match(/Safari/i);
    var noOtherBrowsersInUa = !ua.match(/Chrome|CriOS|OPiOS|mercury|FxiOS|Firefox/i)
    var result = false;
    if(iOS) { //detecting Safari in IOS mobile browsers
        var webkit = !!ua.match(/WebKit/i);
        result = webkit && hasSafariInUa && noOtherBrowsersInUa
    } else if(window.safari !== undefined){ //detecting Safari in Desktop Browsers
        result = true;
    } else { // detecting Safari in other platforms
        result = hasSafariInUa && noOtherBrowsersInUa
    }
    return result;
}

эта уникальная "проблема" - это 100% знак того, что браузер Safari (верьте или нет).

if (Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').descriptor === false) {
   console.log('Hello Safari!');
}

это означает, что дескриптор объекта cookie имеет значение false в Safari, а все остальные-true, что на самом деле дает мне головную боль в другом проекте. Удачи в кодировании!


может быть, это работает :

Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')

EDIT: БОЛЬШЕ НЕ РАБОТАЕТ


Я заметил, что только одно слово отличает Safari - "версия". Таким образом, это регулярное выражение будет работать идеально:

/.*Version.*Safari.*/.test(navigator.userAgent)

Я не знаю, почему OP хотел обнаружить Safari, но в редком случае вам нужно обнюхивать браузер в настоящее время, вероятно, более важно обнаружить движок рендеринга, чем имя браузера. Например, в iOS все браузеры используют движок Safari/Webkit, поэтому бессмысленно получать "chrome" или "firefox" в качестве имени браузера, если базовый рендеринг на самом деле Safari/Webkit. Я не тестировал этот код со старыми браузерами, но он работает со всем довольно недавним на Android, iOS, OS X, Windows и Linux.

<script>
    let browserName = "";

    if(navigator.vendor.match(/google/i)) {
        browserName = 'chrome/blink';
    }
    else if(navigator.vendor.match(/apple/i)) {
        browserName = 'safari/webkit';
    }
    else if(navigator.userAgent.match(/firefox\//i)) {
        browserName = 'firefox/gecko';
    }
    else if(navigator.userAgent.match(/edge\//i)) {
        browserName = 'edge/edgehtml';
    }
    else if(navigator.userAgent.match(/trident\//i)) {
        browserName = 'ie/trident';
    }
    else
    {
        browserName = navigator.userAgent + "\n" + navigator.vendor;
    }
    alert(browserName);
</script>

уточнения:

  • все браузеры под iOS будут сообщаться как "safari / webkit"
  • все браузеры под Android, но Firefox будет сообщаться как "chrome / blink"
  • Хром, Опера, блиск, Вивальди ЕТК. все будет сообщаться как "chrome / blink" под Windows, OS X или Linux