Làm thế nào để phát hiện IE11?


212

Khi tôi muốn phát hiện IE tôi sử dụng mã này:

function getInternetExplorerVersion()
{
  var rv = -1;
  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 )
  {
    msg = "You are using IE " + ver;
  }
  alert( msg );
}

Nhưng IE11 đang trả về "Bạn không sử dụng Internet Explorer". Làm thế nào tôi có thể phát hiện ra nó?



1
Bất cứ điều gì dựa trên tác nhân người dùng là thiếu sót. Thật quá dễ để giả mạo, Bây giờ, có thể đây không phải là vấn đề, nhưng đối với tôi, một kịch bản phát hiện trình duyệt nên có cơ hội phát hiện giả mạo. Tôi sử dụng kết hợp các bình luận có điều kiện, thông qua việc cố gắng ép buộc document.documentMode và sau đó nhìn vào window.MSInputMethodContext theo Paul Sweatte bên dưới. Tôi sẽ đăng mã của mình nhưng nó đang thả một con ngựa chết.
David G

3
IE11 có tác nhân người dùng: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) như các loại Gecko Os: 6.1 - win7, 6.3 - win81
dao cạo

1
xem câu trả lời của tôi ở đây stackoverflow.com/questions/21825157/
Mạnh

1
Đây là giải pháp tốt nhất tôi đã tìm thấy: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&! window.ActiveXObject) {// là IE11}
xorcus

Câu trả lời:


221

IE11 không còn báo cáo như MSIE, theo danh sách các thay đổi này, đó là cố ý để tránh phát hiện sai.

Những gì bạn có thể làm nếu bạn thực sự muốn biết IE là phát hiện Trident/chuỗi trong tác nhân người dùng nếu navigator.appNametrả về Netscape, đại loại như (chưa được kiểm tra);

function getInternetExplorerVersion()
{
  var rv = -1;
  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 );
  }
  else 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 );
  }
  return rv;
}

console.log('IE version:', getInternetExplorerVersion());

Lưu ý rằng IE11 (afaik) vẫn ở trong bản xem trước và tác nhân người dùng có thể thay đổi trước khi phát hành.


81
it's intentional to avoid mis-detection- Đáng buồn thay, bây giờ IE11 được phát hành, chúng tôi có mã bị hỏng chỉ trong IE11, trong khi một phát hiện chính xác về IE sẽ hoạt động ...
Izkata

68
Tôi đã chuyển đổi giải pháp này thành Boolean nếu phiên bản ít quan trọng hơnfunction isIE() { return ((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))); }
rg89

6
@lzkata - Theo thông số html5 ở đây , IE thực sự tuân theo tiêu chuẩn. Vì vậy, đúng, đó là cố ý, nhưng nó là theo tiêu chuẩn mới (không dùng api html cũ.)
Đánh dấu vào

11
"lý do họ làm điều này là do cố ý. Họ muốn phá vỡ các tập lệnh phát hiện trình duyệt như thế này." từ stackoverflow.com/a/18872067/1066234 ... Thật ra nó phải là: 'Họ muốn làm cho hàng tỷ trang web bị phá vỡ như thế này.'
Kai Noack

15
Điều này làm việc cho tôi: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); nguồn
Kai Noack

86

Sử dụng !(window.ActiveXObject) && "ActiveXObject" in windowđể phát hiện IE11 một cách rõ ràng.

Để phát hiện bất kỳ phiên bản IE (pre-Edge, "Trident") nào, hãy sử dụng "ActiveXObject" in windowthay thế.


2
Bài viết này của Microsoft cho thấy giải pháp này có thể không còn hoạt động nữa msdn.microsoft.com/en-us/l Library / i / dn423948 (v = vs85) .aspx
Alan

5
Trên thực tế, bài viết này mô tả lý do tại sao phương pháp của tôi hoạt động. Cố gắng truy cập window.ActiveXObject, như được mô tả trong bài viết, trả về undefinedIE11 ngay bây giờ (cũng như các trình duyệt không phải của Microsoft.) Thử nghiệm sử dụng intoán tử javascript trả về truetrong tất cả các trình duyệt của Microsoft, vì vậy cả hai đều đúng trong IE11. Nếu Microsoft đưa ra thay đổi đối với hành vi của innhà điều hành, vâng, phương pháp này sẽ bị hỏng.
mcw

5
"ActiveXObject" trong cửa sổ trả về Sai trong Edge.
Neo

8
@Neo Edge không phải là IE, câu hỏi của OP là làm thế nào để phát hiện IE11
mastazi

1
@mastazi yea nhưng trong câu trả lời này, có đề cập rằng ActiveXObject có thể được sử dụng để phát hiện bất kỳ phiên bản IE nào. Mặc dù có thể tranh cãi rằng Edge có nên được gọi là phiên bản IE hay không (Microsoft chắc chắn không muốn gọi nó là một), nhưng đối với nhiều nhà phát triển, IE đã trở thành từ đồng nghĩa với bất kỳ trình duyệt mặc định nào của Microsoft.
Neo

45

Sử dụng MSInputMethodContextnhư một phần của kiểm tra phát hiện tính năng. Ví dụ:

//Appends true for IE11, false otherwise
window.location.hash = !!window.MSInputMethodContext && !!document.documentMode;

Người giới thiệu


2
Điều này dường như với tôi để mạnh mẽ hơn. Chắc chắn bất cứ điều gì dựa trên tác nhân người dùng là khá vô dụng.
David G

1
Điều đó đã làm việc thay vì ActiveXObject. Cảm ơn rất nhiều
Tarık zgün Güner

1
@tdakhla Cập nhật để lọc ra IE Edge.
Paul Sweatte

Điều quan trọng cần lưu ý đối với bất kỳ câu trả lời nào có vẻ như chúng không hoạt động là kiểm tra cài đặt Thi đua, tôi sẽ đánh dấu câu trả lời này là không chính xác nhưng sau đó tôi đã kiểm tra mô phỏng và thấy rằng một số cài đặt tương thích mạng nội bộ đã ghi đè chế độ hiển thị , một khi đã được đưa ra khỏi phương trình, giải pháp này hoạt động tốt với tôi.
Shaun

1
Chỉ cần xác nhận #falsetrong không phải IE, IE8,9,10, Edge 14,15. #truechỉ trong IE11. Không kiểm tra với chế độ tài liệu hoạt động. Đã thử nghiệm với Browserstack.
danjah

15

Tôi đã đọc câu trả lời của bạn và thực hiện một hỗn hợp. Nó dường như hoạt động với Windows XP (IE7 / IE8) và Windows 7 (IE9 / IE10 / IE11).

function ie_ver(){  
    var iev=0;
    var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
    var trident = !!navigator.userAgent.match(/Trident\/7.0/);
    var rv=navigator.userAgent.indexOf("rv:11.0");

    if (ieold) iev=new Number(RegExp.$1);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    return iev;         
}

Tất nhiên nếu tôi trả về 0, có nghĩa là không có IE.


12

Nhận phiên bản IE từ Tác nhân người dùng

var ie = 0;
try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; }
catch(e){}

Cách hoạt động: Chuỗi user-agent cho tất cả các phiên bản IE bao gồm một phần "MSIE không gian phiên bản " hoặc "Trident khác văn rv không gian-hoặc-ruột phiên bản ". Biết điều này, chúng tôi lấy số phiên bản từ một String.match()biểu thức thông thường. Một try-catchkhối được sử dụng để rút ngắn mã, nếu không, chúng ta cần kiểm tra giới hạn mảng cho các trình duyệt không phải IE.

Lưu ý: Tác nhân người dùng có thể bị giả mạo hoặc bỏ qua, đôi khi vô tình nếu người dùng đã đặt trình duyệt của họ thành "chế độ tương thích". Mặc dù điều này dường như không phải là một vấn đề trong thực tế.


Nhận phiên bản IE mà không có tác nhân người dùng

var d = document, w = window;
var ie = ( !!w.MSInputMethodContext ? 11 : !d.all ? 99 : w.atob ? 10 : 
d.addEventListener ? 9 : d.querySelector ? 8 : w.XMLHttpRequest ? 7 : 
d.compatMode ? 6 : w.attachEvent ? 5 : 1 );

Cách thức hoạt động: Mỗi phiên bản IE thêm hỗ trợ cho các tính năng bổ sung không có trong các phiên bản trước. Vì vậy, chúng tôi có thể kiểm tra các tính năng theo cách từ trên xuống. Một chuỗi ternary được sử dụng ở đây để ngắn gọn, if-thenvà các switchcâu lệnh cũng sẽ hoạt động tốt. Biến ieđược đặt thành số nguyên 5-11 hoặc 1 cho cũ hơn hoặc 99 cho mới hơn / không phải IE. Bạn có thể đặt thành 0 nếu bạn chỉ muốn kiểm tra IE 1-11 chính xác.

Lưu ý: Phát hiện đối tượng có thể bị hỏng nếu mã của bạn được chạy trên một trang có tập lệnh của bên thứ ba có thêm polyfill cho những thứ như document.addEventListener. Trong những tình huống như vậy, tác nhân người dùng là lựa chọn tốt nhất.


Phát hiện nếu Trình duyệt hiện đại

Nếu bạn chỉ quan tâm đến việc trình duyệt có hỗ trợ hầu hết các tiêu chuẩn HTML 5 và CSS 3 hay không, bạn có thể giả định một cách hợp lý rằng IE 8 trở xuống vẫn là các ứng dụng vấn đề chính. Việc thử nghiệm window.getComputedStylecũng sẽ cung cấp cho bạn một kết hợp khá tốt các trình duyệt hiện đại (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 cải thiện đáng kể về hỗ trợ tiêu chuẩn, nhưng hoạt hình CSS gốc yêu cầu IE 10.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 

'Nhận phiên bản IE từ Tác nhân người dùng' hoạt động độc đáo! chỉ để chắc chắn, điều này sẽ hiển thị tất cả các phiên bản bao gồm IE11?
omer

1
@omer Có, vì nó tìm chuỗi "MSIE" hoặc "Trident"; cái sau được sử dụng bởi IE 11 trở lên. Vì vậy, nó sẽ hoạt động cho tất cả các phiên bản IE trong tương lai cho đến khi MS thay đổi tên của công cụ trình duyệt. Tôi tin rằng trình duyệt Edge mới vẫn sử dụng Trident.
Beejor

Điều này hoạt động rất tốt, cảm ơn @Beejor! Tôi đã thực hiện chuyển hướng đơn giản đến một trang khác bằng câu trả lời của bạn: var ie = 0; try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; } catch(e){} if (ie !== 0) { location.href = "../ie-redirect/redirect.html"; }
BernardV

@BernardV Có vẻ tốt! Mẹo nhanh: nếu bạn có quyền truy cập vào máy chủ, phát hiện tác nhân người dùng trong tập lệnh ở đó có thể hoạt động tốt hơn, vì người dùng sẽ không nhận thấy bất kỳ chuyển hướng / nhấp nháy nào, ít yêu cầu HTTP hơn, v.v. JS cũng hoạt động.
Beejor

9

Angular JS làm theo cách này.

msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
if (isNaN(msie)) {
  msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
}

msie sẽ là số dương nếu IE và NaN của nó cho các trình duyệt khác như chrome, firefox.

tại sao ?

Kể từ Internet Explorer 11, chuỗi tác nhân người dùng đã thay đổi đáng kể.

tham khảo điều này:

msd # 1 msd # 2


7

giải pháp :

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) || (navigator.userAgent.toLowerCase().indexOf('firefox') > -1)){
  alert("This is IE " + GetIEVersion());
}else {
  alert("This no is IE ");
}		


1
Yêu thích của tôi - tài khoản cho IE6-10 và IE11. Tôi cũng đã thêm vào một kiểm tra cho cạnh
AlbatrossCafe

Điều này phát hiện Firefox làThis is IE 0
KSPR

3

Tôi đang sử dụng một phương pháp đơn giản hơn:

Đối tượng toàn cầu điều hướng có một điểm tiếp xúc thuộc tính, trong Internet Exlorer 11 được gọi là msMaxTouchPoints tho.

Vì vậy, nếu bạn tìm kiếm:

navigator.msMaxTouchPoints !== void 0 

Bạn sẽ tìm thấy Internet Explorer 11.


1
Nó cũng trả về trun trên IE 10 (Win 7)
Lập trình viên hóa học

2
var ua = navigator.userAgent.toString().toLowerCase();
var match = /(trident)(?:.*rv:([\w.]+))?/.exec(ua) ||/(msie) ([\w.]+)/.exec(ua)||['',null,-1];
var rv = match[2];
return rv;

Nếu bạn đang sử dụng regex để chec, bạn có thể thêm cờ i để làm cho trường hợp không nhạy cảm, thay vì .toLowerCase (). Cũng không cần phương thức .toString ().
Jake Rowsell

2

Thử cái này:

var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var net = !!navigator.userAgent.match(/.NET4.0E/);
var IE11 = trident && net
var IEold = ( navigator.userAgent.match(/MSIE/i) ? true : false );
if(IE11 || IEold){
alert("IE")
}else{
alert("Other")
}

Mã sai vì trình duyệt Acoo sử dụng "MSIE" trong useragent. Hãy xem useragentopes.com/pages/Acoo%20Browser
Người dùng

TIẾNG VIỆT Tôi đã thử nghiệm trên tất cả các trình duyệt IE, thậm chí cả các thiết bị Win8.
Krunal

Bạn đã kiểm tra trình duyệt IE11 nhưng không phải trình duyệt Acoo và trình duyệt Acoo sử dụng "MSIE" trong người dùng như tôi nói, vì vậy IEold cũng phát hiện trình duyệt Acoo là IEold (Phiên bản cũ của IE) và tôi chắc chắn rằng trình duyệt Acoo sử dụng " MSIE "trong useragent vì tôi đã thực hiện navigator.userAgent trên trang web thử nghiệm javascript với trình duyệt Acoo (Trang web thử nghiệm: w3schools.com )
Người dùng

Bạn có thể vui lòng cho một giải pháp tốt hơn cho điều này?
Krunal

Bạn có thể sử dụng !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falsenhưng điều đó không phải lúc nào cũng hoạt động vì trình duyệt acoo không phải lúc nào cũng có "Trình duyệt Acoo;" trong useragent của nó nhưng thực sự bạn không cần quan tâm đến trình duyệt acoo đó có "MSIE" trong useragent của nó bởi vì trình duyệt acoo gần như là trò chơi.
Người dùng

1

Đây dường như là một phương pháp tốt hơn. "IndexOf" trả về -1 nếu không có gì khớp. Nó không ghi đè lên các lớp hiện có trên cơ thể, chỉ cần thêm chúng.

// add a class on the body ie IE 10/11
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie11';
}
if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie10';
}

0

Phát hiện hầu hết các trình duyệt với điều này:

var getBrowser = function(){
  var navigatorObj = navigator.appName,
      userAgentObj = navigator.userAgent,
      matchVersion;
  var match = userAgentObj.match(/(opera|chrome|safari|firefox|msie|trident)\/?\s*(\.?\d+(\.\d+)*)/i);
  if( match && (matchVersion = userAgentObj.match(/version\/([\.\d]+)/i)) !== null) match[2] = matchVersion[1];
  //mobile
  if (navigator.userAgent.match(/iPhone|Android|webOS|iPad/i)) {
    return match ? [match[1], match[2], mobile] : [navigatorObj, navigator.appVersion, mobile];
  }
  // web browser
  return match ? [match[1], match[2]] : [navigatorObj, navigator.appVersion, '-?'];
};

https://gist.github.com/earlonrails/5266945


0

Tôi đã sử dụng onscrollsự kiện tại phần tử với thanh cuộn. Khi được kích hoạt trong IE, tôi đã thêm xác nhận sau:

onscroll="if (document.activeElement==this) ignoreHideOptions()"

0

Chỉ dành cho Trình duyệt IE:

var ie = 'NotIE'; //IE5-11, Edge+
    if( !!document.compatMode ) {
        if( !("ActiveXObject" in window) ) ) ie = 'EDGE';
        if( !!document.uniqueID){
            if('ActiveXObject' in window && !window.createPopup ){ ie = 11; }
            else if(!!document.all){
                    if(!!window.atob){ie = 10;}
                    else if(!!document.addEventListener) {ie = 9;}
                    else if(!!document.querySelector){ie = 8;}
                    else if(!!window.XMLHttpRequest){ie = 7;}
                    else if(!!document.compatMode){ie = 6;}
                    else ie = 5;
                }
        }
    }

sử dụng cảnh báo (tức là);

Kiểm tra:

var browserVersionExplorer = (function() {
    var ie = '<s>NotIE</s>',
        me = '<s>NotIE</s>';

    if (/msie\s|trident\/|edge\//i.test(window.navigator.userAgent) && !!(document.documentMode || document.uniqueID || window.ActiveXObject || window.MSInputMethodContext)) {
            if (!!window.MSInputMethodContext) {
                ie = !("ActiveXObject" in window) ? 'EDGE' : 11;
            } else if (!!document.uniqueID) {
                if (!!(window.ActiveXObject && document.all)) {
                    if (document.compatMode == "CSS1Compat" && !!window.DOMParser ) {
                        ie = !!window.XMLHttpRequest ? 7 : 6;
                    } else {
                        ie = !!(window.createPopup && document.getElementById) ? parseFloat('5.5') : 5;
                    }
                    if (!!document.documentMode && !!document.querySelector ) {
                        ie = !!(window.atob && window.matchMedia) ? 10 : ( !!document.addEventListener ? 9 : 8);
                    }
                } else ie = !!document.all ? 4 : (!!window.navigator ? 3 : 2);
            }
        }
        
    return ie > 1 ? 'IE ' + ie : ie;
})();

 alert(browserVersionExplorer);

Cập nhật ngày 01 tháng 6 năm 2017

Bây giờ chúng ta có thể sử dụng một cái gì đó dễ dàng và đơn giản hơn:

var uA = window.navigator.userAgent,
    onlyIEorEdge = /msie\s|trident\/|edge\//i.test(uA) && !!( document.uniqueID || window.MSInputMethodContext),
    checkVersion = (onlyIEorEdge && +(/(edge\/|rv:|msie\s)([\d.]+)/i.exec(uA)[2])) || NaN;

Tôi có thể tìm các đối tượng toàn cầu tiêu chuẩn mới được thêm vào các phiên bản mới của Edge ở đâu? Tôi suy ra Math.acosh là một trong số đó.
j4v1

1
@ j4v1 Math.acosh Chỉ được hỗ trợ trong Microsoft Edge (trình duyệt Edge). Tham chiếu: msdn.microsoft.com/en-us/en-en/l Library / dn858239 (
James Peter

Phương pháp này đã ngừng làm việc cho tôi. Trước đây, nó đã phát hiện chính xác IE11 nhưng bây giờ tôi có Internet Explorer phiên bản 11.1198.14393.0 (Phiên bản cập nhật 11.0.42 (KB4018271)) chạy trên Windows 10 Enterprise (phiên bản 1607, OS Build 14393.1198) Math dường như hỗ trợ phương pháp acosh.
Thijs

@Thijs Trong Windows 10 Giáo dục với IE11 v 11.1198.14393.0 Tôi đã thử nghiệm thành công. Bạn nên thử một hàm toán học khác theo ES6.
James Peter

@JamesPeter Tôi đã hạ cánh khi kiểm tra document.documentMode. Đây có vẻ là một tài sản đáng tin cậy hơn để kiểm tra IE11 hoặc Edge. documentMode tồn tại trong IE11 nhưng không còn tồn tại trong Edge.
Thijs

0

Thành thật mà nói tôi sẽ nói sử dụng một thư viện làm những gì bạn cần (ví dụ như platform.js). Tại một số điểm, mọi thứ sẽ thay đổi và thư viện sẽ được trang bị cho những thay đổi đó và phân tích cú pháp thủ công bằng cách sử dụng các biểu thức thông thường sẽ thất bại.

Cảm ơn chúa IE đã biến mất ...

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.