Javascript 使用jQuery检测Safari

Javascript 使用jQuery检测Safari,javascript,jquery,browser-detection,Javascript,Jquery,Browser Detection,虽然两者都是基于Webkit的浏览器,但Safari URL在URL中编码引号,而Chrome不编码引号 因此,我需要在JS中区分这两个 将“safari”标记为已弃用 是否有更好的方法,或者我现在只使用不推荐的值?如果您正在检查浏览器,请使用$.browser。但如果您正在检查功能支持(推荐),请使用$.support 不应使用$.browser启用/禁用页面上的功能。原因是它不可靠,一般不推荐 如果您需要功能支持,那么我推荐。显然,唯一可靠且被接受的解决方案是执行如下功能检测: browse

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

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

将“safari”标记为已弃用


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

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

不应使用$.browser启用/禁用页面上的功能。原因是它不可靠,一般不推荐


如果您需要功能支持,那么我推荐。

显然,唯一可靠且被接受的解决方案是执行如下功能检测:

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;

混合使用
功能检测
用户代理
字符串:

    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);
用法:
if(is_safari)警报('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,它是这样的:
“严格使用”;
$(文档).ready(函数(){
var appVersion=navigator.appVersion;
var webkitVersion\u positionStart=appVersion.indexOf(“AppleWebKit/”)+12;
变量webkitVersion\u positionEnd=webkitVersion\u positionStart+3;
var webkitVersion=appVersion.slice(webkitVersion\u positionStart,webkitVersion\u positionEnd);
console.log(webkitVersion);
如果(webkitVersion<537){
log(“webkit过时”);
}否则{
log(“webkit ok”);
};
});

我找到的唯一方法是检查navigator.userAgent是否包含iPhone或iPad word

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

这将确定浏览器是否为Safari

if(navigator.userAgent.indexOf('Safari') !=-1 && navigator.userAgent.indexOf('Chrome') == -1)
{
    alert(its safari);
}else {
    alert('its not safari');
}

我用来检测苹果浏览器引擎,这个简单的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();

我不知道坚持使用它是否是一个好主意,我还没有深入检查过这一点,尽管我只是浏览了chrome上的$.browser文档,它标记为
$.browser.safari==true
。没有用户代理嗅探的情况下可能复制?教一个人钓鱼。。。“有更好的方法吗”-是的,特征检测。你的意思是像
location.hash=''blah';if(location.hash='#%22blah%22')警报('is Safari')?@AndreKR没错,我会做一个函数专门测试你正在检查的功能。@Greg你不是在问浏览器。。您正在测试浏览器。功能检测很好,但是如果您想阻止某个浏览器使用CSS动画(例如),因为它有一个错误的实现,该怎么办?它在技术上支持该功能,但我们想决定对该浏览器禁用它,因为在这种情况下,没有它的体验会更好。这是一个很好的技巧,但不幸的是它不起作用。由于location.hash处理字符串的方式,相等(location.hash='#%22blah%22')将不起作用:/特征检测是一条路要走,但是有一种更好的方法,它没有任何副作用。您的代码段可能会干扰依赖哈希更改事件的其他脚本。我已把这个问题标为问题的副本。我已经在Safari3.0-5.1.3(Mac和Windows)中创建并测试了该方法。这是一个一行:)对于一个有副作用的特征检测,48票对5票的比率,显然这是推荐的解决方案让它成为可接受的答案。作为这类东西多么脆弱的一个例子,此代码没有检测到InternetExplorer11,因为UA字符串已更改。请看Android webview也会说Safari,但这并不正确Chrome/Windows将报告为Safari:
(Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/36.0.1985.125 Safari/537.36)
是浏览器=(navigator.userAgent.indexOf('MSIE')!=-1 | | navigator.appVersion.indexOf('Trident/'))>0)要同时支持IE11>>>,这就是问题所在。TNX!不幸的是,这不起作用。在Chrome v66和Safari上测试。欢迎。谢谢你的贡献。由于SO上的低质量,不鼓励只使用代码的响应。请考虑编辑添加一个解释如何/为什么这解决了OP的问题,甚至额外的支持链接到文档。请注意,随着时间的推移,大多数投票都来自高质量的答案,因为不同的用户从您的帖子中学到了一些东西,可以应用于他们自己的编码问题。有关更多信息,请访问SO(StackOverflow.com/help)
 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();