Saya perlu tahu apakah browser yang mengidentifikasi dirinya melalui string agen pengguna sebagai IE7 atau IE8 benar-benar browser tersebut, atau apakah itu IE9 dalam mode kompatibilitas 7 atau 8.
Dari apa yang dapat saya lihat di string agen pengguna, IE9 dalam mode kompatibilitas IE7, menyediakan string yang identik dengan IE7 asli. Apakah ada properti / elemen / objek tambahan yang dapat saya uji untuk melihat apakah itu "benar-benar" IE9 yang menyamar?
Saya berasumsi mode dokumen tidak akan membantu karena halaman yang memuat skrip saya bisa jadi memaksa kebiasaan atau memaksa pengaturan tertentu.
Saya berharap IE9 akan memiliki beberapa properti yang ada dan dapat diuji terlepas dari apakah itu dalam mode 7, 8 atau 9.
Diedit untuk menambahkan…
Oke, saya mengerti di mana kesalahan saya sekarang. Saya menggunakan menu tarik-turun "Mode Browser" dan mengalihkannya ke IE8 dan IE7 dan mengira ini adalah "mode kompatibilitas IE8" dan "mode kompatibilitas IE7". Ini tentu saja tidak benar. Mode Browser alat pengembang benar-benar mengubahnya menjadi "menjadi seperti" browser lama tersebut, jadi wajar saja jika string agen pengguna asli dilaporkan.
Jika saya meninggalkan mode browser dalam kompatibilitas IE9 atau IE9 dan mencoba varian dropdown mode dokumen sebagai gantinya, maka saya sebenarnya mendapatkan "Trident / 5.0" hadir dalam semua 8 kombinasi (dua mode browser dan 4 mode dokumen). Saya hanya perlu menghindari memilih mode browser IE7 dan IE8 karena keduanya benar-benar (disimulasikan) IE7 dan IE8.
Jadi tidak mungkin halaman, pengguna non-pengembang, tag meta, atau daftar kompatibilitas Microsoft akan dapat menempatkan IE9 ke dalam status yang tidak dapat diidentifikasi ini.
Menggunakan saja if(navigator.userAgent.indexOf("Trident/5")>-1)
sudah cukup.
Jangan khawatir, ini bukan untuk gaya, pemformatan, logika, atau konten halaman. Saya menggunakan deteksi fitur untuk hal-hal itu. Saya hanya perlu mendeteksi IE9 (terlepas dari mode apa yang digunakan) dan membuat keputusan konten non-halaman tentang itu.
Terima kasih telah mengarahkan saya menuju jawaban dengan saran dan tautan Anda.
Jawaban:
Sebenarnya string agen pengguna berbeda untuk IE9 saat dijalankan dalam mode kompatibilitas IE7, jadi ini akan menjadi salah satu cara terbaik untuk membedakan antara versi IE yang berbeda.
Memperkenalkan String Agen Pengguna IE9 :
(penekanan ditambahkan oleh saya). Jadi string agen pengguna sama dengan yang dilaporkan sebagai "Mozilla / 4.0" dan MSIE 7.0, tetapi IE9 akan selalu Trident / 5.0 - tidak peduli apakah tertulis MSIE 7.0, MSIE 8.0 atau MSIE 9.0.
Sebenarnya Anda harus memeriksa kompilasi hebat ini: String ID Browser (User-Agent) atau bahkan lebih baik useragentstrings.com
sumber
document.documentMode
adalah cara terbaik untuk mode dokumen.sumber
<script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>
. IE7 yang sebenarnya (!) Dan semua non-IE mengembalikan 'tidak terdefinisi', hanya IE8 / 9 di Comp. mode return 7. Saya tidak dapat menguji IE10, tetapi itu harus sama.IE7 tidak berisi informasi apa pun tentang Trident
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)
IE8 berisi string ini: "Trident / 4.0"
User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)
IE9 berisi string ini: "Trident / 5.0"
IE9 dalam mode kompatibilitas:
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)
IE9 dalam mode normal:
User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
sumber
Berikut adalah tabel semua mode Browser dan Dokumen untuk IE9 :
sumber
Saya berharap IE9 akan memiliki beberapa properti yang ada dan dapat diuji terlepas dari apakah itu dalam mode 7, 8 atau 9.
Periksa misalnya untuk style.opacity , itu diperkenalkan di IE9 dan tersedia terlepas dari mode kompatibilitas:
<![if IE]> <script> if(typeof document.documentElement.style.opacity!='undefined') { //this must be at least IE9 } </script> <![endif]>
sumber
Terkadang perlu untuk membaca string Agen pengguna dari Variabel server, bukan dari objek navigator javascript.
Bandingkan perbedaannya:
ASP klasik, IE11
javascript klien, navigator.userAgent: " Mozilla / 5.0 (kompatibel; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "
server ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) seperti Gecko "
ASP klasik, mode Kompatibilitas IE11 :
javascript klien, navigator.userAgent: " Mozilla / 5.0 (kompatibel; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)) "
ASP server, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (kompatibel; MSIE 7.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "
sumber
Dari https://stackoverflow.com/a/29288153/2879498
Dengan asumsi Anda memiliki elemen tersembunyi dengan ID compat-warning:
Javascript dengan jQuery:
$(function(){ function showCompatWarning() { $('#compat-warning') .css('display','block') .css('height','auto') .show(); } var tridentOffset = navigator.appVersion.indexOf('Trident/'); if ( tridentOffset === -1 ) return; var jscriptVersion = 0; /*@cc_on @*/ /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/; /*@end @*/ var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10); var guessIEVersion = tridentVersion + 4; if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) || ( document.compatMode && document.compatMode === 'BackCompat') || ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion )) showCompatWarning(); });
Deteksi dan peringatan, garis pertahanan pertama dan terakhir Anda terhadap neraka kompatibilitas.
sumber