在Javascript中,如何确定当前浏览器是Firefox而不是其他浏览器?

52
if(firefox and is on a computer){
alert('using firefox on a computer')
}else{
alert("using something else!");
}

我该如何做到这一点?


4
“is on a computer mean” 的意思是“在电脑上”,您是否想要同时检测iPhone和其他移动设备? - mP.
1
你为什么想知道那个? - Gumbo
3
因为问题中提到了“如果Firefox并且在计算机上”,所以“在计算机上”的部分肯定很重要,否则它就不会出现了。毕竟,否则它就是多余的。 - mP.
请注意,由于苹果对iOS应用的政策规定,Firefox在iOS上使用的是WebKit而不是Gecko渲染引擎。如果您想检测浏览器品牌名称或渲染引擎,请记住这一点。 - 1j01
13个回答

57

你需要的是浏览器检测:

if ($.browser.mozilla) { ... 
然而,浏览器嗅探并不被推荐使用,因为很容易欺骗用户代理,也就是假装成另一个浏览器!你最好使用特性检测,可以自己实现,也可以通过jQuery.support接口:http://api.jquery.com/jQuery.support/。这里有一篇关于扩展它以供自己使用的文章:http://www.waytoocrowded.com/2009/03/14/jquery-supportminheight/编辑:发现了这篇帖子,对解决问题有所帮助:When IE8 is not IE8 what is $.browser.version?

2
你是说感到气馁了吗? ;) 对于特性检测,加1,请用“正确的方式”进行:http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/ - Marcel Korpel
@Marcel Korpel:顺便说一下,非常棒的文章。我意识到我没有正确理解功能检测。您是否已经在回答中发布了它?因为我很乐意投票支持! - James Wiseman
2
我不同意你所说的“正确方式”。欺骗用户代理并非出于恶意,而是为了解决开发人员的错误。因此,最好相信用户想要让你认为他是谁..他比你有更好的理由。 - Jack
有时候你仍然需要找出代理是什么并做出最好的猜测。我相当确定(不是100%!)我可以检测到Java插件是否已安装和启用,但没有JavaScript“功能”可以报告它是否可能。我知道Java在Firefox中支持的时间还很短(不多!),所以我必须使用嗅探。虽然这只是一个例子--你可以想象其他技术将是平台依赖性的,但不作为JavaScript特性公开。对我来说,这个答案加1。 - Greg Pettit
10
此功能已被弃用并从最新版的jQuery中移除。 - dukevin
3
输出:"TypeError:$.browser未定义",因为这个属性已经从最新版本的jQuery中删除了。 - Oleksii Kyslytsyn

45

我正在做类似以下的事情;

function checkBrowser(){
    let browser = "";
    let c = navigator.userAgent.search("Chrome");
    let f = navigator.userAgent.search("Firefox");
    let m8 = navigator.userAgent.search("MSIE 8.0");
    let m9 = navigator.userAgent.search("MSIE 9.0");
    if (c > -1) {
        browser = "Chrome";
    } else if (f > -1) {
        browser = "Firefox";
    } else if (m9 > -1) {
        browser ="MSIE 9.0";
    } else if (m8 > -1) {
        browser ="MSIE 8.0";
    }
    return browser;
}

你正在引入全局变量,这看起来不是一种健壮的检查方式。例如,这将Edge检测为“Chrome”。 - 1j01
请看一下我的回答日期,let是后来引入的。 - Fayyaz Ali
你不需要使用 let 来避免全局变量,自 JavaScript 诞生以来就可以使用 var - 1j01
@1j01 是的,你说得对,请分享一个更好的版本。 - Fayyaz Ali
全局泄漏现在已经修复了,但我不知道最好的浏览器检测版本是什么;这需要大量的数据和浏览器测试。而且,你真的需要记住目标是什么,例如,如果你想显示某人正在使用的浏览器名称(有数百个!),或者为了避免一个错误而针对特定的渲染引擎(只有几个)。 - 1j01

16

像这样:检查Firefox浏览器。或者其他一些浏览器。

 window.onload = function() {
          //  alert(navigator.userAgent);
            if (navigator.userAgent.indexOf("Firefox") > 0) {
                alert("ff");
            }
        }

14
if (navigator.userAgent.indexOf("Firefox") != -1) {

 //some specific code for Mozilla

 }

4
navigator.sayswho= (function(){
  var N= navigator.appName, ua= navigator.userAgent, tem;
  var M= ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
  if(M && (tem= ua.match(/version\/([\.\d]+)/i))!= null) M[2]= tem[1];
  M= M? [M[1], M[2]]: [N, navigator.appVersion,'-?'];
  return M.join(' ');
 })();

正如名称所示,这是浏览器所说的它是谁 - 但在要求它实际执行任何操作之前,请使用对象检测...

我用它来记录用户错误并在多个浏览器中测试代码- 在那里我知道userAgent字符串。


4

更好的做法是检测所需的特性,而不是检测浏览器。例如,如果您需要知道是否支持foo()函数,可以使用if(foo){}进行检查。


3

如果你需要快速且简单的解决方案,请按照以下步骤操作。当你在NavigatorID.userAgent属性中搜索“Firefox”关键字时,使用includes()函数比indexOf()函数更加清晰。

const isFirefoxBrowser = navigator.userAgent.includes('Firefox');

警告:

基于检测用户代理字符串的浏览器识别方法不可靠,不建议使用,因为用户代理字符串是可以由用户自行配置的。

阅读更多关于userAgent的信息 >>

推荐解决方案:

使用功能检测来替代浏览器检测。

功能检测是指确定浏览器是否支持某段代码,并根据其支持情况运行不同的代码,以使得浏览器能够始终提供正常工作的体验而不会在某些浏览器上崩溃或出错。

阅读更多有关实现功能检测的信息 >>


1
虽然这段代码可能回答了问题,但加上代码的解释会对未来的读者有所帮助。 - Boken

1

正如在评论中已经问过的那样:你为什么要这样做?浏览器嗅探是一个坏习惯,只有少数情况下需要使用。

相反,使用功能检测。就像Nicholas Zakas所描述的那样,您应该在使用相对“不常见”的功能之前进行测试,并仅依赖于这些测试,以便您具备一定的失效保护机制。例如,可执行以下操作:

if (window.XMLHttpRequest)
    var xhr = new XMLHttpRequest();

替代

if ((brwsr.IE && brwsr.IE.version >= 7) || (brwsr.firefox) || (brwsr.opera))
    var xhr = new XMLHttpRequest();

还有不要这样做

if (window.XMLHttpRequest)
    // Hey, native XMLHttpRequest-support, so position: fixed is also supported

(而是测试是否支持position: fixed

存在一些名为KazehakaseMidori的不常见浏览器,它们可能支持这些功能,也可能不支持,因此在使用特性检测时,您的脚本将在这些浏览器上静默工作。

但请阅读提到的文章,因为它包含了这种技术的非常好的和全面的解释。(顺便说一句,我认为Zakas的Web开发者专业JavaScript仍然太不知名了。)


3
如果这总是起作用就太好了,但有时候,浏览器的实现特性会稍有不同,但这种差异并没有在变量中声明。例如,我试图解决这个问题:在Firefox中,您无法从禁用字段中复制文本,但在其他所有浏览器中都可以。因此,我需要在Firefox中使用readOnly属性来解决问题。除了知道用户代理之外,没有其他检测方法。 - jsarma

1

该属性已从jQuery中移除。 - derloopkat

1

你可以使用JavaScript的navigator.userAgent或一般的navigator对象来控制,

但如果你想使用现成的东西,可以检查这个:

http://www.quirksmode.org/js/detect.html

希望这能帮到你,Sinan。

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