JavaScript: Dapatkah saya mendeteksi IE9 jika dalam mode kompatibilitas IE7 atau IE8?

87

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.

Dee2000
sumber
1
Jangan pernah mempercayai agen pengguna ... itu bisa berbohong dengan sempurna dan tidak ada cara untuk memastikan apakah itu benar atau tidak ... Anda harus menguji fungsi atau fitur tertentu sebagai gantinya
JCOC611
2
@ JCOC611 Ya dan tidak. Ini adalah pertanyaan khusus bagaimana mengetahui apakah itu IE9 dalam tampilan kompatibilitas, yang merupakan pertanyaan yang masuk akal. Secara umum orang tidak boleh mengandalkan string agen pengguna untuk fungsionalitas situs karena orang dapat dengan mudah memalsukannya, benar.
Dennis G
1
Meskipun agen pengguna akurat, sebaiknya gunakan deteksi fitur jika memungkinkan. Kemudian, Anda tidak perlu mengetahui apakah IE dalam mode kompatibilitas atau tidak.
Dave Ward
1
Saya hanya ingin menambahkan bahwa ini sangat berguna jika Anda ingin memberikan tutorial singkat kepada pengguna yang menggunakan mode browser yang salah.
Joost
1
@ JCOC611 siapa yang akan memalsukan agen pengguna mereka dan mengharapkan segala sesuatunya bekerja dengan benar - haruskah kita benar-benar peduli dengan kasus itu?
JohnnyFaldo

Jawaban:

67

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 :

Mirip dengan IE8, Tampilan Kompatibilitas IE9 akan dipetakan ke Mode Standar IE7, dan string UA dari IE9 ketika dalam Tampilan Kompatibilitas akan menjadi:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

Dalam Tampilan Kompatibilitas, IE9 melaporkan dirinya sebagai IE7 melalui nomor versi aplikasi (Mozilla / 4.0) dan token versi (MSIE 7.0). Ini dilakukan untuk kompatibilitas. Token Trident yang bertambah, dari 'Trident / 4.0' ke 'Trident / 5.0', memungkinkan situs web untuk membedakan antara IE9 yang berjalan di Compat View dan IE8 yang berjalan di Compat View .

(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

Dennis G
sumber
1
Hai moontear. Saya juga melihat bahwa "Trident / 5.0" seharusnya ada saat IE9 dalam mode IE7, tetapi bukan itu yang saya lihat di IE9 (final) saya pada Win7 Pro x64. Ini menunjukkan tidak ada trisula sama sekali dalam mode IE7 (seperti tampilan IE7 yang sebenarnya) dan ini menunjukkan trisula 4 dalam mode IE8 (sekali lagi, seperti apa tampilan IE8 yang asli). Saya menggunakan alat pengembang IE9 drop-down pertama untuk memilih mode browser dan kemudian di bilah alamat memperingatkan javascript: alert (navigator.userAgent)
Dee2000
1
"Trident / 5.0" ada di string agen pengguna IE9 di semua mode.
EricLaw
Seperti yang dikatakan EricLaw, Dee. Trident / 5.0 harus ada saat Anda menggunakan mode kompatibilitas (mungkin berbeda untuk mode browser?). Bagaimana Anda memeriksa string agen pengguna? Coba cek melalui whatsmyuseragent.com dan laporkan kembali.
Dennis G
Lihat tanggapan saya di bawah (saya harus menggunakan id lain Dee2001 karena aturan 8 jam stack overflow tentang menambahkan tanggapan ke pesan Anda sendiri). Ya Eric dan Moontear keduanya benar, Trident / 5.0 adalah hadir di semua mode IE9. Kesalahan besar saya adalah mengubah "Mode Browser" ke IE7 atau IE8 di alat pengembang, tetapi itu bukan "mode" yang dapat diterapkan oleh laman / tag meta / daftar kompatibilitas. Sebaliknya itu benar-benar mensimulasikan browser itu sendiri, jadi tentu saja string agen pengguna benar-benar seperti IE7 / 8.
Dee2000
1
Ini sempurna! Terima kasih banyak. Saya tidak mengatur gaya berdasarkan browser yang dilaporkan tetapi saya menyiapkan bilah peringatan di bagian atas situs yang sedang saya kerjakan yang mengatakan bahwa pengguna perlu meningkatkan (jika misalnya tag bersyarat mengatakan itu kurang dari atau sama dengan ie7) - Saya tidak ingin pesan mengatakan peningkatan dalam kasus ini melainkan menonaktifkan mode kompatibilitas
Chelsea Urquhart
47

document.documentMode adalah cara terbaik untuk mode dokumen.

Yuhong Bao
sumber
17
Harap kembangkan jawabannya sedikit. Lebih banyak konteks.
random_user_name
3
Mengapa orang tidak menambahkan ini, itulah yang dibutuhkan
Jamie Hutber
5
Itu memang cara terbaik. Anda dapat menggunakan cara ini: <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.
Frank Conijn
2
Baru saja mencoba ini di IE10 di sisi dengan tag META tepi; biasanya, ini mengembalikan "10". Paksa mode kompatibilitas aktif untuk semua situs, dan tetap mengembalikan "10".
Whelkaholism
Bekerja untuk saya di IE10 dan Pratinjau IE11
Simon Keep
20

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)
Greg
sumber
1
Itu bagus, apakah Trident inkremen IE10 juga?
slotishtype
3
Internet explorer pengguna 10 Trident / 6.0 .... melihat blogs.msdn.com/b/ie/archive/2012/07/12/...
slotishtype
1
dan IE11 menggunakan Trident / 7.0
Dee2000
11

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]>
Dr. Molle
sumber
1
Terima kasih Dr. Molle, saya akan mencobanya dan melaporkannya kembali.
Dee2000
Sayangnya itu hanya berfungsi untuk Mode Browser (drop-down kiri di alat pengembang IE9). Ini tidak berfungsi untuk mode Dokumen (drop-down sebelah kanan). Untuk mode dokumen, ini hanya berfungsi dalam mode dokumen IE9. Jika dalam mode IE8, IE7 atau Quirks, logika itu gagal.
Dee2000
7
Sial, hakmu. Saya menemukan properti lain, berfungsi untuk saya dalam setiap mode: window.performance
Dr. Molle
@ Dee2000: Ini bekerja untuk saya dengan DocumentMode juga. Yaitu HANYA jika DocumentMode = "Internet Explorer 9 standard" melakukan tes ini berhasil.
Niklas Bäckman
@ Dr.Molle terima kasih untuk ini, window.performance melakukan pekerjaan dengan baik.
lewsid
3

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

Pažout
sumber
0

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.

TylerY86
sumber