Mendeteksi versi IE (sebelum v9) dalam JavaScript

246

Saya ingin memantulkan pengguna situs web kami ke halaman kesalahan jika mereka menggunakan versi Internet Explorersebelum v9. Hanya tidak sepadan dengan waktu dan uang kita untuk mendukung IE pre-v9. Pengguna semua browser non-IE lainnya baik-baik saja dan tidak boleh terpental. Berikut kode yang diusulkan:

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

Akankah kode ini berhasil?

Untuk menghadang beberapa komentar yang mungkin akan menghampiri saya:

  1. Ya, saya tahu bahwa pengguna dapat memalsukan useragentstring mereka . Saya tidak khawatir.
  2. Ya, saya tahu bahwa pro pemrograman lebih suka mengendus fitur-dukungan daripada jenis browser tetapi saya merasa pendekatan ini tidak masuk akal dalam kasus ini. Saya sudah tahu bahwa semua browser (yang relevan) non-IE mendukung fitur yang saya butuhkan dan bahwa semua pre-v9 IEbrowser tidak. Memeriksa fitur demi fitur di seluruh situs akan sia-sia.
  3. Ya, saya tahu bahwa seseorang yang mencoba mengakses situs menggunakan IE v1(atau> = 20) tidak akan mendapatkan 'badBrowser' disetel ke true dan halaman peringatan tidak akan ditampilkan dengan benar. Itu risiko yang bersedia kami ambil.
  4. Ya, saya tahu Microsoft memiliki "komentar kondisional" yang dapat digunakan untuk deteksi versi browser yang tepat. IE tidak lagi mendukung komentar bersyarat IE 10, membuat pendekatan ini sama sekali tidak berguna.

Adakah masalah nyata lainnya yang harus diperhatikan?

Chad Decker
sumber
122
"Hanya saja tidak sepadan dengan waktu dan uang kita untuk mendukung IE pre-v9". Saya berharap bisa melakukan itu.
Hassan
2
Berdasarkan poin [2] Saya tidak akan menyarankan Modernizr ( en.wikipedia.org/wiki/Modernizr ) - setiap orang harus menggambar garis di pasir di suatu tempat - tetapi IE9 tampaknya seperti garis yang tinggi
amelvin
1
Komentar bersyarat hanyalah komentar normal. Hanya IE yang menafsirkannya sebagai yang spesial. IE10 + tidak akan melakukan itu lagi.
Andreas
3
Komentar bersyarat akan diperlakukan sama persis dengan IE 10 sebagai browser non-IE. Itu komentar HTML yang valid sehingga akan diperlakukan seperti itu. Saya setuju dengan Andreas dan berpikir komentar bersyarat adalah cara untuk pergi.
Tim Down
1
Dokumentasi resmi yang mengatakan IE10 + tidak akan mendukung komentar bersyarat: blogs.msdn.com/b/ie/archive/2011/07/06/… - Terima kasih kepada: stackoverflow.com/a/9900331/320399
blong

Jawaban:

354

Ini adalah cara yang saya sukai untuk melakukannya. Ini memberikan kontrol maksimal. (Catatan: Pernyataan bersyarat hanya didukung di IE5 - 9.)

Pertama, atur kelas Anda dengan benar

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

Kemudian Anda bisa menggunakan CSS untuk membuat pengecualian gaya, atau, jika perlu, Anda bisa menambahkan beberapa JavaScript sederhana:

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

Terima kasih kepada Paul Irish .

Jezen Thomas
sumber
21
Mengingat bahwa OP meminta solusi murni JavaScript, saya percaya bahwa jawaban oleh @Tim Bawah di bawah ini lebih baik, karena tidak melibatkan mengubah HTML yang ada, ditambah itu tidak menggunakan jQuery: stackoverflow.com/a/10965203/134120
AsGoodAsItGets
Saya mendapatkan kesalahan dengan ini di validator html w3:Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
abumalick
161

Kembalikan versi IE atau jika tidak, IE mengembalikan false

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

Contoh:

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

atau

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

atau

if (isIE()) {
 // is IE
} else {
 // Other browser
}
weroro
sumber
36
Tidak berfungsi untuk IE11. Dari IE 11, mereka telah mengubah string UA ke"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
Harap dicatat bahwa dalam FF "false <9" adalah "true". Jadi, kondisinya harusif (isIE () && isIE () < 9) {
nZeus
3
@ HeadlyChambers mungkin itu berjalan dalam mode standar IE7? msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
mason81
4
Jawaban yang disetujui adalah bagaimana mendeteksi versi IE dalam HTML. Ini menjawab pertanyaan awal.
Matt Wagner
2
@PrasadGayan - Microsoft Edge bukan Internet Explorer. Jadi mengembalikan kesalahan tampaknya menjadi hal yang benar untuk dilakukan.
BryanGrezeszak
120

Jika tidak ada orang lain yang menambahkan addEventLister-metode dan Anda menggunakan mode browser yang benar maka Anda dapat memeriksa IE 8 atau kurang dengan

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

Explorer Internet lama dan attachEvent (MDN)

Andreas
sumber
7
Ini sepertinya cara paling efisien untuk mendeteksi IE <= 8 seluruhnya dalam JavaScript - dan sangat bagus untuk orang-orang seperti saya yang mencari cara untuk melakukannya.
Gregory Magarshak
Bagus! Ini juga mendeteksi IE9 dalam Mode Quirks yang saya cari.
sstur
7
Meskipun ini merupakan solusi "mudah digunakan", ia memiliki beberapa risiko. Siapa pun di perusahaan Anda (yang tidak mengetahui solusi Anda) dapat menerapkan "addEventListener" atau "attachEvent" untuk menangani kekurangannya di IE 8. Dan kemudian, kode Anda akan berhenti berfungsi.
Zé Carlos
@RoyiNamir Ini menguji IE8. Mengapa bumi harus mengembalikan true di IE11?
Andreas
@Andreas oops. tidak melihat bahwa OP ingin sebelum ie9. menghapus.
Royi Namir
114

Gunakan komentar bersyarat. Anda mencoba mendeteksi pengguna IE <9 dan komentar bersyarat akan berfungsi di browser tersebut; di peramban lain (IE> = 10 dan non-IE), komentar akan diperlakukan sebagai komentar HTML normal, seperti itu.

Contoh HTML:

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

Anda juga dapat melakukan ini sepenuhnya dengan skrip, jika Anda perlu:

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");
}
Tim Down
sumber
5
Versi JavaScript jawaban @Tim Down bekerja dengan baik untuk saya. Saya menggunakan BrowserStack untuk mengujinya dengan Windows 7 dan IE 8, 9, 10 dan 11; Mac OS X Snow Leopard dengan Safari 5.1, Firefox 28.0, Chrome 33.0 dan Opera 20.0; Safari Ponsel iPhone 5; dan Android Samsung Galaxy Tab 2 10.1 4.0. Seperti yang diharapkan, hanya IE8 yang melaporkan bahwa itu adalah IeLessThan9. Bagus!
Steve Saporta
58

Untuk mendeteksi MSIE (v6 - v7 - v8 - v9 - v10 - v11) dengan mudah:

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}
EpokK
sumber
Berguna untuk mendeteksi IE10, karena tidak mendukung komentar bersyarat. Tidak bekerja di IE11, tetapi IE11 umumnya memiliki perilaku yang baik
personne3000
11
Akhirnya jawaban yang tidak memberi kuliah tentang penggunaan deteksi fitur dan benar-benar menjawab pertanyaan.
cdmckay
32

Inilah cara AngularJS memeriksa 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
}
iurii
sumber
Wow ini jauh lebih sederhana daripada semua komentar bersyarat! Tidak ada batasan untuk ini?
andrewb
menurut dokumen, IE8 + mendukung properti ini jadi saya pikir harus cukup untuk kebanyakan kasus.
iurii
Per referensi MSDN, "Ketika dokumen saat ini belum ditentukan, documentMode mengembalikan nilai nol (0). Ini biasanya terjadi ketika dokumen memuat." Apakah ini berarti Anda mungkin tidak mendapatkan respons yang valid di dalam skrip yang dimuat di <head>?
Erik Knowles
Saya pikir Anda dapat memperbaikinya dengan memeriksa nilai pada window.onload ketika dokumen sudah dimuat.
iurii
19

Mendeteksi versi IE menggunakan deteksi fitur (IE6 +, browser sebelum IE6 terdeteksi sebagai 6, mengembalikan null untuk browser non-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;
})();

Sunting: Saya telah membuat repo bower / npm untuk kenyamanan Anda: yaitu-versi

Memperbarui:

versi yang lebih ringkas dapat ditulis dalam satu baris sebagai:

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

Fungsi ini akan mengembalikan nomor versi utama IE sebagai integer, atau undefinedjika browser bukan Internet Explorer. Ini, seperti semua solusi agen pengguna, mudah untuk spoofing agen pengguna (yang telah menjadi fitur resmi IE sejak versi 8).

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}
Owen
sumber
Owen, bagaimana seseorang menggunakannya dalam praktik? Bagaimana cara seseorang mengambil nilai kembali? Saya mencoba console.log(!!match && parseInt(match[1])), console.log(parseInt(match[1]))dan console.log(match), tetapi tidak ada hasil dengan mereka.
Frank Conijn
Dapatkan nilai pengembalian dengan memanggil fungsi itu sendiri getIEVersion(). Misalnya:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
Owen
15

Mendeteksi IE di JS menggunakan komentar bersyarat

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

}());
Ya
sumber
Itu hampir sama dengan jawaban saya.
Tim Down
@TimDown: Mungkin, tetapi jawaban ini sedikit lebih lengkap dengan fitur (ini memberitahu Anda nomor versi), dan dikomentari dengan baik. Selain itu, tautan di awal jawaban ini mengarah ke inti dengan beberapa komentar informatif dan variasi menarik pada teknik ini.
Alan
@Lan: poin yang adil. Saya menyesuaikan pertanyaan saya dengan pertanyaan tetapi tidak menyebutkan sumbernya.
Tim Down
12

Ini bekerja untuk saya. Saya menggunakannya sebagai pengalihan ke halaman yang menjelaskan mengapa kami tidak suka <IE9 dan menyediakan tautan ke browser yang kami sukai.

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->
iconMatrix
sumber
1
Ohw, itu jahat. Saya menggunakan metode yang lebih ramah, menampilkan div dengan tampilan peringatan IE dan ketika pengunjung mengkliknya, pengguna pergi ke browsehappy.com
Codebeat
10

Kode Anda dapat melakukan pemeriksaan, tetapi seperti yang Anda duga, jika seseorang mencoba mengakses halaman Anda menggunakan IE v1 atau> v19 tidak akan mendapatkan kesalahan, jadi mungkin lebih aman melakukan pemeriksaan dengan ekspresi Regex seperti kode di bawah ini:

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
}
Fong-Wan Chau
sumber
Ini bukan jawaban yang bagus. Mengendus-UA tidak bisa diandalkan. Lebih lanjut tentang itu di sini: modernizr.com/docs
Jezen Thomas
3
@Jezen Terkadang UA-sniffing adalah jalan yang harus diambil
István Ujj-Mészáros
8

Komentar bersyarat tidak lagi didukung di IE pada Versi 10 sebagaimana dicatat pada halaman referensi 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);

lalu gunakan:

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

}
Arnold.Krumins
sumber
1
Ini adalah satu-satunya hal yang bekerja di seluruh internet, setidaknya humongus dari hal-hal yang saya coba ... thx;)
Henrique C.
Kode ini baik, tetapi tidak dapat mendeteksi mode tampilan kompabilitas. Saya menggunakan IE 11 menggunakan tampilan kompabilitas di IE 8 dan kode ini masih memberikan version 11EDIT: Kode ini LUAR BIASA! haha, itu memberi objek dengan semua yang ada di dalamnya. Versi 11 tetapi docModeIR sama dengan 9. Terima kasih!
MarceloBarbosa
5

Untuk 10 dan 11 yaitu:

Anda dapat menggunakan js dan menambahkan kelas dalam html untuk mempertahankan standar komentar bersyarat :

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

Atau gunakan lib seperti bowser:

https://github.com/ded/bowser

Atau modernizr untuk deteksi fitur:

http://modernizr.com/

Liko
sumber
2
Saya mencoba beberapa skrip dan solusi tetapi tidak ada yang berhasil. Lalu saya memasukkan bowser dalam proyek dan itu hanya berhasil. Jadi satu untuk menyarankan bowser.
Moulde
3

Untuk mendeteksi Internet Explorer 10 | 11 Anda dapat menggunakan skrip kecil ini segera setelah tag tubuh:

Dalam kasus saya, saya menggunakan perpustakaan jQuery dimuat di kepala.

<!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>
Brian
sumber
Saya suka ini, terima kasih, saya hanya perlu mendeteksi 10 atau 11 karena saya tidak mendukung versi sebelumnya
Nearpoint
IE9 juga trisula tetapi tidak sama dengan dukungan CSS. Deteksi Anda berpikir setidaknya 10 tetapi itu tidak benar.
Codebeat
3

Ini sudah dijawab sampai mati, tetapi ini yang Anda butuhkan.

!!navigator.userAgent.match(/msie\s[5-8]/i)
Timothy Perez
sumber
Juga, ini adalah kotak pasir yang menunjukkan pola regex terhadap string agen pengguna IE yang paling umum: regex101.com/r/lC6oP3/1
Timothy Perez
@alessadro - Tapi seharusnya begitu, bukan? OP ingin menguji <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
}
Berezh
sumber
2

Menurut Microsoft , berikut ini adalah solusi terbaik, juga sangat sederhana:

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 );
}
AHH
sumber
Memang, dan kalau-kalau ada orang lain mendarat di sini mencoba menggunakan di atas, kode dalam jawaban nanti tidak bekerja untuk IE11 ( stackoverflow.com/a/26375930/1129926 ). Tetapi waspadalah, apakah ini akan bekerja untuk IE12, dll? Intinya adalah yang terbaik untuk mempertimbangkan ini sebagai peretasan sementara dan mereka kemungkinan gagal kemudian karena versi peramban baru dirilis (saya bahkan tidak akan menyebutkan Edge).
Jeff Mergler
1

Saya akan merekomendasikan untuk tidak menulis ulang kode ini untuk yang kesekian kalinya. Saya akan merekomendasikan Anda menggunakan perpustakaan Conditionizr ( http://conditionizr.com/ ) yang mampu menguji untuk versi IE tertentu serta browser lainnya, sistem operasi, dan bahkan ada atau tidak adanya tampilan Retina.

Sertakan kode hanya untuk tes khusus yang Anda butuhkan dan Anda juga mendapatkan manfaat dari perpustakaan teruji yang telah melalui banyak iterasi (dan yang akan mudah untuk ditingkatkan tanpa melanggar kode Anda).

Ini juga cocok dengan Modernizr yang dapat menangani semua kasus di mana Anda lebih baik menguji kemampuan khusus daripada browser tertentu.

John Munsch
sumber
1

Saya suka itu:

<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>
Julio Cesar Boaroli
sumber
1

Pendekatan untuk mendeteksi IE ini menggabungkan kekuatan dan menghindari kelemahan jawaban jKey menggunakan komentar bersyarat dan jawaban Owen menggunakan agen pengguna.

  • Pendekatan jKey bekerja hingga versi 9 dan kebal terhadap spoofing agen pengguna di IE 8 & 9.
  • Pendekatan Owen dapat gagal pada IE 5 & 6 (pelaporan 7) dan rentan terhadap spoofing UA, tetapi dapat mendeteksi versi IE> = 10 (sekarang juga termasuk 12, yang mengunggah jawaban 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;
    }());

Ini dapat digunakan untuk mengatur kelas berguna untuk dokumen Anda yang berisi versi IE:

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

Perhatikan bahwa ia mendeteksi mode kompatibilitas yang digunakan, jika IE dalam mode kompatibilitas. Perhatikan juga bahwa versi IE sebagian besar berguna untuk versi yang lebih lama (<10); versi yang lebih tinggi lebih sesuai standar dan mungkin lebih baik memeriksa fitur menggunakan sesuatu seperti modernizr.js.

jtbr
sumber
1

Saya membuat mixin garis bawah yang nyaman untuk ini.

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

danrichards
sumber
1

atau sederhana

//   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]
Giacomo
sumber
0

Skrip JS terlengkap yang saya temukan untuk memeriksa versi IE adalah http://www.pinlady.net/PluginDetect/IE/ . Seluruh perpustakaan ada di http://www.pinlady.net/PluginDetect/Browsers/ .

Dengan IE10, pernyataan bersyarat tidak lagi didukung.

Dengan IE11, agen pengguna tidak lagi berisi MSIE. Juga, menggunakan agen pengguna tidak dapat diandalkan karena itu dapat dimodifikasi.

Menggunakan skrip PluginDetect JS, Anda dapat mendeteksi untuk IE dan mendeteksi versi yang tepat dengan menggunakan kode yang sangat spesifik dan dibuat dengan baik yang menargetkan versi IE tertentu. Ini sangat berguna saat Anda peduli dengan versi browser yang Anda gunakan.

Menekan Selalu
sumber
0

Saya menyadari bahwa saya agak terlambat ke pesta di sini, tetapi saya telah memeriksa cara sederhana satu baris untuk memberikan umpan balik tentang apakah browser IE dan versi apa dari 10 turun itu. Saya belum mengkodekan ini untuk versi 11, jadi mungkin diperlukan sedikit amandemen untuk itu.

Namun ini adalah kode, ini berfungsi sebagai objek yang memiliki properti dan metode dan bergantung pada deteksi objek daripada menggores objek navigator (yang cacat besar-besaran karena dapat dipalsukan).

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

Penggunaannya adalah isIE.browserproperti yang mengembalikan boolean dan bergantung pada komentar bersyarat metode isIE.detectedVersion()yang mengembalikan angka antara 5 dan 10. Saya membuat asumsi bahwa apapun yang lebih rendah dari 6 dan Anda berada di wilayah sekolah tua yang serius dan Anda akan memiliki sesuatu yang lebih gemuk daripada satu liner dan apa pun yang lebih tinggi dari 10 dan Anda berada di wilayah yang lebih baru. Saya telah membaca sesuatu tentang IE11 yang tidak mendukung komentar bersyarat tapi saya belum sepenuhnya diselidiki, itu mungkin untuk nanti.

Bagaimanapun, dan untuk liner satu, itu akan mencakup dasar-dasar browser IE dan deteksi versi. Jauh dari sempurna, tetapi kecil dan mudah diubah.

Hanya untuk referensi, dan jika ada yang ragu tentang bagaimana sebenarnya menerapkan ini maka persyaratan berikut akan membantu.

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());
}
Ric
sumber
0

Mendeteksi IE dan versinya tidak bisa lebih mudah, dan yang Anda butuhkan adalah sedikit Javascript asli / vanilla:

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

Dan ini adalah cara untuk menggunakannya:

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

.

Bekerja di semua versi IE, termasuk versi yang lebih tinggi di Tampilan / Mode Kompatibilitas yang lebih rendah, dan documentModemerupakan hak milik IE.

Frank Conijn
sumber
0

Jika Anda perlu menghapus versi Browser IE maka Anda dapat mengikuti kode di bawah ini. Kode ini bekerja dengan baik untuk versi IE6 ke 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>
Nimesh
sumber
0

Jendela yang menjalankan IE10 akan menjadi pembaruan otomatis ke IE11 + dan akan menjadi W3C standar

Sekarang ini, kita tidak perlu mendukung 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>
xicooc
sumber
0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}
xicooc
sumber
0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others
Bruce
sumber