使用 jQuery 检测 Safari

虽然两者都是基于 Webkit 的浏览器,但 Safari 在 URL 中编码了引号,而 Chrome 则没有。

因此,我需要在 JS 中区分这两者。

JQuery 的浏览器检测文档 将“ safari”标记为弃用。

有没有更好的方法,或者我现在只是坚持使用不推荐的值?

186864 次浏览

如果您正在检查浏览器使用 $.browser。但如果您正在检查功能支持(推荐) ,然后使用 $.support

你不应该使用 $。浏览器启用/禁用页面上的特性。原因是它不可靠,通常只是不推荐。

如果你需要特性支持,那么我推荐 现代化

显然,唯一可靠且被接受的解决方案就是这样的特征提取:

browser_treats_urls_like_safari_does = false;
var last_location_hash = location.hash;
location.hash = '"blah"';
if (location.hash == '#%22blah%22')
browser_treats_urls_like_safari_does = true;
location.hash = last_location_hash;

使用 feature detectionUseragent字符串的混合:

    var is_opera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
var is_Edge = navigator.userAgent.indexOf("Edge") > -1;
var is_chrome = !!window.chrome && !is_opera && !is_Edge;
var is_explorer= typeof document !== 'undefined' && !!document.documentMode && !is_Edge;
var is_firefox = typeof window.InstallTrigger !== 'undefined';
var is_safari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);

Usage:
if (is_safari) alert('Safari');

或者只适用于 Safari,使用以下方法:

if ( /^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {alert('Its Safari');}

为了检查 Safari,我使用了以下方法:

$.browser.safari = ($.browser.webkit && !(/chrome/.test(navigator.userAgent.toLowerCase())));
if ($.browser.safari) {
alert('this is safari');
}

它能正常工作。

以下标识了 Safari 3.0 + ,并将其与 Chrome 区分开来:

isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)

不幸的是,上面的例子也会检测到 android 的默认浏览器是 Safari,而它不是。 我用过 navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1

泛型函数

 var getBrowseActive = function (browserName) {
return navigator.userAgent.indexOf(browserName) > -1;
};

解决这个问题的一个非常有用的方法是检测浏览器 webkit 版本,并检查它是否至少是我们需要的版本,否则做其他事情。

使用 jQuery 是这样的:

"use strict";


$(document).ready(function() {
var appVersion                  = navigator.appVersion;
var webkitVersion_positionStart = appVersion.indexOf("AppleWebKit/") + 12;
var webkitVersion_positionEnd   = webkitVersion_positionStart + 3;
var webkitVersion               = appVersion.slice(webkitVersion_positionStart, webkitVersion_positionEnd);
	

console.log(webkitVersion);


if (webkitVersion < 537) {
console.log("webkit outdated.");
} else {
console.log("webkit ok.");
};
});

这为处理浏览器不同 webkit 实现的问题提供了一个安全和永久的解决方案。

编程愉快!

//Check if Safari
function isSafari() {
return /^((?!chrome).)*safari/i.test(navigator.userAgent);
}
//Check if MAC
if(navigator.userAgent.indexOf('Mac')>1){
alert(isSafari());
}

http://jsfiddle.net/s1o943gb/10/

我找到的唯一方法是检查 Navigator.userAgent 是否包含 iPhone 或 iPad 文字

if (navigator.userAgent.toLowerCase().match(/(ipad|iphone)/)) {
//is safari
}

This will determine whether the browser is Safari or not.

if(navigator.userAgent.indexOf('Safari') !=-1 && navigator.userAgent.indexOf('Chrome') == -1)
{
alert(its safari);
}else {
alert('its not safari');
}
    // Safari uses pre-calculated pixels, so use this feature to detect Safari
var canva = document.createElement('canvas');
var ctx = canva.getContext("2d");
var img = ctx.getImageData(0, 0, 1, 1);
var pix = img.data;     // byte array, rgba
var isSafari = (pix[3] != 0);   // alpha in Safari is not zero

我用来检测苹果浏览器引擎,这个简单的 JavaScript 条件:

 navigator.vendor.startsWith('Apple')

我最好的解决办法

function getBrowserInfo() {
const ua = navigator.userAgent; let tem;
let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return { name: 'IE ', version: (tem[1] || '') };
}
if (M[1] === 'Chrome') {
tem = ua.match(/\bOPR\/(\d+)/);
if (tem != null) {
return { name: 'Opera', version: tem[1] };
}
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
tem = ua.match(/version\/(\d+)/i);
if (tem != null) {
M.splice(1, 1, tem[1]);
}
return {
name: M[0],
version: M[1],
};
}


getBrowserInfo();