Обнаружить браузер Safari - PullRequest
       22

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

103 голосов
/ 30 октября 2011

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

function IsSafari() {

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

}

Ответы [ 14 ]

2 голосов
/ 08 мая 2018

Я знаю, что этот вопрос старый, но я все равно решил опубликовать ответ, так как он может кому-то помочь.В некоторых крайних случаях вышеперечисленные решения не дали результата, поэтому нам пришлось реализовать его таким образом, чтобы обрабатывать 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;
}
1 голос
/ 20 мая 2018

Эта уникальная «проблема» является 100% признаком того, что браузер является Safari (хотите верьте, хотите нет).

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

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

1 голос
/ 07 ноября 2016

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

var isSafari = /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent);
  • Crios - Chrome
  • fxios - Firefox
0 голосов
/ 27 мая 2016

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

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

РЕДАКТИРОВАТЬ: НЕТ ДЛИННОГО РАБОТЫ

...