Bagaimana cara mendeteksi IE 8 dengan jQuery?

102

Saya perlu mendeteksi tidak hanya jenis browser tetapi juga versinya menggunakan jQuery. Kebanyakan saya perlu mencari tahu apakah itu IE 8 atau tidak.

Saya tidak yakin apakah saya melakukannya dengan benar.

Jika aku melakukan :

if (jQuery.browser.version >= 8.0) {
dosomething}

Saya tidak yakin ini akan berfungsi untuk versi 8.123.45.6 atau akankah itu?

Sunting: Perhatikan bahwa JQuery 2+ telah menghentikan dukungan untuk IE8 dan yang lebih lama, dan oleh karena itu tidak dapat lagi digunakan untuk mendeteksi IE8. Jika menggunakan versi JQuery saat ini, perlu menggunakan solusi Non-JQuery.

salmane
sumber
11
jawaban yang disarankan di bawah ini menyarankan Anda menggunakan jQuery.browser. Namun, dokumentasi jQuery menghentikan penggunaan jQuery.browser. Sebaliknya, mereka menyarankan Anda menggunakan jQuery.support dan menunjuk ke fitur yang tidak didukung untuk menandai browser. Misalnya, Anda dapat menggunakan if (jQuery.support.opacity == false) {kode IE8 dan IE7 Anda}
IberoMedia
Ini jquery.support.opacityhanya melakukan apa yang saya inginkan. Terima kasih ...
1313
Jika Anda melakukan sesuatu dengan benar, Anda tidak perlu melakukan deteksi versi browser. Ada alasan mengapa fitur ini dihapus dari jQuery, dan alasan itu adalah deteksi versi browser adalah praktik yang buruk. Menggunakan deteksi fitur malah akan menyelesaikan masalah di hampir semua kasus.
Spudley
2
Saya perlu mendeteksi IE8 karena ini satu-satunya browser yang mesin javascriptnya sangat lambat sehingga menampilkan dialog yang mengatakan "apakah Anda ingin berhenti menjalankan skrip" di halaman ini, dan defaultnya adalah "ya". Jika ada mekanisme deteksi fitur untuk ini, saya akan menggunakannya. Sebaliknya jika browser == IE8. Saya tidak dapat mengoptimalkan javascript, karena kode
tampilan pohon

Jawaban:

79

Itu didokumentasikan dalam Dokumentasi API jQuery . Periksa Internet Explorer dengan $.browser.msiedan kemudian periksa versinya dengan $.browser.version.

UPDATE: $ .browser dihapus di jQuery 1.9

Metode jQuery.browser () sudah tidak digunakan lagi sejak jQuery 1.3 dan dihapus di 1.9. Jika perlu, ini tersedia sebagai bagian dari plugin jQuery Migrate. Kami merekomendasikan penggunaan deteksi fitur dengan pustaka seperti Modernizr.

AndiDog
sumber
jika saya lakukan: if (jQuery.browser.version> = 8.0) {dosomething} Saya tidak yakin ini akan bekerja untuk versi 8.123.45.6 atau akankah itu?
salmane
13
Ini adalah string, jadi Anda harus melakukannya if(jQuery.browser.version.substring(0, 2) == "8.") { ... }. Dengan begitu, ini akan bekerja dengan semua versi IE8.
AndiDog
13
jQuery.browsersudah tidak digunakan lagi di 1.3 dan dapat dipindahkan ke plugin di masa mendatang. Lihat dokumen jQuery.browser
bendytree
Syukurlah masih ada dan tidak ada penyebutan, @bendytree
Alastair
47
jquery.browser dihapus pada 1.9
Mandeep Jain
173

Saya pikir cara terbaik adalah ini:

Dari boilerplate HTML5:

<!--[if lt IE 7]> <html lang="en-us" class="no-js ie6 oldie"> <![endif]-->
<!--[if IE 7]>    <html lang="en-us" class="no-js ie7 oldie"> <![endif]-->
<!--[if IE 8]>    <html lang="en-us" class="no-js ie8 oldie"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en-us" class="no-js"> <!--<![endif]-->

di JS:

if( $("html").hasClass("ie8") ) { /* do your things */ };

terutama karena $.browsertelah dihapus dari jQuery 1.9+.

meo
sumber
11
Ini adalah cara yang sangat cerdas untuk mendeteksi versi IE. Saya sangat suka!
Greg
tetapi tidak berfungsi jika situs web Anda dikirimkan dengan tajuk 'Jenis konten: aplikasi / xhtml + xml', maka komentar bersyarat ini diabaikan
philipp
1
Sangat pintar ... tetapi perlu dicatat bahwa Anda perlu memeriksa kelas saat ini yang ditambahkan oleh kondisional di HTML5BP. Saat ini saya pikir kelasnya lt-ie9AOTie8
byronyasgur
2
@meo Saya suka implementasi ini juga. Tetapi apakah ada alasan mengapa kelas dilampirkan <html>daripada <body>?
beristirahat
@meo Menarik. Terima kasih.
beristirahat pada
89

Ini harus bekerja untuk semua versi minor IE8

if ($.browser.msie  && parseInt($.browser.version, 10) === 8) {
  alert('IE8'); 
} else {
  alert('Non IE8');
}

- perbarui

Harap diperhatikan bahwa $ .browser telah dihapus dari jQuery 1.9

Mithun Sreedharan
sumber
56

Jangan lupa bahwa Anda juga dapat menggunakan HTML untuk mendeteksi IE8.

<!--[if IE 8]>
<script type="text/javascript">
    ie = 8;
</script>
<![endif]-->

Memiliki itu sebelum semua skrip Anda akan membiarkan Anda hanya memeriksa variabel "ie" atau apa pun.

TheBuzzSaw
sumber
4
Sintaks ini juga mendukung pembanding "kurang dari" ("[if lt IE 7]") dan "lebih besar dari" ("[if gt IE 8]").
spiffytech
1
<! - [if lte IE 8]> untuk menyertakan ie8
user227353
1
Ini adalah cara terbaik untuk melakukannya, cukup alihkan ke halaman lain yang bertuliskan "Mengapa Anda menggunakan IE8?" TINGKATKAN SEKARANG!
Leon Gaban
2
Dengan standar saat ini, saya akan bertanya kepada mereka mengapa mereka menggunakan IE.
TheBuzzSaw
Ini sepertinya solusi terbaik sekarang karena JQuery 2.1.1 tidak berfungsi dengan IE8, dan oleh karena itu tidak dapat digunakan untuk mendeteksi IE8!
Dave
27

document.documentMode tidak ditentukan jika browser bukan IE8,

itu mengembalikan 8 untuk mode standar dan 7 untuk 'kompatibel dengan IE7'

Jika dijalankan sebagai IE7, ada banyak fitur css dan dom yang tidak akan didukung.

kennebec
sumber
9
Perhatikan bahwa IE9 mengembalikan 9. Ini seharusnya merupakan jawaban yang dipilih lebih tinggi, meskipun, sekarang $ .browser bukan lagi solusi yang baik. Coba:if ((document.documentMode || 100) < 9) { // IE8
Don McCurdy
if (document.documentMode! == undefined && document.documentMode == 8) {...}
jpprade
Untuk beberapa aplikasi di mana IE8 masih sangat digunakan - yaitu, sekolah AS - pendekatan @ Don McCurdy sederhana dan efektif. Bersamaan dengan Modernizr itu berfungsi dengan baik.
cbmtrx
Jawaban yang bagus! Ini mengembalikan nomor versi untuk IE8 hingga IE11 (dibandingkan dengan IE5 hingga IE9 untuk komentar bersyarat - jika ada yang masih perlu mendeteksi IE7 atau IE6 asli juga, Anda harus menggunakan komentar bersyarat). Perhatikan bahwa menurut dokumen itu mungkin kembali 0saat halaman sedang dimuat - "coba untuk menentukan mode kompatibilitas dokumen di lain waktu" (yaitu setelah dokumen siap).
pengguna56reinstatemonica8
15

Asumsi...

  • ... bahwa itu adalah mesin rendering crunky dari versi lama IE yang ingin Anda deteksi, untuk membuat gaya terlihat tepat di IE lama (jika tidak, gunakan deteksi fitur)
  • ... bahwa Anda tidak bisa hanya menambahkan komentar bersyarat ke HTML - misalnya untuk plugin JS yang dapat diterapkan ke halaman manapun (jika tidak, cukup lakukan trik kelas bersyarat pada <body>atau <html>)

... maka ini mungkin trik terbaik (berdasarkan non-jQuery, varian yang sedikit kurang fleksibel ). Ini membuat kemudian tes untuk kemudian menghapus komentar bersyarat yang sesuai.

(Komentar bersyarat diabaikan dalam 'mode standar' IE10 + - tetapi itu seharusnya baik-baik saja karena 'mode standar' IE10 + tidak memiliki mesin rendering yang gila!)

Jatuhkan fungsi ini:

function isIE( version, comparison ){
    var $div = $('<div style="display:none;"/>');

    // Don't chain these, in IE8 chaining stops some versions of jQuery writing the conditional comment properly
    $div.appendTo($('body'));
    $div.html('<!--[if '+(comparison||'')+' IE '+(version||'')+']><a>&nbsp;</a><![endif]-->');

    var ieTest = $div.find('a').length;
    $div.remove();
    return ieTest;
}

Kemudian gunakan seperti ini:

if(isIE()){ /* runs in all versions of IE after 4 before standards-mode 10 */ }

if(isIE(8)){ /* runs in IE8 */ }

if(isIE(9)){ /* runs in IE9 */ }

if(isIE(8,'lte')){ /* runs in IE8 or below */ }

if(isIE(6,'lte')){ /* if you need this, I pity you... */ }

Saya juga menyarankan hasil cache dari fungsi ini sehingga Anda tidak perlu mengulanginya. Misalnya, Anda bisa menggunakan string (comparison||'')+' IE '+(version||'')sebagai kunci untuk menyimpan dan memeriksa hasil tes ini di suatu objek di suatu tempat.

pengguna56reinstatemonica8
sumber
9

catatan:

1) $ .browser tampaknya dijatuhkan di jQuery 1.9+ (seperti dicatat oleh Mandeep Jain). Hal ini dianjurkan untuk menggunakan .support gantinya.

2) $ .browser.version dapat mengembalikan "7" di IE> 7 saat browser berada dalam mode "kompatibilitas".

3) Mulai IE 10, komentar bersyarat tidak akan berfungsi lagi.

4) jQuery 2.0+ akan menghentikan dukungan untuk IE 6/7/8

5) document.documentMode tampaknya hanya ditentukan di browser Internet Explorer 8+. Nilai yang dikembalikan akan memberi tahu Anda dalam mode "kompatibilitas" apa yang dijalankan Internet Explorer. Masih bukan solusi yang baik.

Saya mencoba banyak opsi .support (), tetapi tampaknya ketika browser IE (9+) dalam mode kompatibilitas, itu hanya akan berperilaku seperti IE 7 ... :(

Sejauh ini saya hanya menemukan ini berfungsi (kind-a):

(jika documentMode tidak ditentukan dan htmlSerialize serta opacity tidak didukung, kemungkinan besar Anda melihat IE <8 ...)

if(!document.documentMode && !$.support.htmlSerialize && !$.support.opacity) 
{
    // IE 6/7 code
}
Hanzaplastique
sumber
5

Jika Anda mengutak-atik versi browser, hal itu sering kali tidak menghasilkan kebaikan. Anda tidak ingin menerapkannya sendiri. Tapi Anda bisa Modernizr dibuat oleh Paul Irish dan orang pintar lainnya. Ini akan mendeteksi apa yang sebenarnya bisa dilakukan browser dan memasukkan kelas yang sesuai di <html>elemen. Namun dengan Modernizr , Anda dapat menguji versi IE seperti ini:

$('html.lt-ie9').each() {
    // this will execute if browser is IE 8 or less
}

Serupa, Anda dapat menggunakan .lt-ie8, dan .lt-ie7.

koubic
sumber
3

Anda juga harus melihat jQuery.support . Deteksi fitur jauh lebih dapat diandalkan daripada deteksi browser untuk mengkodekan fungsionalitas Anda (kecuali Anda hanya mencoba mencatat versi browser).

jkyle.dll
sumber
3
bagaimana Anda menggunakan jQuery.support untuk mendeteksi IE8?
BishopZ
jika AJAX adalah yang Anda cari, maka Anda dapat menggunakan jQuery.support.ajax yang mengembalikan nilai true jika browser mendukung AJAX
Jonathan Lin
Jawaban ini akan membantu: stackoverflow.com/questions/1944169/…
helgatheviking
3

Anda dapat dengan mudah mendeteksi tipe dan versi browser yang mana, menggunakan jquery ini

$(document).ready(function()
{
 if ( $.browser.msie ){
    if($.browser.version == '6.0')
    {   $('html').addClass('ie6');
    }
    else if($.browser.version == '7.0')
    {   $('html').addClass('ie7');
    }
    else if($.browser.version == '8.0')
    {   $('html').addClass('ie8');
    }
    else if($.browser.version == '9.0')
    {   $('html').addClass('ie9');
    }
 }
 else if ( $.browser.webkit )
 { $('html').addClass('webkit');
 }
 else if ( $.browser.mozilla )
 { $('html').addClass('mozilla');
 }
 else if ( $.browser.opera )
 { $('html').addClass('opera');
 }
});
Sanooj
sumber
1

Berikut adalah plugin deteksi browser Jquery untuk mengidentifikasi deteksi browser / os.

Anda dapat menggunakan ini untuk tujuan gaya setelah memasukkan plugin.

$("html").addClass($.os.name);
$("body").addClass($.browser.className);
$("body").addClass($.browser.name);
Aravind Vel
sumber
0

Anda dapat menggunakan $ .browser untuk mendeteksi nama browser. nilai yang mungkin adalah:

  • webkit (mulai jQuery 1.4)
  • safari (tidak digunakan lagi)
  • opera
  • msie
  • mozilla

atau dapatkan boolean flag: $ .browser.msie akan bernilai true jika browsernya MSIE.

Sedangkan untuk nomor versi, jika Anda hanya tertarik pada nomor rilis utama - Anda dapat menggunakan parseInt ($. browser.version, 10). tidak perlu mengurai sendiri string $ .browser.version.

Bagaimanapun, Properti $ .support tersedia untuk mendeteksi dukungan untuk fitur tertentu daripada mengandalkan $ .browser.

Yonatan Betzer
sumber