JavaScript: ฉันสามารถตรวจจับ IE9 ได้หรือไม่หากอยู่ในโหมดที่เข้ากันได้กับ IE7 หรือ IE8


87

ฉันต้องการทราบว่าเบราว์เซอร์ที่ระบุตัวเองผ่านสตริงตัวแทนผู้ใช้ว่าเป็น IE7 หรือ IE8 เป็นเบราว์เซอร์เหล่านั้นจริงๆหรือว่าเป็น IE9 ในโหมดความเข้ากันได้ 7 หรือ 8

จากสิ่งที่ฉันเห็นในสตริงตัวแทนผู้ใช้ IE9 ในโหมดความเข้ากันได้ของ IE7 ให้สตริงที่เหมือนกันกับ IE7 จริง มีคุณสมบัติ / องค์ประกอบ / วัตถุเพิ่มเติมที่ฉันสามารถทดสอบเพื่อดูว่า IE9 "จริงๆ" ปลอมตัวหรือไม่

ฉันคิดว่าโหมดเอกสารจะไม่ช่วยเนื่องจากหน้าที่โหลดสคริปต์ของฉันอาจเป็นการบังคับใช้นิสัยแปลก ๆ หรือบังคับให้มีการตั้งค่าเฉพาะ

ฉันหวังว่า IE9 จะมีคุณสมบัติบางอย่างที่มีอยู่และสามารถทดสอบได้ไม่ว่าจะอยู่ในโหมด 7, 8 หรือ 9 ก็ตาม


แก้ไขเพื่อเพิ่ม ...

ตกลงฉันเข้าใจว่าตอนนี้ฉันผิดพลาดตรงไหน ฉันใช้เมนูแบบเลื่อนลง "โหมดเบราว์เซอร์" และเปลี่ยนเป็น IE8 และ IE7 และคิดว่านี่คือ "โหมดความเข้ากันได้ของ IE8" และ "โหมดความเข้ากันได้ของ IE7" ตามลำดับ นี่ไม่เป็นความจริงแน่นอน โหมดเบราว์เซอร์ของเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์กำลังเปลี่ยนเป็น "เป็นเหมือน" เบราว์เซอร์รุ่นเก่าเหล่านั้นจริงๆดังนั้นจึงถูกต้องเท่านั้นที่จะรายงานสตริงผู้ใช้ดั้งเดิม

ถ้าฉันออกจากโหมดเบราว์เซอร์ในความเข้ากันได้ของ IE9 หรือ IE9 และลองใช้ตัวแปรแบบเลื่อนลงของโหมดเอกสารแทนฉันจะได้รับ "Trident / 5.0" ในชุดค่าผสมทั้งหมด 8 แบบ (โหมดเบราว์เซอร์สองโหมดและโหมดเอกสาร 4 โหมด) ฉันต้องหลีกเลี่ยงการเลือกโหมดเบราว์เซอร์ IE7 และ IE8 เพราะเป็น IE7 และ IE8 (จำลอง) จริงๆ

ดังนั้นจึงไม่มีทางที่เพจผู้ใช้ที่ไม่ใช่นักพัฒนาเมตาแท็กหรือรายการความเข้ากันได้ของ Microsoft จะสามารถทำให้ IE9 อยู่ในสถานะที่ไม่สามารถระบุตัวตนได้

เพียงแค่ใช้if(navigator.userAgent.indexOf("Trident/5")>-1)จะเพียงพอ

ไม่ต้องกังวลนี่ไม่ใช่สำหรับสไตล์การจัดรูปแบบตรรกะหรือเนื้อหาของหน้า ฉันใช้การตรวจจับคุณสมบัติสำหรับสิ่งเหล่านั้น ฉันเพียงแค่ต้องตรวจจับ IE9 (ไม่ว่าจะอยู่ในโหมดใดก็ตาม) และทำการตัดสินใจเกี่ยวกับเนื้อหาที่ไม่ใช่หน้า

ขอบคุณสำหรับคำตอบพร้อมคำแนะนำและลิงก์ของคุณ


1
อย่าเชื่อใจตัวแทนผู้ใช้ ... มันสามารถโกหกได้อย่างสมบูรณ์แบบและไม่มีทางที่จะแน่ใจได้ว่ามันพูดความจริงหรือไม่ ... คุณควรทดสอบฟังก์ชั่นหรือคุณสมบัติเฉพาะแทน
JCOC611

2
@ JCOC611 ใช่และไม่ใช่ นี่เป็นคำถามเฉพาะในการค้นหาว่าเป็น IE9 ในมุมมองความเข้ากันได้หรือไม่ซึ่งเป็นคำถามที่สมเหตุสมผล โดยทั่วไปไม่ควรพึ่งพาสตริงตัวแทนผู้ใช้สำหรับการทำงานของไซต์เนื่องจากสามารถปลอมได้ง่ายจริง
Dennis G

1
แม้ว่าตัวแทนผู้ใช้จะมีความแม่นยำ แต่ก็ควรใช้การตรวจจับคุณลักษณะเป็นอย่างมากหากเป็นไปได้ จากนั้นคุณไม่จำเป็นต้องรู้ว่า IE อยู่ในโหมดความเข้ากันได้ตั้งแต่แรกหรือไม่
Dave Ward

1
ฉันแค่อยากจะเพิ่มว่าสิ่งนี้มีประโยชน์มากหากคุณต้องการให้คำแนะนำสั้น ๆ แก่ผู้ใช้ที่ใช้เบราว์เซอร์ผิดโหมด
Joost

1
@ JCOC611 ใครจะปลอมแปลง useragent และคาดหวังว่าสิ่งต่างๆจะทำงานได้อย่างถูกต้อง - เราควรใส่ใจกับกรณีนั้นจริงหรือ
JohnnyFaldo

คำตอบ:


67

จริงๆแล้วสายอักขระตัวแทนผู้ใช้แตกต่างกันสำหรับ IE9 เมื่อทำงานในโหมดความเข้ากันได้ของ IE7 ดังนั้นนี่จึงเป็นวิธีที่ดีที่สุดวิธีหนึ่งในการแยกความแตกต่างระหว่าง IE เวอร์ชันต่างๆ

แนะนำ User Agent String ของ IE9 :

เช่นเดียวกับ IE8 มุมมองความเข้ากันได้ของ IE9 จะแมปกับโหมดมาตรฐาน IE7 และสตริง UA ของ IE9 เมื่ออยู่ในมุมมองความเข้ากันได้จะเป็น:

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

ในมุมมองความเข้ากันได้ IE9 จะรายงานตัวเองเป็น IE7 ผ่านหมายเลขเวอร์ชันของแอปพลิเคชัน (Mozilla / 4.0) และโทเค็นเวอร์ชัน (MSIE 7.0) สิ่งนี้ทำเพื่อความเข้ากันได้ เพิ่มขึ้นตรีศูลโทเค็นจาก 'ตรีศูล / 4.0' เป็น 'ตรีศูล / 5.0' ช่วยให้เว็บไซต์ที่จะแยกแยะระหว่าง IE9 ทำงานใน compat ดูและ IE8 ทำงานใน compat ดู

(เน้นย้ำโดยฉัน) ดังนั้นสตริงตัวแทนผู้ใช้จะเหมือนกับที่รายงานตัวเองว่าเป็น "Mozilla / 4.0" และ MSIE 7.0 แต่ IE9 จะเป็น Trident / 5.0 เสมอไม่ว่าจะระบุว่า MSIE 7.0, MSIE 8.0 หรือ MSIE 9.0 ก็ตาม

จริงๆแล้วคุณควรตรวจสอบการรวบรวมที่ยอดเยี่ยมนี้: Browser ID (User-Agent) Stringsหรือดีกว่าuseragentstrings.com


1
สวัสดี moontear ฉันยังเห็นว่าควรจะมี "Trident / 5.0" เมื่อ IE9 อยู่ในโหมด IE7 แต่นั่นไม่ใช่สิ่งที่ฉันเห็นใน IE9 (สุดท้าย) บน Win7 Pro x64 มันไม่แสดงตรีศูลเลยในโหมด IE7 (ซึ่งเป็นลักษณะของ IE7 ที่แท้จริง) และมันแสดงตรีศูล 4 ในโหมด IE8 (อีกครั้งสิ่งที่ IE8 จริงดูเหมือน) ฉันใช้เครื่องมือสำหรับนักพัฒนา IE9 ก่อนแบบเลื่อนลงเพื่อเลือกโหมดเบราว์เซอร์จากนั้นในแถบที่อยู่แจ้งเตือน javascript: alert (navigator.userAgent)
Dee2000

1
"Trident / 5.0" มีอยู่ในสตริง user-agent ของ IE9 ในทุกโหมด
EricLaw

ดังที่ EricLaw กล่าวว่าดี ต้องมีตรีศูล / 5.0 เมื่อคุณใช้โหมดความเข้ากันได้ (อาจแตกต่างกันสำหรับโหมดเบราว์เซอร์?) คุณตรวจสอบสตริงตัวแทนผู้ใช้อย่างไร ลองตรวจสอบผ่านwhatsmyuseragent.comแล้วแจ้งกลับ
Dennis G

ดูคำตอบของฉันด้านล่าง (ฉันต้องใช้รหัส Dee2001 อื่นเนื่องจากกฎ 8 ชั่วโมงของ stack overflow เกี่ยวกับการเพิ่มการตอบกลับไปยังข้อความของคุณเอง) ใช่ Eric และ Moontear ถูกต้องทั้งคู่ตรีศูล / 5.0 มีอยู่ในโหมดทั้งหมดของ IE9 ความผิดพลาดครั้งใหญ่ของฉันคือการเปลี่ยน "โหมดเบราว์เซอร์" เป็น IE7 หรือ IE8 ในเครื่องมือของนักพัฒนา แต่นั่นไม่ใช่ "โหมด" ที่หน้า / เมตาแท็ก / รายการความเข้ากันได้สามารถบังคับใช้ได้ แต่เป็นการจำลองเบราว์เซอร์ด้วยตัวเองจริงๆดังนั้นสตริง useragent จึงเหมือนกับ IE7 / 8 อย่างแท้จริง
Dee2000

1
ลงตัวนี้! ขอบคุณมาก. ฉันไม่ได้จัดสไตล์ตามเบราว์เซอร์ที่รายงาน แต่ฉันกำลังตั้งค่าแถบคำเตือนที่ด้านบนของไซต์ที่ฉันกำลังดำเนินการซึ่งระบุว่าผู้ใช้ต้องอัปเกรด (ถ้าเช่นแท็กตามเงื่อนไขบอกว่าน้อยกว่าหรือเท่ากับ ie7) - ฉันไม่ต้องการให้ข้อความแจ้งว่าอัปเกรดในกรณีนี้ แต่ปิดใช้งานโหมดความเข้ากันได้ดีกว่า
Chelsea Urquhart

47

document.documentMode เป็นวิธีที่ดีที่สุดสำหรับโหมดเอกสาร


17
ขอขยายคำตอบหน่อย บริบทเพิ่มเติม
random_user_name

3
ทำไมคนถึงไม่บวกสิ่งนี้มันคือสิ่งที่จำเป็น
Jamie Hutber

5
นั่นเป็นวิธีที่ดีที่สุด คุณสามารถใช้วิธีนี้: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. IE7 จริง (!) และที่ไม่ใช่ IE ทั้งหมดกลับ 'ไม่ได้กำหนด' เฉพาะ IE8 / 9 ใน Comp โหมด return 7. ฉันไม่สามารถทดสอบ IE10 ได้ แต่ก็น่าจะเหมือนกัน
Frank Conijn

2
เพิ่งลองใช้ใน IE10 ที่ด้านข้างด้วยแท็กเมตาขอบ โดยปกติจะส่งกลับ "10" บังคับให้เปิดโหมดความเข้ากันได้สำหรับทุกไซต์และจะยังคงส่งกลับ "10"
Whelkaholism

ใช้ได้กับฉันใน IE10 และ IE11 Preview
Simon Keep

20

IE7 ไม่มีข้อมูลใด ๆ เกี่ยวกับ Trident

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

IE8 มีสตริงนี้: "Trident / 4.0"

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

IE9 มีสตริงนี้: "Trident / 5.0"

IE9 ในโหมดความเข้ากันได้:

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

IE9 ในโหมดปกติ:

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

1
เยี่ยมมาก IE10 เพิ่มตรีศูลด้วยหรือไม่?
slotishtype

3
Internet explorer 10 ผู้ใช้ Trident / 6.0 .... ดูblogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype

1
และ IE11 ใช้ Trident / 7.0
Dee2000


11

ฉันหวังว่า IE9 จะมีคุณสมบัติบางอย่างที่มีอยู่และสามารถทดสอบได้ไม่ว่าจะอยู่ในโหมด 7, 8 หรือ 9 ก็ตาม

ตรวจสอบเช่นstyle.opacityซึ่งเปิดตัวใน IE9 และพร้อมใช้งานโดยไม่คำนึงถึงโหมดความเข้ากันได้:

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

1
ขอบคุณดร. โมลฉันจะลองและรายงานกลับ
Dee2000

น่าเสียดายที่ใช้งานได้กับโหมดเบราว์เซอร์เท่านั้น (เมนูแบบเลื่อนลงด้านซ้ายในเครื่องมือสำหรับนักพัฒนา IE9) ใช้ไม่ได้กับโหมดเอกสาร (เมนูแบบเลื่อนลงทางขวามือ) สำหรับโหมดเอกสารจะทำงานในโหมดเอกสาร IE9 เท่านั้น หากอยู่ในโหมด IE8, IE7 หรือ Quirks ตรรกะนั้นจะล้มเหลว
Dee2000

7
ไอ้ขวาของคุณ ฉันพบคุณสมบัติอื่นที่เหมาะกับฉันในทุกโหมด: window.performance
Dr.Molle

@ Dee2000: มันใช้ได้กับ DocumentMode ด้วย กล่าวคือเฉพาะในกรณีที่ DocumentMode = "Internet Explorer 9 standard" ทำการทดสอบนี้สำเร็จ
Niklas Bäckman

@ ดร. โมลขอบคุณสำหรับสิ่งนี้ window.performance ทำงานได้ดี
lewsid

3

บางครั้งจำเป็นต้องอ่านสตริงตัวแทนผู้ใช้จากตัวแปรเซิร์ฟเวอร์ไม่ใช่จากวัตถุเนวิเกเตอร์จาวาสคริปต์

เปรียบเทียบความแตกต่าง:

  • ASP คลาสสิกIE11

    • javascript ไคลเอนต์ navigator.userAgent: " Mozilla / 5.0 (เข้ากันได้; MSIE 9.0; Windows NT 6.1; WOW64; ตรีศูล / 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 ของเซิร์ฟเวอร์ Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) เช่น Gecko "

  • ASP classic โหมดความเข้ากันได้ของ IE11 :

    • javascript ไคลเอนต์ navigator.userAgent: " Mozilla / 5.0 (เข้ากันได้; MSIE 9.0; Windows NT 6.1; WOW64; ตรีศูล / 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 เซิร์ฟเวอร์ Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (เข้ากันได้; 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

จากhttps://stackoverflow.com/a/29288153/2879498

สมมติว่าคุณมีองค์ประกอบที่ซ่อนอยู่พร้อมคำเตือนเกี่ยวกับรหัส:

Javascript พร้อม 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();
});

การตรวจจับและคำเตือนแนวป้องกันแรกและสุดท้ายของคุณจากนรกความเข้ากันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.