使用jQuery检测Safari浏览器

124
尽管两者都是基于Webkit的浏览器,但Safari会对URL中的引号进行编码,而Chrome则不会。
因此,我需要在JS中区分这两个浏览器。 jQuery的浏览器检测文档将"safari"标记为已弃用。
是否有更好的方法,还是现在只能坚持使用已弃用的值?

我不确定坚持这个想法是否是一个好主意,因为我还没有深入研究过。不过我只是在 Chrome 上浏览了一下 $ .browser 文档,并且它标记 $.browser.safari === true。哎呀。 - davin
1
是否有可能检测Safari、Chrome、IE、Firefox和Opera浏览器,而不使用用户代理嗅探技术?此问题可能是如何检测Safari、Chrome、IE、Firefox和Opera浏览器的重复。 - Rob W
14个回答

0
一种非常有用的方法是检测浏览器的 Webkit 版本,并检查它是否至少是我们需要的版本,否则执行其他操作。

Using jQuery it goes like this:

"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实现中出现的问题。

愉快的编码!


0
    // 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

0

通用函数

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

0

我最好的解决方案

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();

欢迎。感谢您的贡献。在SO上,仅提供代码的回答被认为是低质量的。请考虑编辑以添加解释如何/为什么解决了OP的问题,甚至可以添加支持文档的链接。请注意,大多数赞来自于随着时间推移而产生的高质量答案,因为各种用户从您的帖子中学到了一些东西,可以应用到他们自己的编码问题中。更多信息可在SO help中找到。 - SherylHohman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接