JavaScript: IE9'u IE7 veya IE8 uyumluluk modundaysa tespit edebilir miyim?


87

Kendini kullanıcı aracısı dizesi aracılığıyla IE7 veya IE8 olarak tanımlayan tarayıcının gerçekten bu tarayıcılar mı yoksa 7 veya 8 uyumluluk modunda IE9 mu olduğunu bilmem gerekiyor.

Kullanıcı aracısı dizesinde görebildiğim kadarıyla, IE7 uyumluluk modunda bir IE9, gerçek bir IE7 ile aynı dizeyi sağlar. Kılık değiştirmiş "gerçekten" IE9 olup olmadığını görmek için test edebileceğim fazladan bir özellik / öğe / nesne var mı?

Betiğimin yüklendiği sayfa tuhaflıkları zorluyor veya belirli bir ayarı zorluyor olabileceği için belge modunun yardımcı olmayacağını varsayıyorum.

IE9'un 7, 8 veya 9 modunda olup olmadığına bakılmaksızın var olan ve test edilebilir bazı özelliklere sahip olacağını umuyorum.


Eklemek için düzenlendi…

Tamam, şimdi nerede yanlış yaptığımı görüyorum. "Tarayıcı Modu" açılır menüsünü kullanıyordum ve onu IE8 ve IE7'ye geçiriyordum ve bunun sırasıyla "IE8 uyumluluk modu" ve "IE7 uyumluluk modu" olduğunu düşünüyordum. Bu elbette doğru değil. Geliştirici araçlarının Tarayıcı modu gerçekten onu eski tarayıcılara "benzemek" için değiştiriyor, bu nedenle orijinal useragent dizelerinin rapor edilmesi yalnızca doğru.

Tarayıcı modunu IE9 veya IE9 uyumluluğunda bırakır ve bunun yerine belge modu açılır varyantlarını denersem, aslında 8 kombinasyonun tamamında (iki tarayıcı modu ve 4 belge modu) "Trident / 5.0" var. IE7 ve IE8 tarayıcı modunu seçmekten kaçınmam gerekiyor çünkü bunlar gerçekten (simüle edilmiş) IE7 ve IE8.

Bu nedenle, bir sayfanın, geliştirici olmayan bir kullanıcının, bir meta etiketin veya Microsoft'un uyumluluk listesinin IE9'u bu tanımlanamaz duruma sokması mümkün değildir.

Sadece kullanmak if(navigator.userAgent.indexOf("Trident/5")>-1)yeterli olacaktır.

Merak etmeyin, bu stiller, biçimlendirme, mantık veya sayfa içeriği için değildir. Bu şeyler için özellik tespitini kullanıyorum. Sadece IE9'u (hangi modda olduğuna bakılmaksızın) tespit etmem ve bununla ilgili sayfa dışı içerik kararı vermem gerekiyor.

Önerileriniz ve bağlantılarınızla beni yanıta yönlendirdiğiniz için teşekkür ederiz.


1
Kullanıcı aracısına asla güvenmeyin ... mükemmel bir şekilde yalan söyleyebilir ve doğruyu söyleyip söylemediğinden emin olmanın bir yolu yoktur ... bunun yerine belirli işlevleri veya özellikleri test etmelisiniz
JCOC611

2
@ JCOC611 Evet ve hayır. Bu, makul bir soru olan uyumluluk görünümünde IE9 olup olmadığının nasıl anlaşılacağı özel bir sorudur. Genelde site işlevselliği için kullanıcı aracısı dizelerine güvenilmemelidir, çünkü site işlevselliği kolayca taklit edilebilir, doğru.
Dennis G

1
Kullanıcı aracısı doğru olsa bile, mümkünse özellik algılamayı kullanmak büyük ölçüde tercih edilir. O zaman, IE'nin uyumluluk modunda olup olmadığını bilmenize gerek yok.
Dave Ward

1
Yanlış bir tarayıcı modu kullanan kullanıcılara hızlı bir eğitim sağlamak istiyorsanız, bunun çok yararlı olduğunu eklemek istiyorum.
Joost

1
@ JCOC611 kim kullanıcı temsilcisini kandırır ve işlerin doğru şekilde çalışmasını bekler - bu vakayı gerçekten önemsemeli miyiz?
JohnnyFaldo

Yanıtlar:


67

Aslında, IE7 uyumluluk modunda çalıştırıldığında kullanıcı aracısı dizesi IE9 için farklıdır, bu nedenle bu, farklı IE sürümleri arasında ayrım yapmanın en iyi yollarından biri olacaktır.

IE9'un Kullanıcı Aracı Dizesi Tanıtımı :

IE8'e benzer şekilde, IE9'un Uyumluluk Görünümü IE7 Standartları Modu ile eşleşecek ve Uyumluluk Görünümü'ndeyken IE9'un UA dizesi şu şekilde olacaktır:

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

Uyumluluk Görünümünde IE9, uygulama sürüm numarası (Mozilla / 4.0) ve sürüm belirteci (MSIE 7.0) aracılığıyla kendisini IE7 olarak bildirir. Bu uyumluluk için yapılır. 'Trident / 4.0'dan' Trident / 5.0'a yükseltilmiş bir Trident belirteci, web sitelerinin Uyum Görünümünde çalışan IE9 ile Uyum Görünümünde çalışan IE8 arasında ayrım yapmasına olanak tanır .

(vurgu benim tarafımdan eklendi). Dolayısıyla, kullanıcı aracısı dizesi kendisini "Mozilla / 4.0" ve MSIE 7.0 olarak bildirdiği gibi aynıdır, ancak IE9 her zaman Trident / 5.0 olacaktır - MSIE 7.0, MSIE 8.0 veya MSIE 9.0 olsun.

Aslında bu harika derlemeye bir göz atmalısınız: Tarayıcı Kimliği (Kullanıcı Aracı) Dizeleri veya daha da iyisi useragentstrings.com


1
Merhaba moontear. IE9 IE7 modundayken "Trident / 5.0" ın mevcut olması gerektiğini de gördüm, ancak Win7 Pro x64'teki (son) IE9'umda gördüğüm bu değil. IE7 modunda hiç trident göstermiyor (gerçek IE7'ye benziyor) ve IE8 modunda trident 4 gösteriyor (yine, gerçek IE8 neye benziyor). Tarayıcı modunu seçmek için önce IE9 geliştirici araçlarını kullanıyorum ve ardından adres çubuğunda javascript uyarısı: alert (navigator.userAgent)
Dee2000

1
"Trident / 5.0", tüm modlarda IE9'un kullanıcı aracısı dizesinde bulunur.
EricLaw

EricLaw'ın dediği gibi, Dee. Uyumluluk modunu kullanırken Trident / 5.0 mevcut olmalıdır (tarayıcı modu için farklı olabilir mi?). Kullanıcı aracısı dizesini nasıl kontrol edersiniz? Whatsmyuseragent.com üzerinden kontrol etmeyi ve geri bildirimde bulunmayı deneyin .
Dennis G

Aşağıdaki yanıtıma bakın (kendi mesajınıza yanıt eklemeyle ilgili 8 saatlik yığın taşması kuralı nedeniyle başka bir Dee2001 kimliği kullanmak zorunda kaldım). Evet Eric ve Moontear hem doğru Trident / 5.0 olan olan IE9 en modların hepsi mevcut. En büyük hatam, geliştirici araçlarında "Tarayıcı Modu" nu IE7 veya IE8 olarak değiştirmekti, ancak bu bir sayfa / meta etiket / uyumluluk listesinin uygulayabileceği bir "mod" değil. Bunun yerine, tarayıcıların kendilerini gerçekten simüle ediyor, bu nedenle doğal olarak useragent dizesi gerçekten IE7 / 8'e benziyor.
Dee2000

1
Bu harika! Çok teşekkürler. Bildirilen tarayıcıya göre stil belirlemiyorum ancak üzerinde çalıştığım sitenin üst kısmında kullanıcının yükseltmesi gerektiğini belirten bir uyarı çubuğu oluşturuyorum (yani koşullu etiketler ie7'den küçük veya eşit olduğunu söylüyorsa) - Mesajın bu durumda yükseltme demesini istemiyorum, bunun yerine uyumluluk modunu devre dışı bırakmasını istiyorum
Chelsea Urquhart

47

document.documentMode belge modu için en iyi yoldur.


17
Lütfen cevabı biraz genişletin. Daha fazla bağlam.
random_user_name

3
Neden insanlar bunu artı etmiyor, tam olarak ihtiyaç duyulan şey
Jamie Hutber

5
Bu gerçekten de en iyi yoldur. Sen bu şekilde kullanabilirsiniz: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. Gerçek (!) IE7 ve tüm IE olmayanlar 'tanımsız' döndürür, Comp'da yalnızca IE8 / 9. mode return 7. IE10'u test edemem ama bu aynı olmalı.
Frank Conijn

2
Bunu, kenar META etiketi olan bir tarafta IE10'da denedim; normalde "10" döndürür. Tüm siteler için uyumluluk modunu açmaya zorlayın ve hala "10" döndürüyor.
Whelkaholism

Benim için çalışıyor IE10 ve IE11 Önizleme
Simon Keep

20

IE7, Trident hakkında herhangi bir bilgi içermiyor

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 şu dizeyi içerir: "Trident / 4.0"

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 şu dizeyi içerir: "Trident / 5.0"

Uyumluluk modunda IE9:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

Normal modda IE9:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)

1
Bu harika, IE10 Trident'ı da artırıyor mu?
slotishtype

3
İnternet gezgini 10 kullanıcı Trident / 6.0 .... bkz. Blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype

1
ve IE11, Trident / 7.0
Dee2000,


11

IE9'un 7, 8 veya 9 modunda olup olmadığına bakılmaksızın var olan ve test edilebilir bazı özelliklere sahip olacağını umuyorum.

Örneğin style.opacity için kontrol edin, IE9'da tanıtıldı ve uyumluluk modundan bağımsız olarak kullanılabilir:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>

1
Teşekkürler Dr.Molle, bunu deneyip geri bildireceğim.
Dee2000

Maalesef bu sadece Tarayıcı Modu için çalışıyor (IE9 geliştirici araçlarında soldaki açılır menü). Belge modunda çalışmaz (sağdaki açılır menü). Belge modu için, yalnızca IE9 belge modunda çalışır. IE8, IE7 veya Quirks modundaysa, bu mantık başarısız olur.
Dee2000

7
Kahretsin, haklısın. Ben, başka bir özellik bulundu her modda benim için çalışıyor: window.performance
Dr.Molle

@ Dee2000: Benim için DocumentMode ile de çalışıyor. Yani YALNIZCA DocumentMode = "Internet Explorer 9 standardı" bu test başarılı olursa.
Niklas Bäckman

@ Dr.Molle bunun için teşekkürler, window.performance işi iyi yapıyor.
lewsid

3

Bazen kullanıcı Agent dizesini javascript navigator nesnesinden değil, sunucu Değişkeninden okumak gerekir.

Farklılıkları karşılaştırın:

  • ASP klasik, IE11

    • istemci javascript, navigator.userAgent: " Mozilla / 5.0 (uyumlu; 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) "

    • sunucu ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) Gecko gibi "

  • ASP klasik, IE11 Uyumluluk modu :

    • istemci javascript, navigator.userAgent: " Mozilla / 5.0 (uyumlu; 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)) "

    • sunucu ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (uyumlu; 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) "


0

Gönderen https://stackoverflow.com/a/29288153/2879498

Kimlik uyum uyarısına sahip gizli bir öğeniz olduğunu varsayarsak:

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

Tespit ve uyarılar, uyumluluk cehennemine karşı ilk ve son savunma hattınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.