Phát hiện phiên bản IE (trước v9) trong JavaScript


246

Tôi muốn đưa người dùng của trang web của chúng tôi đến một trang lỗi nếu họ đang sử dụng phiên bản Internet Explorertrước v9. Nó chỉ không xứng đáng với thời gian và tiền bạc của chúng tôi để hỗ trợ IE pre-v9. Người dùng của tất cả các trình duyệt không phải IE khác đều ổn và không bị trả về. Đây là mã đề xuất:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

Mã này sẽ làm gì?

Để đưa ra một vài ý kiến ​​có thể sẽ đến theo cách của tôi:

  1. Có, tôi biết rằng người dùng có thể giả mạo useragent chuỗi . Tôi không quan tâm.
  2. Vâng, tôi biết rằng các chuyên gia lập trình thích đánh hơi hỗ trợ tính năng thay vì loại trình duyệt nhưng tôi không cảm thấy cách tiếp cận này có ý nghĩa trong trường hợp này. Tôi đã biết rằng tất cả các trình duyệt không có IE (có liên quan) đều hỗ trợ các tính năng mà tôi cần và tất cảpre-v9 IE trình duyệt không có. Kiểm tra tính năng theo tính năng trên toàn trang web sẽ là một sự lãng phí.
  3. Có, tôi biết rằng ai đó đang cố truy cập trang web bằng cách sử dụng IE v1 (hoặc> = 20) sẽ không được đặt 'badBrowser' thành đúng và trang cảnh báo sẽ không được hiển thị đúng. Đó là một rủi ro chúng tôi sẵn sàng chấp nhận.
  4. Có, tôi biết rằng Microsoft có "nhận xét có điều kiện" có thể được sử dụng để phát hiện phiên bản trình duyệt chính xác. IE không còn hỗ trợ các bình luận có điều kiện kể từ đó IE 10, khiến cách tiếp cận này hoàn toàn vô dụng.

Bất kỳ vấn đề rõ ràng khác để nhận thức?


122
"Thật không đáng để chúng tôi dành thời gian và tiền bạc để hỗ trợ IE trước v9". Tôi ước tôi có thể làm điều đó.
Hassan

2
Dựa trên điểm [2] Tôi sẽ không đề xuất Modernizr ( en.wikipedia.org/wiki/Modernizr ) - mọi người phải vẽ một đường thẳng trên cát ở đâu đó - nhưng IE9 có vẻ giống như một đường cao
amelvin

1
Bình luận có điều kiện chỉ là bình luận bình thường. Chỉ IE diễn giải chúng là những người đặc biệt. IE10 + sẽ không làm điều đó nữa.
Andreas

3
Nhận xét có điều kiện sẽ được IE 10 đối xử giống hệt như các trình duyệt không phải IE. Chúng là các nhận xét HTML hợp lệ vì vậy sẽ được xử lý như vậy. Tôi đồng ý với Andreas và nghĩ rằng những bình luận có điều kiện là con đường để đi.
Tim Down

1
Tài liệu chính thức cho biết IE10 + sẽ không hỗ trợ các bình luận có điều kiện: blog.msdn.com/b/ie/archive/2011/07/06/ trên - Cảm ơn: stackoverflow.com/a/9900331/320399
blong

Câu trả lời:


354

Đây là cách ưa thích của tôi để làm điều đó. Nó cho phép kiểm soát tối đa. (Lưu ý: Câu lệnh có điều kiện chỉ được hỗ trợ trong IE5 - 9.)

Đầu tiên hãy thiết lập chính xác các lớp tức là của bạn

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>    <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->    
<head>

Sau đó, bạn chỉ có thể sử dụng CSS để tạo ngoại lệ kiểu hoặc nếu bạn yêu cầu, bạn có thể thêm một số JavaScript đơn giản:

(function ($) {
    "use strict";

    // Detecting IE
    var oldIE;
    if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
        oldIE = true;
    }

    if (oldIE) {
        // Here's your JS for IE..
    } else {
        // ..And here's the full-fat code for everyone else
    }

}(jQuery));

Cảm ơn Paul Ailen .


21
Cho rằng OP đã yêu cầu một giải pháp JavaScript hoàn toàn, tôi tin rằng câu trả lời của @Tim Down bên dưới là tốt hơn, vì nó không liên quan đến việc thay đổi HTML hiện có, cộng với việc nó không sử dụng jQuery: stackoverflow.com/a/10965203/134120
AsoodAsItGets

Tôi gặp lỗi với điều này trên trình xác nhận w3 html:Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
abumalick

161

Trả về phiên bản IE hoặc nếu không IE trả về false

function isIE () {
  var myNav = navigator.userAgent.toLowerCase();
  return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

Thí dụ:

if (isIE () == 8) {
 // IE8 code
} else {
 // Other versions IE or not IE
}

hoặc là

if (isIE () && isIE () < 9) {
 // is IE version less than 9
} else {
 // is IE 9 and later or not IE
}

hoặc là

if (isIE()) {
 // is IE
} else {
 // Other browser
}

36
Không hoạt động cho IE11. Từ IE 11, họ đã thay đổi chuỗi UA thành"mozilla/5.0 (windows nt 6.3; wow64; trident/7.0; .net4.0e; .net4.0c; media center pc 6.0; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; rv:11.0) like gecko"
Annie

22
Xin lưu ý rằng trong FF "false <9" là "true". Vì vậy, điều kiện nên làif (isIE () && isIE () < 9) {
nZeus

3
@DeadlyChambers có lẽ nó đang chạy trong chế độ tiêu chuẩn IE7? msdn.microsoft.com/en-us/l
Library /ie / cc196988 (v = vs85) .aspx

4
Câu trả lời được phê duyệt là làm thế nào để phát hiện phiên bản IE trong HTML. Điều này trả lời câu hỏi ban đầu.
Matt Wagner

2
@PrasadGayan - Microsoft Edge không phải là Internet Explorer. Vì vậy, trả lại sai dường như là điều chính xác cho nó để làm.
BryanGrezeszak

120

Nếu không có ai khác đã thêm một đối addEventListerxứng và bạn đang sử dụng chế độ trình duyệt chính xác thì bạn có thể kiểm tra IE 8 trở xuống với

if (window.attachEvent && !window.addEventListener) {
    // "bad" IE
}

Di sản Internet Explorer và Đính kèm (MDN)


7
Đây có vẻ là cách hiệu quả nhất để phát hiện IE <= 8 hoàn toàn bằng JavaScript - và rất tốt cho những người như tôi, những người đang tìm kiếm cách để làm điều đó.
Gregory Magarshak 18/03/13

Tuyệt quá! Điều này cũng phát hiện IE9 trong Chế độ Quirks, đó là những gì tôi đang tìm kiếm.
vào

7
Mặc dù đây là một giải pháp "dễ sử dụng", nhưng nó có một số rủi ro. Bất cứ ai trong công ty của bạn (không biết về giải pháp của bạn) đều có thể triển khai "addEventListener" hoặc "Đính kèm" để xử lý việc thiếu nó trong IE 8. Và sau đó, mã của bạn sẽ ngừng hoạt động.
Zé Carlos

@RoyiNamir Bài kiểm tra này cho IE8. Tại sao nó lại trở về đúng trên IE11?
Andreas

@Andreas oops. không thấy rằng OP muốn trước eg9. xóa.
Royi Namir

114

Sử dụng ý kiến ​​có điều kiện. Bạn đang cố gắng phát hiện người dùng IE <9 và các nhận xét có điều kiện sẽ hoạt động trong các trình duyệt đó; trong các trình duyệt khác (IE> = 10 và không phải IE), các nhận xét sẽ được coi là các nhận xét HTML thông thường, đó là những gì chúng là.

Ví dụ HTML:

<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->

Bạn cũng có thể làm điều này hoàn toàn với tập lệnh, nếu bạn cần:

var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
    alert("WE DON'T LIKE YOUR BROWSER");
}

5
Phiên bản JavaScript của câu trả lời của @Tim Down hoạt động rất tốt đối với tôi. Tôi đã sử dụng BrowserStack để kiểm tra nó với Windows 7 và IE 8, 9, 10 và 11; Mac OS X Snow Leopard với Safari 5.1, Firefox 28.0, Chrome 33.0 và Opera 20.0; iPhone 5 Mobile Safari; và Android Samsung Galaxy Tab 2 10.1 4.0. Đúng như dự đoán, chỉ IE8 báo cáo rằng đó là IeLessThan9. Đẹp!
Steve Saporta

58

Để dễ dàng phát hiện MSIE (v6 - v7 - v8 - v9 - v10 - v11):

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}

Hữu ích để phát hiện IE10, vì nó không hỗ trợ các bình luận có điều kiện. Không hoạt động trong IE11, nhưng IE11 thường có hành vi ổn
personne3000

11
Cuối cùng, một câu trả lời không giảng về việc sử dụng tính năng phát hiện và thực sự trả lời câu hỏi.
cdmckay

32

Đây là cách AngularJS kiểm tra IE

/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
var msie = document.documentMode;

if (msie < 9) {
    // code for IE < 9
}

Wow điều này là đơn giản hơn nhiều so với tất cả các bình luận có điều kiện! Không có giới hạn của điều này?
andrewb

Theo các tài liệu, IE8 + hỗ trợ thuộc tính này nên tôi nghĩ nên đủ cho hầu hết các trường hợp.
iurii

Theo tham chiếu MSDN, "Khi tài liệu hiện tại chưa được xác định, documentMode trả về giá trị bằng 0 (0). Điều này thường xảy ra khi tài liệu đang tải." Điều này có nghĩa là bạn có thể không nhận được phản hồi hợp lệ trong tập lệnh được tải trong <head>?
Erik Knowles

Tôi nghĩ bạn có thể sửa nó bằng cách kiểm tra giá trị trên window.onload khi tài liệu đã được tải.
iurii


19

Phát hiện phiên bản IE bằng tính năng phát hiện tính năng (IE6 +, các trình duyệt trước IE6 được phát hiện là 6, trả về null cho các trình duyệt không phải IE):

var ie = (function (){
    if (window.ActiveXObject === undefined) return null; //Not IE
    if (!window.XMLHttpRequest) return 6;
    if (!document.querySelector) return 7;
    if (!document.addEventListener) return 8;
    if (!window.atob) return 9;
    if (!document.__proto__) return 10;
    return 11;
})();

Chỉnh sửa: Tôi đã tạo một repo bower / npm để thuận tiện cho bạn: tức là phiên bản

Cập nhật:

một phiên bản nhỏ gọn hơn có thể được viết thành một dòng như:

return window.ActiveXObject === undefined ? null : !window.XMLHttpRequest ? 6 : !document.querySelector ? 7 : !document.addEventListener ? 8 : !window.atob ? 9 : !document.__proto__ ? 10 : 11;

16

Hàm này sẽ trả về số phiên bản chính của IE dưới dạng số nguyên hoặc undefinednếu trình duyệt không phải là Internet Explorer. Điều này, giống như tất cả các giải pháp tác nhân người dùng, có thể dễ dàng giả mạo tác nhân người dùng (vốn là một tính năng chính thức của IE kể từ phiên bản 8).

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}

Owen, làm thế nào để sử dụng nó trong thực tế? Làm thế nào để lấy lại giá trị trả về? Tôi đã thử console.log(!!match && parseInt(match[1])), console.log(parseInt(match[1]))console.log(match), nhưng không có kết quả với bất kỳ trong số họ.
Frank Conijn

Nhận giá trị trả về bằng cách gọi hàm chính nó getIEVersion(). Ví dụ:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
Owen

15

Phát hiện IE trong JS bằng cách sử dụng các bình luận có điều kiện

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
//     ie === undefined
// If you're in IE (>=5) then you can determine which version:
//     ie === 7; // IE7
// Thus, to detect IE:
//     if (ie) {}
// And to detect the version:
//     ie === 6 // IE6
//     ie > 7 // IE8, IE9 ...
//     ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());

Đó là khá nhiều như câu trả lời của tôi.
Tim Xuống

@TimDown: Có lẽ, nhưng câu trả lời này hoàn thiện hơn một chút về tính năng (nó cho bạn biết số phiên bản) và được nhận xét tốt. Ngoài ra, liên kết ở đầu câu trả lời này dẫn đến một Gist với một số bình luận thông tin và các biến thể thú vị về kỹ thuật này.
Alan

@Alan: Điểm công bằng. Tôi đã điều chỉnh câu hỏi của tôi nhưng không trích dẫn nguồn.
Tim Down

12

Điều này làm việc cho tôi. Tôi sử dụng nó như một chuyển hướng đến một trang giải thích lý do tại sao chúng tôi không thích <IE9 và cung cấp các liên kết đến các trình duyệt mà chúng tôi thích.

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->

1
Ohw, đó là một khó chịu. Tôi sử dụng một phương pháp thân thiện hơn, hiển thị div với giao diện cảnh báo IE và khi khách truy cập nhấp vào nó, người dùng sẽ truy cập vào trang webhappy.com
Codebeat

10

Mã của bạn có thể thực hiện kiểm tra, nhưng như bạn nghĩ, nếu ai đó cố truy cập trang của bạn bằng IE v1 hoặc> v19 sẽ không gặp lỗi, vì vậy có thể kiểm tra an toàn hơn với biểu thức Regex như mã này bên dưới:

var userAgent = navigator.userAgent.toLowerCase();
// Test if the browser is IE and check the version number is lower than 9
if (/msie/.test(userAgent) && 
    parseFloat((userAgent.match(/.*(?:rv|ie)[\/: ](.+?)([ \);]|$)/) || [])[1]) < 9) {
  // Navigate to error page
}

Đây không phải là một câu trả lời tốt. UA-sniffing là không đáng tin cậy. Thêm vào đó ở đây: modernizr.com/docs
Jezen Thomas

3
@Jezen Đôi khi đánh hơi UA là cách để đi: github.com/Modernizr/Modernizr/issues/538
István Ujj-Mészáros

8

Nhận xét có điều kiện không còn được hỗ trợ trong IE kể từ Phiên bản 10 như đã lưu ý trên trang tham chiếu của Microsoft .

var ieDetector = function() {
  var browser = { // browser object

      verIE: null,
      docModeIE: null,
      verIEtrue: null,
      verIE_ua: null

    },
    tmp;

  tmp = document.documentMode;
  try {
    document.documentMode = "";
  } catch (e) {};

  browser.isIE = typeof document.documentMode == "number" || eval("/*@cc_on!@*/!1");
  try {
    document.documentMode = tmp;
  } catch (e) {};

  // We only let IE run this code.
  if (browser.isIE) {
    browser.verIE_ua =
      (/^(?:.*?[^a-zA-Z])??(?:MSIE|rv\s*\:)\s*(\d+\.?\d*)/i).test(navigator.userAgent || "") ?
      parseFloat(RegExp.$1, 10) : null;

    var e, verTrueFloat, x,
      obj = document.createElement("div"),

      CLASSID = [
        "{45EA75A0-A269-11D1-B5BF-0000F8051515}", // Internet Explorer Help
        "{3AF36230-A269-11D1-B5BF-0000F8051515}", // Offline Browsing Pack
        "{89820200-ECBD-11CF-8B85-00AA005B4383}"
      ];

    try {
      obj.style.behavior = "url(#default#clientcaps)"
    } catch (e) {};

    for (x = 0; x < CLASSID.length; x++) {
      try {
        browser.verIEtrue = obj.getComponentVersion(CLASSID[x], "componentid").replace(/,/g, ".");
      } catch (e) {};

      if (browser.verIEtrue) break;

    };
    verTrueFloat = parseFloat(browser.verIEtrue || "0", 10);
    browser.docModeIE = document.documentMode ||
      ((/back/i).test(document.compatMode || "") ? 5 : verTrueFloat) ||
      browser.verIE_ua;
    browser.verIE = verTrueFloat || browser.docModeIE;
  };

  return {
    isIE: browser.isIE,
    Version: browser.verIE
  };

}();

document.write('isIE: ' + ieDetector.isIE + "<br />");
document.write('IE Version Number: ' + ieDetector.Version);

sau đó sử dụng:

if((ieDetector.isIE) && (ieDetector.Version <= 9))
{

}

1
Đây là điều duy nhất hoạt động trên toàn bộ mạng, ít nhất là sự hài hước của những thứ tôi đã thử ... thx;)
Henrique C.

Mã này là tốt, nhưng không thể phát hiện chế độ xem khả năng tương thích. Tôi đang sử dụng IE 11 bằng cách sử dụng chế độ xem khả năng tương thích trong IE 8 và mã này vẫn cho version 11EDIT: Mã này là TUYỆT VỜI! haha, nó cho một vật thể với mọi thứ bên trong Phiên bản là 11 nhưng docModeIR bằng 9. Cảm ơn!
MarceloBarbosa

5

Ví dụ: 10 và 11:

Bạn có thể sử dụng js và thêm một lớp trong html để duy trì tiêu chuẩn nhận xét có điều kiện :

  var ua = navigator.userAgent,
      doc = document.documentElement;

  if ((ua.match(/MSIE 10.0/i))) {
    doc.className = doc.className + " ie10";

  } else if((ua.match(/rv:11.0/i))){
    doc.className = doc.className + " ie11";
  }

Hoặc sử dụng lib như bowser:

https://github.com/ded/bowser

Hoặc Modernizr để phát hiện tính năng:

http://modernizr.com/


2
Tôi đã thử một vài kịch bản và giải pháp nhưng không có gì hiệu quả. Sau đó, tôi bao gồm bowser trong dự án và nó chỉ hoạt động. Vì vậy, một trong những gợi ý cho bowser.
Moulde

3

Để phát hiện Internet Explorer 10 | 11, bạn có thể sử dụng tập lệnh nhỏ này ngay sau thẻ body:

Trong trường hợp của tôi, tôi sử dụng thư viện jQuery được tải trong đầu.

<!DOCTYPE HTML>
<html>
<head>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
    <script>if (navigator.appVersion.indexOf('Trident/') != -1) $("body").addClass("ie10");</script>
</body>
</html>

Tôi thích cảm ơn này, tôi chỉ cần phát hiện 10 hoặc 11 vì tôi không hỗ trợ các phiên bản trước
Gần điểm

IE9 cũng là cây đinh ba nhưng không giống với hỗ trợ CSS. Phát hiện của bạn nghĩ là ít nhất 10 nhưng điều đó không chính xác.
Codebeat

3

Điều này đã được trả lời cho đến chết, nhưng đây là tất cả những gì bạn cần.

!!navigator.userAgent.match(/msie\s[5-8]/i)

Ngoài ra, đây là một hộp cát hiển thị mẫu regex dựa trên chuỗi tác nhân người dùng IE phổ biến nhất: regex101.com/r/lC6oP3/1
Timothy Perez

@alessadro - Nhưng nó được cho là vậy phải không? OP muốn thử nghiệm cho <9 ...
nnnnnn

2
var Browser = new function () {
    var self = this;
    var nav = navigator.userAgent.toLowerCase();
    if (nav.indexOf('msie') != -1) {
        self.ie = {
            version: toFloat(nav.split('msie')[1])
        };
    };
};


if(Browser.ie && Browser.ie.version > 9)
{
    // do something
}

2

Theo Microsoft , sau đây là giải pháp tốt nhất, nó cũng rất đơn giản:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    }
    return rv;
}

function checkVersion()
{
    var msg = "You're not using Internet Explorer.";
    var ver = getInternetExplorerVersion();

    if ( ver > -1 )
    {
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
      }
    alert( msg );
}

Thật vậy, và chỉ trong trường hợp người khác hạ cánh ở đây cố gắng sử dụng ở trên, mã trong câu trả lời sau sẽ hoạt động với IE11 ( stackoverflow.com/a/26375930/1129926 ). Nhưng hãy cẩn thận, nó sẽ hoạt động cho IE12, v.v.? Điểm mấu chốt là tốt nhất để coi đây là những bản hack tạm thời và chúng có khả năng thất bại sau đó khi các phiên bản trình duyệt mới được phát hành (tôi thậm chí sẽ không đề cập đến Edge).
Jeff Mergler

1

Tôi sẽ khuyên bạn không nên viết lại mã này lần thứ mười một. Tôi khuyên bạn nên sử dụng thư viện conditionizr ( http://conditionizr.com/ ) có khả năng kiểm tra các phiên bản IE cụ thể cũng như các trình duyệt, hệ điều hành khác và thậm chí sự hiện diện hoặc vắng mặt của màn hình Retina.

Chỉ bao gồm mã cho các thử nghiệm cụ thể mà bạn cần và bạn cũng có được lợi ích của thư viện được thử nghiệm đã trải qua nhiều lần lặp lại (và sẽ dễ dàng nâng cấp mà không phá vỡ mã của bạn).

Nó cũng kết nối độc đáo với Modernizr, có thể xử lý tất cả các trường hợp mà bạn nên kiểm tra khả năng cụ thể hơn là một trình duyệt cụ thể.


1

Tôi làm như thế:

<script>
   function isIE () {
       var myNav = navigator.userAgent.toLowerCase();
       return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
   }    
   var ua = window.navigator.userAgent;
   //Internet Explorer | if | 9-11

   if (isIE () == 9) {
       alert("Shut down this junk! | IE 9");
   } else if (isIE () == 10){
       alert("Shut down this junk! | IE 10");
   } else if (ua.indexOf("Trident/7.0") > 0) {
       alert("Shut down this junk! | IE 11");
   }else{
       alert("Thank god it's not IE!");
   }

</script>

1

Cách tiếp cận này để phát hiện IE kết hợp các điểm mạnh và tránh các điểm yếu trong câu trả lời của jKey bằng cách sử dụng các nhận xét có điều kiện và câu trả lời của Owen bằng các tác nhân người dùng.

  • Cách tiếp cận của jKey hoạt động lên đến phiên bản 9 và miễn nhiễm với giả mạo tác nhân người dùng trong IE 8 & 9.
  • Cách tiếp cận của Owen có thể thất bại trên IE 5 & 6 (báo cáo 7) và dễ bị giả mạo UA, nhưng nó có thể phát hiện các phiên bản IE> = 10 (hiện tại cũng bao gồm 12, trong đó hoãn lại câu trả lời của Owen).

    // ----------------------------------------------------------
    // A short snippet for detecting versions of IE
    // ----------------------------------------------------------
    // If you're not in IE (or IE version is less than 5) then:
    //     ie === undefined
    // Thus, to detect IE:
    //     if (ie) {}
    // And to detect the version:
    //     ie === 6 // IE6
    //     ie > 7 // IE8, IE9 ...
    // ----------------------------------------------------------
    var ie = (function(){
        var v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i');
    
        while (
            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
        if (v <= 4) { // Check for IE>9 using user agent
            var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
            v = match ? parseInt(match[1]) : undefined;
        }
        return v;
    }());

Điều này có thể được sử dụng để đặt các lớp hữu ích cho tài liệu của bạn có chứa phiên bản IE:

    if (ie) {
        document.documentElement.className += ' ie' + ie;
        if (ie < 9)
            document.documentElement.className += ' ieLT9';
    }

Lưu ý rằng nó phát hiện chế độ tương thích đang được sử dụng, nếu IE ở chế độ tương thích. Cũng lưu ý rằng phiên bản IE chủ yếu hữu ích cho các phiên bản cũ hơn (<10); các phiên bản cao hơn tuân thủ tiêu chuẩn hơn và có lẽ tốt hơn là kiểm tra các tính năng bằng cách sử dụng một cái gì đó như Modernizr.js.


1

Tôi đã thực hiện một mixin gạch dưới thuận tiện cho việc này.

_.isIE();        // Any version of IE?
_.isIE(9);       // IE 9?
_.isIE([7,8,9]); // IE 7, 8 or 9?

_.mixin({
  isIE: function(mixed) {
    if (_.isUndefined(mixed)) {
      mixed = [7, 8, 9, 10, 11];
    } else if (_.isNumber(mixed)) {
      mixed = [mixed];
    }
    for (var j = 0; j < mixed.length; j++) {
      var re;
      switch (mixed[j]) {
        case 11:
          re = /Trident.*rv\:11\./g;
          break;
        case 10:
          re = /MSIE\s10\./g;
          break;
        case 9:
          re = /MSIE\s9\./g;
          break;
        case 8:
          re = /MSIE\s8\./g;
          break;
        case 7:
          re = /MSIE\s7\./g;
          break;
      }

      if (!!window.navigator.userAgent.match(re)) {
        return true;
      }
    }

    return false;
  }
});

console.log(_.isIE());
console.log(_.isIE([7, 8, 9]));
console.log(_.isIE(11));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>


1

hoặc đơn giản

//   IE 10: ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; 
//   IE 11: ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; 
// Edge 12: ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; 
// Edge 13: ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; 

var isIE = navigator.userAgent.match(/MSIE|Trident|Edge/)
var IEVersion = ((navigator.userAgent.match(/(?:MSIE |Trident.*rv:|Edge\/)(\d+(\.\d+)?)/)) || []) [1]

0

Tập lệnh JS toàn diện nhất mà tôi tìm thấy để kiểm tra các phiên bản IE là http://www.pinlady.net/PluginDetect/IE/ . Toàn bộ thư viện có tại http://www.pinlady.net/PluginDetect/Browsers/ .

Với IE10, các câu lệnh có điều kiện không còn được hỗ trợ.

Với IE11, tác nhân người dùng không còn chứa MSIE. Ngoài ra, sử dụng tác nhân người dùng không đáng tin cậy vì điều đó có thể được sửa đổi.

Sử dụng tập lệnh JS của PluginDetect, bạn có thể phát hiện cho IE và phát hiện các phiên bản chính xác bằng cách sử dụng mã rất cụ thể và được chế tạo tốt nhắm vào các phiên bản IE cụ thể. Điều này rất hữu ích khi bạn quan tâm chính xác phiên bản trình duyệt bạn đang làm việc.


0

Tôi nhận ra rằng tôi đến bữa tiệc muộn một chút, nhưng tôi đã kiểm tra một cách đơn giản để cung cấp phản hồi về việc trình duyệt có phải là IE hay không và phiên bản nào từ 10 trở xuống. Tôi đã không mã hóa điều này cho phiên bản 11, vì vậy có lẽ sẽ cần một chút sửa đổi cho điều đó.

Tuy nhiên, đây là mã, nó hoạt động như một đối tượng có thuộc tính và phương thức và dựa vào phát hiện đối tượng thay vì cạo đối tượng điều hướng (bị sai sót ồ ạt vì nó có thể bị giả mạo).

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

Việc sử dụng là isIE.browsermột thuộc tính trả về một boolean và dựa vào các nhận xét có điều kiện phương thứcisIE.detectedVersion() trả về một số trong khoảng từ 5 đến 10. Tôi đưa ra giả định rằng bất cứ điều gì thấp hơn 6 và bạn đang ở trong lãnh thổ trường học nghiêm túc và bạn sẽ có gì đó mạnh mẽ hơn một lớp lót và bất cứ thứ gì cao hơn 10 và bạn đang ở trong lãnh thổ mới hơn. Tôi đã đọc một cái gì đó về IE11 không hỗ trợ các bình luận có điều kiện nhưng tôi chưa điều tra đầy đủ, đó có thể là một ngày sau đó.

Dù sao, như nó là, và đối với một lớp lót, nó sẽ bao gồm những điều cơ bản về trình duyệt IE và phát hiện phiên bản. Nó không hoàn hảo, nhưng nó nhỏ và dễ dàng sửa đổi.

Chỉ để tham khảo, và nếu có ai nghi ngờ về cách thực hiện điều này thì điều kiện sau đây sẽ giúp ích.

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

/* testing IE */

if (isIE.browser) {
  alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}

0

Việc phát hiện IE và các phiên bản của nó không thể dễ dàng hơn và tất cả những gì bạn cần là một chút Javascript / vanilla Javascript:

var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

Và đây là một cách để sử dụng nó:

if (browser == 'IE' && ieVersion <= 9) 
    document.documentElement.className += ' ie9-';

.

Hoạt động trong tất cả các phiên bản IE, bao gồm các phiên bản cao hơn ở Chế độ xem / Chế độ tương thích thấp hơn và documentModelà độc quyền của IE.


0

Nếu bạn cần chọn phiên bản IE Browser thì bạn có thể làm theo đoạn mã dưới đây. Mã này hoạt động tốt cho phiên bản IE6 đến IE11

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.</p>

<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo"></p>

<script>
function getInternetExplorerVersion() {
   var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer, return version number
        {               
            if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
                //For IE 11 >
                if (navigator.appName == 'Netscape') {
                    var ua = navigator.userAgent;
                    var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
                    if (re.exec(ua) != null) {
                        rv = parseFloat(RegExp.$1);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>

0

Window chạy IE10 sẽ được cập nhật tự động lên IE11 + và sẽ được chuẩn hóa W3C

Ngày nay, chúng tôi không cần hỗ trợ IE8-

    <!DOCTYPE html>
    <!--[if lt IE 9]><html class="ie ie8"><![endif]-->
    <!--[if IE 9]><html class="ie ie9"><![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
    <head>
        ...
        <!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
        ...
    </head>

0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}

0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others
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.