Обнаружение браузера 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