Phát hiện tất cả các phiên bản Firefox trong JS


152

Làm cách nào để phát hiện Firefox trong JavaScript?
Tôi muốn phát hiện tất cả các phiên bản của Firefox.


5
Bạn thực sự đang cố gắng để đạt được điều gì? Thường có những cách tốt hơn để giải quyết vấn đề (như bằng cách sử dụng tính năng phát hiện) hơn là phát hiện một trình duyệt cụ thể.
jfriend00

3
Tại sao mọi người đăng câu hỏi, khiến mọi người trả lời yêu cầu làm rõ và sau đó người hỏi câu hỏi không phản hồi? Vấn đề ở đây là gì? Có vẻ thô lỗ với tôi.
jfriend00

38
Trong trường hợp của bạn, có thể là do bạn không trả lời câu hỏi, bạn đang đưa ra ý kiến ​​của mình về lý do tại sao điều này không nên được thực hiện. Nhân tiện, có nhiều lý do chính đáng để phát hiện trình duyệt, ví dụ như cần hiển thị thông báo cảnh báo như 'Firefox không được hỗ trợ' trên một trang web công ty nội bộ lớn được xây dựng cho IE từ lâu và không ai nghĩ rằng nó hiệu quả về chi phí để làm bất cứ điều gì hơn thế nữa nhưng bạn cần cho người dùng biết để họ không bị thất vọng bởi các lỗi trong khi cố gắng sử dụng nó, v.v.
pilavdzice

3
Ví dụ: Firefox sử dụng các Mã khóa khác nhau cho các phím _ / - và + / = được nhấn cho tất cả các trình duyệt khác, đó là lý do tại sao tôi cần có thể phát hiện xem tác nhân người dùng có phải là Firefox không.
moloko

2
Ví dụ: Firefox không hoạt động với //# sourceURLcách tiếp cận các tập lệnh được nối thêm, chúng phải được chỉnh sửa eval, nhưng tất cả các trình duyệt khác đều có.
glenatron

Câu trả lời:


294

Điều này sẽ phát hiện bất kỳ phiên bản Firefox nào:

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

cụ thể hơn:

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

Bạn có thể muốn xem xét sử dụng ala Modernizr phát hiện tính năng , hoặc một công cụ liên quan, để thực hiện những gì bạn cần.


31
Hoặc với regexvar is_firefox = /firefox/i.test(navigator.userAgent)
JackMahoney

17
Tôi tin rằng indexOfphương thức chuỗi nhanh hơn một biểu thức thông thường.
Tomáš Zato - Phục hồi Monica

2
Tôi muốn nhấn mạnh những gì @ TomášZato nói. Đây không phải là một tìm kiếm phức tạp và do đó không nên sử dụng regex ... hoặc tôi có thiếu điều gì về regex không?
dudewad

2
Tìm kiếm regex là tốt đẹp và súc tích cho những nơi mà sự ngắn gọn quan trọng hơn tốc độ. Và nó dễ dàng và rõ ràng hơn để sửa chữa cho các trình duyệt giống Firefox mà không tự tạo thương hiệu một cách hữu ích như: /firefox|iceweasel/i.test(navigator.userAgent)
android.weasel

4
Phần sau đây cho phép phát hiện bất kỳ Firefox hoặc trình duyệt nào khác: stackoverflow.com/questions/9847580/ trên
Max Stern

14

Nếu bạn muốn biết phiên bản số của FireFox là gì, bạn có thể sử dụng đoạn mã sau:

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

5

Kịch bản này phát hiện tất cả các phiên bản Firefox, dành cho Máy tính để bàn, từ phiên bản 1 đến 46.

Đây là lần thứ ba tôi cố gắng trả lời câu hỏi này trên StackOverflow vì tôi liên tục tìm ra những cách mới để phá vỡ tập lệnh của mình. Tuy nhiên, tôi nghĩ rằng nó đang hoạt động. Đây là một bài tập tuyệt vời để tìm hiểu về các tính năng của Firefox và thú vị để xem mọi thứ đã phát triển như thế nào. Kịch bản có thể được viết lại bằng các tính năng khác nhau, tôi đã chọn những tính năng mà tôi nghĩ sẽ hữu ích nhất, tôi thích người khác viết lại bằng các tính năng hữu ích khác và đăng ở đây, và so sánh kết quả.

Tôi đã đặt tập lệnh trong câu lệnh thử trong trường hợp người dùng có bất kỳ cài đặt bị tắt nào trong about.config. Mặt khác, tôi đã thử nghiệm trên mọi phiên bản Firefox và nó phát hiện ra từng phiên bản. Tôi đã đưa ra một mô tả ngắn gọn về những gì mỗi tính năng được sử dụng cho các ý kiến. Tôi cũng muốn làm điều này cho Webkit nhưng tìm tài liệu không tốt bằng. Mozilla có thể dễ dàng tải xuống các phiên bản trước và bản phát hành chi tiết.

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


3

Trong một thời gian dài, tôi đã sử dụng thay thế:

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

bởi vì tôi không tin tưởng chuỗi tác nhân người dùng. Một số lỗi không thể phát hiện được bằng cách sử dụng tính năng phát hiện, vì vậy việc phát hiện trình duyệt là bắt buộc đối với một số cách giải quyết.

Ngoài ra, nếu bạn đang xử lý một lỗi trong Gecko, thì lỗi đó có lẽ cũng nằm trong các dẫn xuất của Firefox và mã này cũng hoạt động với các dẫn xuất (Do Waterfox và Pale Moon có 'Firefox' trong chuỗi tác nhân người dùng không?).


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

Điều này hoạt động hoàn hảo cho IE, Firefox và Chrome.


Vui lòng chỉnh sửa để thêm mã có ý nghĩa và mô tả giải pháp ở đây. Đăng một ví dụ tối thiểu, đầy đủ, có thể kiểm chứng thể hiện giải pháp của bạn. Cảm ơn :-) !
Peter

-2

nó đây

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

-5

giải pháp tốt nhất cho tôi:

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 ");
		}		

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.