ตรวจจับเวอร์ชัน IE (ก่อนหน้า v9) ใน JavaScript


246

ฉันต้องการตีกลับผู้ใช้เว็บไซต์ของเราไปยังหน้าข้อผิดพลาดหากพวกเขาใช้เวอร์ชันInternet Explorerก่อนหน้า v9 IE pre-v9มันเป็นเพียงไม่คุ้มค่าเวลาและเงินของเราที่จะสนับสนุน ผู้ใช้เบราว์เซอร์ที่ไม่ใช่ IE อื่น ๆ ทั้งหมดนั้นใช้ได้และไม่ควรถูกตีกลับ นี่คือรหัสที่เสนอ:

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

รหัสนี้จะทำเคล็ดลับหรือไม่

หากต้องการออกความคิดเห็นเล็ก ๆ น้อย ๆ ที่อาจจะมาถึงฉัน:

  1. ใช่ฉันรู้ว่าผู้ใช้สามารถปลอมแปลงuseragentสตริงของพวกเขา ฉันไม่กังวล
  2. ใช่ฉันรู้ว่าผู้เชี่ยวชาญด้านการเขียนโปรแกรมชอบที่จะดมกลิ่นสนับสนุนฟีเจอร์แทนเบราว์เซอร์ชนิด แต่ฉันไม่รู้สึกว่าวิธีการนี้เหมาะสมในกรณีนี้ ฉันรู้แล้วว่าเบราว์เซอร์ที่ไม่ใช่ IE (ที่เกี่ยวข้อง) ทั้งหมดสนับสนุนคุณสมบัติที่ฉันต้องการและpre-v9 IEเบราว์เซอร์ทั้งหมดไม่ได้ การตรวจสอบคุณสมบัติตามคุณสมบัติทั่วทั้งไซต์จะเป็นการสิ้นเปลือง
  3. ใช่ฉันรู้ว่ามีคนพยายามเข้าถึงไซต์โดยใช้IE v1(หรือ> = 20) จะไม่ได้รับการตั้งค่า 'badBrowser' เป็นจริงและหน้าคำเตือนจะไม่แสดงอย่างถูกต้อง นั่นคือความเสี่ยงที่เรายินดีรับ
  4. ใช่ฉันรู้ว่า Microsoft มี "ความคิดเห็นตามเงื่อนไข" ที่สามารถใช้สำหรับการตรวจสอบเวอร์ชันเบราว์เซอร์ที่แม่นยำ IE ไม่สนับสนุนการแสดงความคิดเห็นแบบมีเงื่อนไขอีกต่อไปแล้วIE 10ทำให้วิธีนี้ไร้ประโยชน์อย่างแน่นอน

ปัญหาอื่นใดที่ชัดเจนที่ควรระวัง?


122
"มันไม่คุ้มค่ากับเวลาและเงินของเราที่จะรองรับ IE pre-v9" ฉันหวังว่าฉันจะทำอย่างนั้นได้
Hassan

2
จากจุด [2] ฉันจะไม่แนะนำ Modernizr ( en.wikipedia.org/wiki/Modernizr ) - ทุกคนต้องวาดเส้นบนพื้นทรายที่ไหนสักแห่ง - แต่ IE9 ดูเหมือนจะเป็นเส้นสูง
amelvin

1
ความคิดเห็นตามเงื่อนไขเป็นเพียงความเห็นปกติ มีเพียง IE เท่านั้นที่ตีความว่าพวกเขาเป็นคนพิเศษ IE10 + จะไม่ทำเช่นนั้นอีก
Andreas

3
ความคิดเห็นแบบมีเงื่อนไขจะได้รับการปฏิบัติเหมือนกันโดย IE 10 เป็นเบราว์เซอร์ที่ไม่ใช่ IE พวกเขาเป็นความคิดเห็น HTML ที่ถูกต้องดังนั้นจะได้รับการปฏิบัติเช่นนี้ ฉันเห็นด้วยกับ Andreas และคิดว่าความคิดเห็นตามเงื่อนไขเป็นวิธีที่จะไป
Tim Down

1
เอกสารอย่างเป็นทางการที่ระบุว่า IE10 + จะไม่สนับสนุนความคิดเห็นแบบมีเงื่อนไข: blogs.msdn.com/b/ie/archive/2011/07/06/… - ขอบคุณ: stackoverflow.com/a/9900331/320399
blong

คำตอบ:


354

นี่เป็นวิธีที่ฉันชอบทำ มันให้การควบคุมสูงสุด (หมายเหตุ: คำสั่งแบบมีเงื่อนไขรองรับเฉพาะใน IE5 - 9. )

ก่อนอื่นให้ตั้งค่าคลาสของคุณอย่างถูกต้อง

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

จากนั้นคุณสามารถใช้ CSS เพื่อสร้างข้อยกเว้นสไตล์หรือถ้าคุณต้องการคุณสามารถเพิ่ม JavaScript ง่ายๆได้:

(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));

ขอขอบคุณที่พอลไอริช


21
เนื่องจาก OP ขอวิธีแก้ปัญหา JavaScript อย่างแท้จริงฉันเชื่อว่าคำตอบของ @Tim Down ด้านล่างนั้นดีกว่าเนื่องจากไม่เกี่ยวข้องกับการเปลี่ยน HTML ที่มีอยู่รวมทั้งไม่ได้ใช้ jQuery: stackoverflow.com/a/10965203/134120
AsGoodAsItGets

ฉันได้รับข้อผิดพลาดกับสิ่งนี้ในเครื่องมือตรวจสอบ 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

ส่งคืนเวอร์ชัน IE หรือหากไม่ใช่ IE คืนค่า false

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

ตัวอย่าง:

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

หรือ

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

หรือ

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

36
ใช้งานไม่ได้กับ IE11 จาก IE 11 พวกเขาได้เปลี่ยนสตริง UA เป็น"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
โปรดทราบว่าใน FF "false <9" คือ "true" ดังนั้นเงื่อนไขควรเป็นif (isIE () && isIE () < 9) {
nZeus

3
@DeadlyChambers บางทีมันกำลังทำงานในโหมดมาตรฐาน IE7? msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
mason81

4
คำตอบที่ได้รับการอนุมัติคือวิธีตรวจหาเวอร์ชัน IE ใน HTML คำถามนี้ตอบคำถามเดิม
Matt Wagner

2
@PrasadGayan - Microsoft Edge ไม่ใช่ Internet Explorer ดังนั้นการคืนเท็จจึงน่าจะเป็นสิ่งที่ถูกต้อง
BryanGrezeszak

120

หากไม่มีใครเพิ่มวิธีการaddEventListerและคุณใช้โหมดเบราว์เซอร์ที่ถูกต้องคุณสามารถตรวจสอบ IE 8 หรือต่ำกว่าได้

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

Legacy Internet Explorer และ attachEvent (MDN)


7
ดูเหมือนว่าวิธีที่มีประสิทธิภาพที่สุดในการตรวจหา IE <= 8 ทั้งหมดใน JavaScript - และเหมาะสำหรับคนอย่างฉันที่กำลังมองหาวิธีที่จะทำ
Gregory Magarshak

ที่ดี! นอกจากนี้ยังตรวจจับ IE9 ในโหมด Quirks ซึ่งเป็นสิ่งที่ฉันกำลังมองหา
sstur

7
แม้ว่านี่จะเป็นโซลูชัน "ใช้งานง่าย" แต่ก็มีความเสี่ยง ทุกคนใน บริษัท ของคุณ (ที่ไม่ทราบวิธีแก้ปัญหาของคุณ) สามารถใช้ "addEventListener" หรือ "attachEvent" เพื่อจัดการกับการขาดใน IE 8 จากนั้นรหัสของคุณจะหยุดทำงาน
Zé Carlos

@RoyiNamir การทดสอบนี้สำหรับ IE8 ทำไมบนโลกนี้จึงควรกลับมาเป็นจริงใน IE11
Andreas

@ Andreas Oops ไม่เห็นว่า OP ต้องการมาก่อน ie9 ลบ
Royi Namir

114

ใช้ความคิดเห็นตามเงื่อนไข คุณกำลังพยายามค้นหาผู้ใช้ IE <9 และความคิดเห็นตามเงื่อนไขจะทำงานในเบราว์เซอร์เหล่านั้น ในเบราว์เซอร์อื่น ๆ (IE> = 10 และไม่ใช่ IE) ความคิดเห็นนั้นจะถือว่าเป็นความคิดเห็น HTML ปกติซึ่งเป็นสิ่งที่พวกเขาเป็น

ตัวอย่าง HTML:

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

คุณสามารถทำสิ่งนี้ได้อย่างหมดจดด้วยสคริปต์ถ้าคุณต้องการ:

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
คำตอบของ @Tim Down เวอร์ชัน JavaScript นั้นยอดเยี่ยมสำหรับฉัน ฉันใช้ BrowserStack เพื่อทดสอบกับ Windows 7 และ IE 8, 9, 10 และ 11; Mac OS X Snow Leopard พร้อม Safari 5.1, Firefox 28.0, Chrome 33.0 และ Opera 20.0; iPhone 5 Safari มือถือ; และ Android Samsung Galaxy Tab 2 10.1 4.0 ตามที่คาดไว้มีเพียง IE8 ที่รายงานว่าเป็น IeLessThan9 ดี!
Steve Saporta

58

วิธีตรวจจับ MSIE (v6 - v7 - v8 - v9 - v10 - v11) ได้อย่างง่ายดาย:

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

มีประโยชน์สำหรับการตรวจหา IE10 เนื่องจากไม่รองรับความคิดเห็นตามเงื่อนไข ไม่สามารถใช้งานได้ใน IE11 แต่โดยทั่วไปแล้ว IE11 จะมีพฤติกรรมที่ใช้ได้
personne3000

11
ในที่สุดคำตอบที่ไม่บรรยายเกี่ยวกับการใช้การตรวจจับคุณสมบัติและตอบคำถามได้จริง
cdmckay

32

นี่คือวิธีที่ AngularJS ตรวจสอบ 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
}

ว้าวนี่ง่ายกว่าการคอมเม้นท์ตามเงื่อนไข! ไม่มีข้อ จำกัด ในเรื่องนี้?
andrewb

ตามเอกสาร, IE8 + รองรับคุณสมบัตินี้ดังนั้นฉันคิดว่าควรจะเพียงพอสำหรับกรณีส่วนใหญ่
iurii

ตามการอ้างอิง MSDN "เมื่อยังไม่ได้กำหนดเอกสารปัจจุบัน documentMode จะส่งกลับค่าศูนย์ (0) ซึ่งมักจะเกิดขึ้นเมื่อเอกสารกำลังโหลด" หมายความว่าคุณอาจไม่ได้รับการตอบสนองที่ถูกต้องภายในสคริปต์ที่โหลดใน <head> ใช่หรือไม่
Erik Knowles

ฉันคิดว่าคุณสามารถแก้ไขได้โดยการตรวจสอบค่าบน window.onload เมื่อเอกสารถูกโหลดแล้ว
iurii

28

หากต้องการกรอง IE8 และรุ่นเก่ากว่าอย่างน่าเชื่อถือคุณสามารถใช้การตรวจสอบวัตถุรวม :

if (document.all && !document.addEventListener) {
    alert('IE8 or lower');
}

2
document.all - ไม่รองรับใน IE 11 - msdn.microsoft.com/en-us/library/ie/ms537434%28v=vs.85%29.aspx
ราชา Khoury

2
@RajaKhoury - ซึ่งใช้ได้ถ้าพยายามทดสอบ IE <9 - ถ้าเงื่อนไขจะเป็นเท็จ
nnnnnn

19

การตรวจจับเวอร์ชัน IE โดยใช้การตรวจจับคุณสมบัติ (IE6 +, เบราว์เซอร์ก่อนหน้า IE6 ถูกตรวจพบเป็น 6, คืนค่า null สำหรับเบราว์เซอร์ที่ไม่ใช่ 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;
})();

แก้ไข: ฉันได้สร้าง repo bower / npm เพื่อความสะดวกของคุณ: ie-version

ปรับปรุง:

รุ่นที่กะทัดรัดสามารถเขียนได้ในหนึ่งบรรทัดดังนี้:

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

16

ฟังก์ชันนี้จะคืนค่าหมายเลขเวอร์ชันหลักของ IE เป็นจำนวนเต็มหรือundefinedหากเบราว์เซอร์ไม่ใช่ Internet Explorer สิ่งนี้เช่นเดียวกับโซลูชันตัวแทนผู้ใช้ทั้งหมดนั้นมีความเสี่ยงต่อการปลอมแปลงตัวแทนผู้ใช้ (ซึ่งเป็นคุณลักษณะอย่างเป็นทางการของ IE ตั้งแต่รุ่น 8)

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

โอเวนคนเราใช้สิ่งนั้นในทางปฏิบัติอย่างไร? วิธีการหนึ่งเรียกคืนค่ากลับมา? ฉันพยายามconsole.log(!!match && parseInt(match[1])), console.log(parseInt(match[1]))และconsole.log(match)แต่ไม่มีผลใด ๆ ของพวกเขา
Frank Conijn

getIEVersion()ได้รับค่าตอบแทนโดยการเรียกฟังก์ชั่นของตัวเอง ตัวอย่างเช่น:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
Owen

15

ตรวจจับ IE ใน JS โดยใช้ความเห็นแบบมีเงื่อนไข

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

}());

นั่นก็เหมือนกับคำตอบของฉัน
Tim Down

@TimDown: บางที แต่คำตอบนี้เป็นคุณสมบัติที่สมบูรณ์มากขึ้นเล็กน้อย (มันจะบอกคุณหมายเลขรุ่น) และมีความเห็นดี นอกจากนี้ลิงค์ที่จุดเริ่มต้นของคำตอบนี้จะนำไปสู่การสรุปสาระสำคัญที่มีความคิดเห็นที่ให้ข้อมูลมากมายและรูปแบบที่น่าสนใจเกี่ยวกับเทคนิคนี้
Alan

@Alan: คะแนนยุติธรรม ฉันปรับให้เหมาะกับคำถาม แต่ไม่ได้อ้างอิงแหล่งที่มา
ทิมลง

12

มันใช้งานได้สำหรับฉัน ฉันใช้มันเป็นหน้าเปลี่ยนเส้นทางที่อธิบายว่าทำไมเราถึงไม่ชอบ <IE9 และให้ลิงค์ไปยังเบราว์เซอร์ที่เราต้องการ

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

1
โอ้นั่นเป็นสิ่งที่น่ารังเกียจ ผมใช้วิธีการที่เป็นมิตรมากขึ้นแสดง div ที่มีลักษณะของการเตือน IE และเมื่อผู้เข้าชมคลิกที่มันใช้ไปbrowsehappy.com
Codebeat

10

รหัสของคุณสามารถทำการตรวจสอบได้ แต่อย่างที่คุณคิดถ้ามีคนพยายามเข้าถึงหน้าเว็บของคุณโดยใช้ IE v1 หรือ> v19 จะไม่ได้รับข้อผิดพลาดดังนั้นการตรวจสอบด้วยนิพจน์ Regex อย่างปลอดภัยมากขึ้นเช่นนี้

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
}

นี่ไม่ใช่คำตอบที่ดี UA-sniffing นั้นไม่น่าเชื่อถือ เพิ่มเติมเกี่ยวกับที่นี่: modernizr.com/docs
Jezen Thomas

3
@Jezen บางครั้ง UA-sniffing เป็นวิธีที่จะไป: github.com/Modernizr/Modernizr/issues/538
István Ujj-Mészáros

8

ความคิดเห็นเงื่อนไขได้รับการสนับสนุนไม่ได้อยู่ใน IE เป็นรุ่นที่ 10 ตามที่ระบุไว้ในหน้าอ้างอิงไมโครซอฟท์

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

จากนั้นใช้:

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

}

1
นี่เป็นสิ่งเดียวที่ทำงานในเครือข่ายทั้งหมดอย่างน้อยที่สุดก็เป็น humongus ของสิ่งที่ฉันได้ลอง ... ขอบคุณ
Henrique C.

รหัสนี้เป็นสิ่งที่ดี แต่ไม่สามารถตรวจพบโหมดมุมมองที่รองรับ ฉันใช้ IE 11 โดยใช้ความสามารถในการรับชมใน IE 8 และรหัสนี้ยังคงให้การversion 11แก้ไข: รหัสนี้น่าอัศจรรย์! ฮ่าฮ่ามันให้สิ่งของกับทุกอย่างภายใน เวอร์ชันคือ 11 แต่ docModeIR เท่ากับ 9 ขอบคุณ!
MarceloBarbosa

5

เช่น 10 และ 11:

คุณสามารถใช้ js และเพิ่มคลาสใน html เพื่อรักษามาตรฐานของความคิดเห็นตามเงื่อนไข :

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

หรือใช้ lib เช่น bowser:

https://github.com/ded/bowser

หรือ modernizr สำหรับการตรวจจับคุณสมบัติ:

http://modernizr.com/


2
ฉันลองใช้สคริปต์และโซลูชันบางอย่าง แต่ไม่มีอะไรทำงาน จากนั้นฉันรวมคันธนูลงในโครงการและใช้งานได้ ดังนั้นหนึ่งสำหรับการแนะนำ bowser
Moulde

3

ในการตรวจสอบ Internet Explorer 10 | 11 คุณสามารถใช้สคริปต์เล็ก ๆ นี้ได้ทันทีหลังจากแท็กเนื้อหา:

ในกรณีของฉันฉันใช้ห้องสมุด jQuery โหลดไว้ในหัว

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

ฉันชอบสิ่งนี้ขอบคุณฉันต้องตรวจจับ 10 หรือ 11 เท่านั้นเพราะฉันไม่รองรับรุ่นก่อนหน้านี้
Nearpoint

IE9 ก็เป็นสามง่าม แต่ก็ไม่เหมือนกันกับการสนับสนุน CSS การตรวจจับของคุณคิดว่าอย่างน้อย 10 แต่ไม่ถูกต้อง
Codebeat

3

นี่เป็นคำตอบถึงความตาย แต่นี่คือทั้งหมดที่คุณต้องการ

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

นอกจากนี้ที่นี่เป็น sandbox ที่แสดงรูปแบบ regex กับสตริงตัวแทนผู้ใช้ IE ที่พบมากที่สุด: regex101.com/r/lC6oP3/1
Timothy Perez

@alessadro - แต่มันควรจะใช่มั้ย OP ต้องการทดสอบ <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

ตามที่Microsoftต่อไปนี้เป็นทางออกที่ดีที่สุดมันง่ายมาก:

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

แน่นอนและในกรณีที่มีคนพยายามเข้าใช้ที่ด้านบนรหัสในคำตอบภายหลังจะใช้งานได้กับ IE11 ( stackoverflow.com/a/26375930/1129926 ) แต่ระวังจะใช้กับ IE12 ได้หรือไม่ Bottom line เป็นวิธีที่ดีที่สุดในการพิจารณาว่าสิ่งเหล่านี้เป็นแฮ็กชั่วคราวและพวกเขามีแนวโน้มที่จะล้มเหลวในภายหลังเนื่องจากเบราว์เซอร์เวอร์ชันใหม่ออกวางจำหน่าย (ฉันจะไม่พูดถึง Edge)
Jeff Mergler

1

ฉันจะแนะนำไม่ให้เขียนรหัสนี้ใหม่ในเวลาที่เท่าไรไม่ทราบ ฉันอยากจะแนะนำให้คุณใช้ห้องสมุด Conditionizr ( http://conditionizr.com/ ) ซึ่งสามารถทดสอบรุ่น IE ที่เฉพาะเจาะจงรวมถึงเบราว์เซอร์อื่น ๆ ระบบปฏิบัติการและแม้แต่การแสดงหรือไม่แสดง Retina

รวมรหัสสำหรับการทดสอบเฉพาะที่คุณต้องการและคุณยังได้รับประโยชน์จากห้องสมุดทดสอบที่ผ่านการทำซ้ำหลาย ๆ ครั้ง (ซึ่งจะง่ายต่อการอัพเกรดโดยไม่ทำลายรหัสของคุณ)

นอกจากนี้ยังมีการเชื่อมต่อกับ Modernizr ซึ่งสามารถรองรับทุกกรณีที่คุณทดสอบการใช้งานได้ดีกว่าเบราว์เซอร์ที่เฉพาะเจาะจง


1

ฉันชอบที่:

<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

วิธีการตรวจสอบ IE นี้รวมจุดแข็งและหลีกเลี่ยงจุดอ่อนของคำตอบของ jKey โดยใช้ความคิดเห็นตามเงื่อนไขและคำตอบของ Owen โดยใช้ตัวแทนผู้ใช้

  • วิธีการของ jKey ทำงานได้ถึงเวอร์ชัน 9 และป้องกันการปลอมแปลงตัวแทนของผู้ใช้ใน IE 8 และ 9
  • วิธีการของโอเว่นสามารถล้มเหลวใน IE 5 & 6 (การรายงาน 7) และเป็นที่ยอมรับต่อการปลอมแปลง UA แต่สามารถตรวจจับเวอร์ชัน IE> = 10 (ตอนนี้รวมถึง 12 ซึ่งรวมถึง 12 ซึ่งโพสต์คำตอบของโอเว่น)

    // ----------------------------------------------------------
    // 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;
    }());

สิ่งนี้สามารถใช้เพื่อตั้งค่าคลาสที่มีประโยชน์ให้กับเอกสารของคุณที่มีเวอร์ชัน IE:

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

โปรดทราบว่าตรวจพบโหมดความเข้ากันได้ที่ใช้ถ้า IE อยู่ในโหมดความเข้ากันได้ นอกจากนี้โปรดทราบว่าเวอร์ชัน IE ส่วนใหญ่มีประโยชน์สำหรับเวอร์ชันเก่ากว่า (<10) เวอร์ชันที่สูงกว่านั้นเป็นไปตามมาตรฐานมากกว่าและน่าจะดีกว่าที่จะตรวจสอบคุณสมบัติโดยใช้สิ่งที่ต้องการ modernizr.js


1

ฉันทำ mixin ขีดความสะดวกสำหรับเรื่องนี้

_.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

หรือเพียงแค่

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

ที่ครอบคลุมมากที่สุด JS สคริปต์ผมพบว่าการตรวจสอบรุ่นของ IE เป็นhttp://www.pinlady.net/PluginDetect/IE/ ห้องสมุดทั้งหมดอยู่ที่http://www.pinlady.net/PluginDetect/Browsers/ http://www.pinlady.net/PluginDetect/Browsers/

ด้วย IE10 คำสั่งเงื่อนไขจะไม่ได้รับการสนับสนุนอีกต่อไป

ด้วย IE11 ตัวแทนผู้ใช้จะไม่มี MSIE อีกต่อไป นอกจากนี้การใช้ตัวแทนผู้ใช้ไม่น่าเชื่อถือเพราะสามารถแก้ไขได้

การใช้สคริปต์ PluginDetect JS คุณสามารถตรวจหา IE และตรวจสอบเวอร์ชันที่แน่นอนโดยใช้รหัสที่เฉพาะเจาะจงมาก สิ่งนี้มีประโยชน์มากเมื่อคุณสนใจว่าคุณใช้เบราว์เซอร์เวอร์ชันใดอยู่


0

ฉันรู้ว่าฉันมาช้าไปงานปาร์ตี้ที่นี่ แต่ฉันได้ตรวจสอบวิธีหนึ่งบรรทัดง่าย ๆ เพื่อให้ข้อเสนอแนะเกี่ยวกับว่าเบราว์เซอร์เป็น IE และรุ่นใดจาก 10 ลงมา ฉันไม่ได้เขียนรหัสนี้สำหรับเวอร์ชั่น 11 ดังนั้นอาจจำเป็นต้องแก้ไขเล็กน้อย

อย่างไรก็ตามนี่คือรหัสมันทำงานเป็นวัตถุที่มีคุณสมบัติและวิธีการและอาศัยการตรวจจับวัตถุมากกว่าที่จะคัดลอกวัตถุเนวิเกเตอร์ (ซึ่งมีข้อบกพร่องอย่างมากมายเนื่องจากสามารถปลอมแปลงได้)

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

การใช้งานเป็นisIE.browserคุณสมบัติที่ส่งคืนบูลีนและอาศัยวิธีการแสดงความคิดเห็นตามเงื่อนไขisIE.detectedVersion()ที่ส่งกลับตัวเลขระหว่าง 5 ถึง 10 ฉันกำลังตั้งสมมติฐานว่าทุกอย่างที่ต่ำกว่า 6 และคุณอยู่ในอาณาเขตของโรงเรียนเก่าและคุณจะอ้วนมากกว่า สายการบินหนึ่งและสิ่งที่สูงกว่า 10 และคุณอยู่ในดินแดนที่ใหม่กว่า ฉันได้อ่านบางอย่างเกี่ยวกับ IE11 ที่ไม่สนับสนุนความคิดเห็นตามเงื่อนไข แต่ฉันไม่ได้ตรวจสอบอย่างเต็มที่นั่นอาจจะเป็นในภายหลัง

อย่างไรก็ตามมันเป็นและสำหรับหนึ่งซับมันจะครอบคลุมพื้นฐานของเบราว์เซอร์ IE และการตรวจสอบรุ่น มันไกลจากที่สมบูรณ์แบบ แต่มันเล็กและแก้ไขได้ง่าย

เพียงเพื่อการอ้างอิงและหากใครมีข้อสงสัยเกี่ยวกับวิธีการใช้งานจริงแล้วเงื่อนไขต่อไปนี้ควรช่วย

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

การตรวจจับ IE และรุ่นของมันนั้นไม่ใช่เรื่องง่ายและสิ่งที่คุณต้องการก็คือจาวาสคริปต์พื้นฐาน / วานิลลา:

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

และนี่คือวิธีใช้งาน:

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

.

ทำงานได้ใน IE ทุกเวอร์ชันรวมถึงเวอร์ชันที่สูงกว่าในมุมมอง / โหมดที่เข้ากันได้ที่ต่ำกว่าและdocumentModeเป็นกรรมสิทธิ์ของ IE


0

หากคุณต้องการเลือกรุ่นเบราว์เซอร์ IE คุณสามารถทำตามรหัสด้านล่าง รหัสนี้ทำงานได้ดีสำหรับรุ่น IE6 ถึง 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

หน้าต่างที่รัน IE10 จะอัปเดตอัตโนมัติเป็น IE11 + และจะเป็น W3C ที่เป็นมาตรฐาน

วันนี้เราไม่จำเป็นต้องสนับสนุน 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>


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.