【问题标题】:Detect all Firefox versions in JS检测 JS 中的所有 Firefox 版本
【发布时间】:2011-10-23 10:22:57
【问题描述】:

如何在 JavaScript 中检测 Firefox?
我想检测所有版本的 Firefox。

【问题讨论】:

  • 您实际上想要完成什么?通常有比检测特定浏览器更好的方法来解决问题(例如使用特征检测)。
  • 为什么人们发布问题,让人们回复要求澄清,然后提出问题的人没有回复?重点是什么?对我来说似乎很粗鲁。
  • 在你的情况下,可能是因为你没有回答这个问题,你正在就为什么不应该这样做给出你的意见。顺便说一句,需要检测浏览器的正当理由有很多,例如,需要在很久以前为 IE 构建的大型内部公司网站上显示“不支持 Firefox”之类的警告消息,并且没有人认为它具有成本效益做更多的事情,但你需要让用户知道,这样他们在尝试使用它时不会因错误而沮丧,等等。
  • 示例:Firefox 对所有其他浏览器按下的 _/- 和 +/= 键使用不同的 keyCode,这就是为什么我需要能够检测用户代理是否是 Firefox。跨度>
  • 示例:Firefox 不适用于附加脚本的//# sourceURL 方法,它们必须是evaled,但所有其他浏览器都可以。

标签: javascript jquery firefox


【解决方案1】:

这将检测任何版本的 Firefox:

var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;

更具体地说:

if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){
     // Do Firefox-related activities
}

您可能需要考虑使用功能检测 ala Modernizr 或相关工具来完成您需要的工作。

【讨论】:

  • 或使用正则表达式var is_firefox = /firefox/i.test(navigator.userAgent)
  • 我相信indexOf 字符串方法比正则表达式要快。
  • 我会强调@TomášZato 所说的。这不是一个复杂的搜索,因此不应该使用正则表达式......还是我错过了一些关于正则表达式的东西?
  • 对于简洁比速度更重要的地方,正则表达式搜索非常简洁。并且对于那些没有有用的品牌自己的类似 Firefox 的浏览器进行修复会更容易和更清晰:/firefox|iceweasel/i.test(navigator.userAgent)
  • 以下允许检测任何 Firefox 或其他浏览器:stackoverflow.com/questions/9847580/…
【解决方案2】:

给它

var ffversion = '18';
var is_firefox = navigator.userAgent.toLowerCase().indexOf('firefox/'+ffversion) > -1;
alert(is_firefox);

【讨论】:

    【解决方案3】:

    对我来说最好的解决方案:

    function GetIEVersion() {
      var sAgent = window.navigator.userAgent;
      var Idx = sAgent.indexOf("MSIE");
      // If IE, return version number.
      if (Idx > 0)
        return parseInt(sAgent.substring(Idx+ 5, sAgent.indexOf(".", Idx)));
    
      // If IE 11 then look for Updated user agent string.
      else if (!!navigator.userAgent.match(/Trident\/7\./))
        return 11;
    
      else
        return 0; //It is not IE
    
    }
    if (GetIEVersion() > 0){
    			 alert("This is IE " + GetIEVersion());
    		}else {
    			 alert("This no is IE ");
    		}		

    【讨论】:

      【解决方案4】:

      此脚本检测所有桌面版 Firefox,从版本 1 到 46。

      这是我第三次尝试在 StackOverflow 上回答这个问题,因为我一直在寻找破坏脚本的新方法。但是,我认为它现在正在工作。这是了解 Firefox 功能的一个很好的练习,并且可以有趣地了解事物是如何演变的。脚本可以用不同的功能重写,我选择了我认为最有用的,我希望其他人用其他更有用的功能重写并在此处发布,并比较结果。

      我将脚本放在 try 语句中,以防用户在 about.config 中有任何禁用的设置。否则,我在每个版本的 Firefox 上都进行了测试,它会检测到每个版本。我简要描述了 cmets 中每个功能的用途。我也想为 Webkit 这样做,但发现文档不太好。 Mozilla 可以轻松下载以前的版本和详细版本。

      // Element to display version
      var outputVersion = document.getElementById("displayFoxVersion");
      
      try {
          // Match UserAgent string with Firefox Desktop
          // Detect hybrid Gecko browsers and mobile
          if (navigator.userAgent.match(/firefox/i) &&
              !navigator.userAgent.match(/mobi|tablet|fennec|android|netscape|seamonkey|iceweasel|iceape|icecat|waterfox|gnuzilla|shadowfox|swiftfox/i)) {
      
              // Create Element and Array to test availability  
              var createdElement = document.createElement('div'),
                  createdArray = [],
                  firefoxVersion = "0";
      
              // Firefox 1.0 released November 9, 2004 
              // Check a current feature as being true, or NOT undefined 
              // AND check future features as EQUAL undefined
              if (typeof window.alert !== "undefined" &&
                  typeof window.XPCNativeWrapper === "undefined" &&
                  typeof window.URL === "undefined") {
                  firefoxVersion = "1";
              }
      
              // Firefox 1.5 released October 15, 2003 
              // XPCNativeWrapper used to create security wrapper
              else if (typeof window.XPCNativeWrapper !== "undefined" &&
                  typeof window.globalStorage === "undefined" &&
                  typeof window.devicePixelRatio === "undefined" &&
                  typeof createdElement.style.animation === "undefined" &&
                  typeof document.querySelector === "undefined") {
                  firefoxVersion = "1.5";
              }
      
              // Firefox 2 released October 24, 2006
              // globalStorage later deprecated in favor of localstorage
              else if (typeof window.globalStorage !== "undefined" &&
                  typeof window.postMessage === "undefined") {
                  firefoxVersion = "2";
              }
      
              // Firefox 3 released June 17, 2008
              // postMessage for cross window messaging
              else if (typeof window.postMessage !== "undefined" &&
                  typeof document.querySelector === "undefined") {
                  firefoxVersion = "3";
              }
      
              // Firefox 3.5 released June 30, 2009
              // querySelector returns list of the elements from document
              else if (typeof document.querySelector !== "undefined" &&
                  typeof window.mozRequestAnimationFrame === "undefined" &&
                  typeof Reflect === "undefined") {
                  firefoxVersion = "3.5";
              }
      
              // Firefox 4 released March 22, 2011
              // window.URL is Gecko, Webkit is window.webkitURL, manages object URLs
              else if (typeof window.URL !== "undefined" &&
                  typeof createdElement.style.MozAnimation === "undefined") {
                  firefoxVersion = "4";
              }
      
              // After April 2011 releases every six weeks on Tuesday
      
              // Firefox 5 released June 21, 2011
              // style.MozAnimation for CSS animation, renamed to style.animation
              else if (typeof createdElement.style.MozAnimation !== "undefined" &&
                  typeof WeakMap === "undefined") {
                  firefoxVersion = "5";
              }
      
              // Firefox 6 released August 16, 2011
              // WeakMap collects key value pairs weakly referenced
              else if (typeof WeakMap !== "undefined" &&
                  typeof createdElement.style.textOverflow === "undefined") {
                  firefoxVersion = "6";
              }
      
              // Firefox 7 released September 27, 2011
              // textOverflow manages overflowed non displayed content
              else if (typeof createdElement.style.textOverflow !== "undefined" &&
                  typeof createdElement.insertAdjacentHTML === "undefined") {
                  firefoxVersion = "7";
              }
      
              // Firefox 8 released November 8, 2011
              // insertAdjacentHTML parses as HTML and inserts into specified position
              // faster than direct innerHTML manipulation and
              // appends without affecting other elements under the same parent
              else if (typeof createdElement.insertAdjacentHTML !== "undefined" &&
                  typeof navigator.doNotTrack === "undefined") {
                  firefoxVersion = "8";
              }
      
              // Firefox 9 released December 20, 2011
              // mozIndexedDB dropped ver 16, renamed window.indexedDB 
              // IndexDB improved functionality than localstorage
              else if (typeof window.mozIndexedDB !== "undefined" &&
                  typeof document.mozFullScreenEnabled === "undefined") {
                  firefoxVersion = "9";
              }
      
              // Firefox 10 released January 31, 2012
              // mozFullScreenEnabled reports if full-screen mode is available
              else if (typeof document.mozFullScreenEnabled !== "undefined" &&
                  typeof window.mozCancelAnimationFrame === "undefined" &&
                  typeof Reflect === "undefined") {
                  firefoxVersion = "10";
              }
      
              // Firefox 11 released March 13, 2012
              // mozCancelAnimationFrame prior to Firefox 23 prefixed with moz
              // Cancels an animation frame request
              else if (typeof window.mozCancelAnimationFrame !== "undefined" &&
                  typeof createdElement.style.MozTextAlignLast === "undefined") {
                  firefoxVersion = "11";
              }
      
              // Firefox 12 released April 24, 2012
              // MozTextAlignLast how the last line is aligned
              else if (typeof createdElement.style.MozTextAlignLast !== "undefined" &&
                  typeof createdElement.style.MozOpacity !== "undefined") {
                  firefoxVersion = "12";
              }
      
              // Firefox 13 released June 5, 2012
              // MozOpacity dropped from this version
              else if (typeof createdElement.style.MozOpacity === "undefined" &&
                  typeof window.globalStorage !== "undefined") {
                  firefoxVersion = "13";
              }
      
              // Firefox 14 released June 26, 2012
              // globalStorage dropped from this version
              else if (typeof window.globalStorage === "undefined" &&
                  typeof createdElement.style.borderImage === "undefined" &&
                  typeof document.querySelector !== "undefined") {
                  firefoxVersion = "14";
              }
      
              // Firefox 15 released August 28, 2012
              // borderImage allows drawing an image on the borders of elements
              else if (typeof createdElement.style.borderImage !== "undefined" &&
                  typeof createdElement.style.animation === "undefined") {
                  firefoxVersion = "15";
              }
      
              // Firefox 16 released October 9, 2012
              // animation was MozAnimation
              else if (typeof createdElement.style.animation !== "undefined" &&
                  typeof createdElement.style.iterator === "undefined" &&
                  typeof Math.hypot === "undefined") {
                  firefoxVersion = "16";
              }
      
              // Firefox 17 released November 20, 2012
              // version 27 drops iterator and renames italic
              // Used to iterate over enumerable properties of an object
              else if (typeof createdElement.style.iterator !== "undefined" &&
                  typeof window.devicePixelRatio === "undefined") {
                  firefoxVersion = "17";
              }
      
              // Firefox 18 released January 8, 2013
              // devicePixelRatio returns ratio of one vertical pixel between devices
              else if (typeof window.devicePixelRatio !== "undefined" &&
                  typeof window.getInterface === "undefined" &&
                  typeof createdElement.style.mixBlendMode === "undefined") {
                  firefoxVersion = "18";
              }
      
              // Firefox 19 released February 19, 2013
              // getInterface dropped and renamed in version 32
              // Retrieves specified interface pointers
              else if (typeof window.getInterface !== "undefined" &&
                  typeof Math.imul === "undefined") {
                  firefoxVersion = "19";
              }
      
              // Firefox 20 released April 2, 2013
              // Math.imul provides fast 32 bit integer multiplication
              else if (typeof Math.imul !== "undefined" &&
                  typeof window.crypto.getRandomValues === "undefined") {
                  firefoxVersion = "20";
              }
      
              // Firefox 21 released May 14, 2013
              // getRandomValues lets you get cryptographically random values
              else if (typeof window.crypto.getRandomValues !== "undefined" &&
                  typeof createdElement.style.flex === "undefined") {
                  firefoxVersion = "21";
              }
      
              // Firefox 22 released June 25, 2013
              // flex can alter dimensions to fill available space
              else if (typeof createdElement.style.flex !== "undefined" &&
                  typeof window.cancelAnimationFrame === "undefined") {
                  firefoxVersion = "22";
              }
      
              // Firefox 23 released August 6, 2013
              // cancelAnimationFrame was mozCancelAnimationFrame
              else if (typeof window.cancelAnimationFrame !== "undefined" &&
                  typeof document.loadBindingDocument !== "undefined" &&
                  typeof Math.trunc === "undefined") {
                  firefoxVersion = "23";
              }
      
              // Firefox 24 released September 17, 2013
              // loadBindingDocument dropped
              // loadBindingDocument reintroduced in 25 then dropped again in 26 
              else if (typeof document.loadBindingDocument === "undefined" &&
                  typeof Math.trunc === "undefined") {
                  firefoxVersion = "24";
              }
      
              // Firefox 25 released October 29, 2013
              // Math.trunc returns number removing fractional digits
              else if (typeof Math.trunc !== "undefined" &&
                  typeof document.loadBindingDocument !== "undefined") {
                  firefoxVersion = "25";
              }
      
              // Firefox 26 released December 10, 2013
              // loadBindingDocument dropped
              else if (typeof Math.trunc !== "undefined" &&
                  typeof Math.hypot === "undefined") {
                  firefoxVersion = "26";
              }
      
              // Firefox 27 released February 4, 2014
              // Math.hypot returns square root of the sum of squares
              else if (typeof Math.hypot !== "undefined" &&
                  typeof createdArray.entries === "undefined") {
                  firefoxVersion = "27";
              }
      
              // Firefox 28 released March 18, 2014
              // entries returns key value pairs for arrays
              else if (typeof createdArray.entries !== "undefined" &&
                  typeof createdElement.style.boxSizing === "undefined") {
                  firefoxVersion = "28";
              }
      
              // Firefox 29 released April 29, 2014
              // boxSizing alters CSS box model, calculates width and height of elements
              else if (typeof createdElement.style.boxSizing != "undefined" &&
                  typeof createdElement.style.backgroundBlendMode === "undefined") {
                  firefoxVersion = "29";
              }
      
              // Firefox 30 released June 10, 2014
              // backgroundBlendMode blends elements background images
              else if (typeof createdElement.style.backgroundBlendMode !== "undefined" &&
                  typeof createdElement.style.paintOrder === "undefined") {
                  firefoxVersion = "30";
              }
      
              // Firefox 31 released July 22, 2014
              // paintOrder specifies the order fill, stroke, markers of shape or element
              else if (typeof createdElement.style.paintOrder !== "undefined" &&
                  typeof createdElement.style.mixBlendMode === "undefined") {
                  firefoxVersion = "31";
              }
      
              // Firefox 32 released September 2, 2014
              // mixBlendMode how an element should blend 
              else if (typeof createdElement.style.mixBlendMode !== "undefined" &&
                  typeof Number.toInteger !== "undefined") {
                  firefoxVersion = "32";
              }
      
              // Firefox 33 released October 14, 2014
              // numberToIntger dropped, used to convert values to integer
              else if (typeof Number.toInteger === "undefined" &&
                  typeof createdElement.style.fontFeatureSettings === "undefined") {
                  firefoxVersion = "33";
              }
      
              // Firefox 34 released December 1, 2014
              // fontFeatureSettings control over advanced typographic features
              else if (typeof createdElement.style.fontFeatureSettings !== "undefined" &&
                  typeof navigator.mozIsLocallyAvailable !== "undefined") {
                  firefoxVersion = "34";
              }
      
              // Firefox 35 released January 13, 2015
              // mozIsLocallyAvailable dropped
              else if (typeof navigator.mozIsLocallyAvailable === "undefined" &&
                  typeof createdElement.style.MozWindowDragging === "undefined") {
                  firefoxVersion = "35";
              }
      
              // Firefox 36 released February 24, 2015
              // quote returns a copy of the string
              else if (typeof String.quote !== "undefined" &&
                  typeof createdElement.style.MozWindowDragging !== "undefined") {
                  firefoxVersion = "36";
              }
      
              // Firefox 37 released March 31, 2015
              // quote quickly dropped
              else if (typeof String.quote === "undefined" &&
                  typeof createdElement.style.rubyPosition === "undefined") {
                  firefoxVersion = "37";
              }
      
              // Firefox 38 released May 12, 2015
              // rubyPosition defines position of a ruby element relative to its base element
              else if (typeof createdElement.style.rubyPosition !== "undefined" &&
                  typeof window.Headers === "undefined") {
                  firefoxVersion = "38";
              }
      
              // Firefox 39 released July 2, 2015
              // Headers allows us to create our own headers objects 
              else if (typeof window.Headers !== "undefined" &&
                  typeof Symbol.match === "undefined") {
                  firefoxVersion = "39";
              }
      
              // Firefox 40 released August 11, 2015
              // match matches a regular expression against a string
              else if (typeof Symbol.match !== "undefined" &&
                  typeof Symbol.species === "undefined") {
                  firefoxVersion = "40";
              }
      
              // Firefox 41 released September 22, 2015
              // species allows subclasses to over ride the default constructor
              else if (typeof Symbol.species !== "undefined" &&
                  typeof Reflect === "undefined") {
                  firefoxVersion = "41";
              }
      
              // Firefox 42 released November 3, 2015
              // mozRequestAnimationFrame and mozFullScreenEnabled dropped
              // Reflect offers methods for interceptable JavaScript operations
              else if (typeof Reflect !== "undefined" &&
                  typeof window.screen.orientation === "undefined") {
                  firefoxVersion = "42";
              }
      
              // Firefox 43 released December 15, 2015
              // orientation is mozOrientation in B2G and Android
              else if (typeof window.screen.orientation !== "undefined" &&
                  typeof document.charset === "undefined") {
                  firefoxVersion = "43";
              }
      
              // Firefox 44 released January 26, 2016
              // charset is for legacy, use document.characterSet
              else if (typeof document.charset !== "undefined" &&
                  typeof window.onstorage === "undefined") {
                  firefoxVersion = "44";
              }
      
              // Firefox 45 released March 8, 2016
              // onstorage contains an event handler that runs when the storage event fires
              else if (typeof window.onstorage !== "undefined" &&
                  typeof window.onabsolutedeviceorientation === "undefined") {
                  firefoxVersion = "45";
              }
      
              // Firefox 46 - beta
              // onabsolutedeviceorientation
              else if (typeof window.onabsolutedeviceorientation !== "undefined") {
                  firefoxVersion = "46 or above";
              }
      
              // Else could not verify
              else {
                  outputVersion.innerHTML = "Could not verify Mozilla Firefox";
              }
      
              // Display Firefox version
              outputVersion.innerHTML = "Verified as Mozilla Firefox " + firefoxVersion;
      
              // Else not detected
          } else {
              outputVersion.innerHTML = "Mozilla Firefox not detected";
          }
      } catch (e) {
          // Statement to handle exceptions
          outputVersion.innerHTML = "An error occured. This could be because the default settings in Firefox have changed. Check about.config ";
      }
      <div id="displayFoxVersion"></div>

      【讨论】:

        【解决方案5】:

        如果您想知道 FireFox 的数字版本是什么,您可以使用以下 sn-p:

        var match = window.navigator.userAgent.match(/Firefox\/([0-9]+)\./);
        var ver = match ? parseInt(match[1]) : 0;
        

        【讨论】:

          【解决方案6】:

          很长一段时间我都在使用替代方案:

          ('netscape' in window) && / rv:/.test(navigator.userAgent)
          

          因为我不信任用户代理字符串。使用功能检测无法检测到某些错误,因此某些解决方法需要检测浏览器。

          此外,如果您正在解决 Gecko 中的错误,那么该错误可能也在 Firefox 的衍生版本中,并且此代码也应该适用于衍生版本(Waterfox 和 Pale Moon 在用户代理字符串中是否有“Firefox”?) .

          【讨论】:

          • 我也不信任用户代理字符串,所以谢谢
          • 这行得通,但为什么呢?它到底在做什么?
          【解决方案7】:
              <script type="text/javascript">
                     var isChrome = /Chrome/.test(navigator.userAgent) && /Google 
                                     Inc/.test(navigator.vendor);
                     var isFirefox = 
                            navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
                     if (isChrome) 
                     { 
                         document.write('<'+'link rel="stylesheet" 
                                            href="css/chrome.css" />');
          
                     }
                    else if(isFirefox)
                     {
                         document.write('<'+'link rel="stylesheet" 
                                            href="css/Firefox.css" />');
                     }
                     else
                     {
                          document.write('<'+'link rel="stylesheet" 
                                             href="css/IE.css" />');
                      }
          
               </script>
          

          这非常适合 IE、Firefox 和 Chrome。

          【讨论】:

            【解决方案8】:

            另一个答案:

            parseFloat(navigator.userAgent.split('Firefox/').pop(), 10) >= 92;
            

            应该比使用正则表达式更快...

            【讨论】:

              猜你喜欢
              • 2013-07-05
              • 1970-01-01
              • 2011-01-09
              • 2013-03-16
              • 1970-01-01
              • 2013-02-26
              • 1970-01-01
              • 1970-01-01
              • 2021-05-24
              相关资源
              最近更新 更多