ฉันจะตรวจหา IE 8 ด้วย jQuery ได้อย่างไร


102

ฉันต้องการตรวจจับไม่เพียง แต่ประเภทเบราว์เซอร์เท่านั้น แต่ยังรวมถึงเวอร์ชันด้วยโดยใช้ jQuery ส่วนใหญ่ฉันต้องหาว่าเป็น IE 8 หรือไม่

ฉันไม่แน่ใจว่าฉันทำถูกต้องหรือเปล่า

ถ้าฉันทำ :

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

ฉันไม่แน่ใจว่ามันจะใช้ได้กับเวอร์ชัน 8.123.45.6 หรือเปล่า

แก้ไข: โปรดทราบว่า JQuery 2+ ได้ยกเลิกการรองรับ IE8 และต่ำกว่าดังนั้นจึงไม่สามารถใช้เพื่อตรวจหา IE8 ได้อีกต่อไป หากใช้ JQuery เวอร์ชันปัจจุบันจำเป็นต้องใช้โซลูชันที่ไม่ใช่ JQuery


11
คำตอบที่แนะนำด้านล่างแนะนำให้คุณใช้ jQuery.browser อย่างไรก็ตามเอกสาร jQuery ไม่สนับสนุนการใช้ jQuery.browser แต่แนะนำให้คุณใช้ jQuery.support และชี้ไปที่คุณลักษณะที่ไม่ได้รับการสนับสนุนเพื่อตั้งค่าสถานะเบราว์เซอร์ ตัวอย่างเช่นคุณสามารถใช้ if (jQuery.support.opacity == false) {your IE8 and IE7 code}
IberoMedia

นี่เป็นjquery.support.opacityเพียงสิ่งที่ฉันต้องการ ขอบคุณ ...
nrod


หากคุณทำสิ่งต่างๆอย่างถูกต้องคุณแทบจะไม่ต้องทำการตรวจหาเวอร์ชันของเบราว์เซอร์เลย มีสาเหตุที่ทำให้คุณลักษณะนี้ถูกลบออกจาก jQuery และเหตุผลนั้นก็คือการตรวจหาเวอร์ชันของเบราว์เซอร์ถือเป็นการปฏิบัติที่ไม่ดี การใช้การตรวจจับฟีเจอร์แทนจะช่วยแก้ปัญหาได้ในเกือบทุกกรณี
Spudley

2
ฉันจำเป็นต้องตรวจจับ IE8 เนื่องจากเป็นเบราว์เซอร์เดียวที่ใช้ javascript engine ช้ามากจนเปิดกล่องโต้ตอบที่ระบุว่า "คุณต้องการหยุดเรียกใช้สคริปต์หรือไม่" ในหน้านี้และค่าเริ่มต้นคือ "ใช่" หากมีกลไกการตรวจจับคุณลักษณะนี้ฉันจะใช้มัน มิฉะนั้นจะเป็นถ้าเบราว์เซอร์ == IE8 ฉันไม่สามารถปรับแต่งจาวาสคริปต์ให้เหมาะสมได้เพราะเป็นรหัส Treeview ของ Kendo ที่ทำให้เกิด
PandaWood

คำตอบ:


79

มันถูกบันทึกไว้ในjQuery เอกสาร ตรวจสอบ Internet Explorer ด้วย$.browser.msieแล้วตรวจสอบเวอร์ชันด้วย$.browser.version.

อัปเดต: $ .browser ถูกลบออกใน jQuery 1.9

วิธี jQuery.browser () เลิกใช้งานแล้วตั้งแต่ jQuery 1.3 และถูกลบออกใน 1.9 หากจำเป็นก็สามารถใช้ได้เป็นส่วนหนึ่งของปลั๊กอิน jQuery Migrate ขอแนะนำให้ใช้การตรวจจับคุณลักษณะกับไลบรารีเช่น Modernizr


ถ้าฉันทำ: if (jQuery.browser.version> = 8.0) {dosomething} ฉันไม่แน่ใจว่าจะใช้ได้กับเวอร์ชัน 8.123.45.6 หรือไม่
salmane

13
if(jQuery.browser.version.substring(0, 2) == "8.") { ... }มันเป็นสตริงดังนั้นคุณควรจะทำอย่างไร วิธีนี้จะใช้ได้กับ IE8 ทุกเวอร์ชัน
AndiDog

13
jQuery.browserเลิกใช้งานแล้วใน 1.3 และอาจถูกย้ายไปยังปลั๊กอินในอนาคต ดูเอกสาร jQuery.browser
bendytree

โชคดีที่มันยังอยู่รอบ ๆ และไม่มีการพูดถึงการเลิกใช้งาน @bendytree
Alastair

47
jquery.browser ถูกลบออกใน 1.9
Mandeep Jain

173

ฉันคิดว่าวิธีที่ดีที่สุดคือ:

จากต้นแบบ 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]-->

ใน JS:

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

โดยเฉพาะอย่างยิ่งเมื่อ$.browserถูกลบออกจาก jQuery 1.9+


11
นี่เป็นวิธีตรวจจับเวอร์ชัน IE ที่ชาญฉลาดมาก ฉันชอบมาก!
Greg

แต่จะใช้ไม่ได้หากเว็บไซต์ของคุณมีส่วนหัว "Content-type: application / xhtml + xml" มากกว่าความคิดเห็นที่มีเงื่อนไขเหล่านี้จะถูกละเว้น
Philipp

1
ฉลาดมาก ... แต่ควรสังเกตว่าคุณต้องตรวจสอบคลาสปัจจุบันที่เพิ่มโดยเงื่อนไขใน HTML5BP ในขณะนี้ฉันคิดว่าชั้นเรียนคือlt-ie9AOTie8
byronyasgur

2
@meo ฉันชอบการใช้งานนี้ด้วย แต่มีเหตุผลอะไรที่ทำให้ชั้นติดกับ<html>แทนที่จะเป็น<body>?
พัก

@meo น่าสนใจ. ขอบคุณ.
พัก


56

อย่าลืมว่าคุณสามารถใช้ HTML เพื่อตรวจจับ IE8 ได้ด้วย

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

ก่อนที่สคริปต์ทั้งหมดของคุณจะให้คุณตรวจสอบตัวแปร "ie" หรืออะไรก็ได้


4
ไวยากรณ์นี้ยังรองรับตัวเปรียบเทียบ "less than" ("[if lt IE 7]") และ "มากกว่า" ("[if gt IE 8]") อีกด้วย
spiffytech

1
<! - [if lte IE 8]> สำหรับรวม ie8
user227353

1
นี่เป็นวิธีที่ดีที่สุดเพียงแค่เปลี่ยนเส้นทางไปยังหน้าอื่นที่ระบุว่า "ทำไมคุณถึงใช้ IE8" อัพเกรดเดี๋ยวนี้!
Leon Gaban

2
ตามมาตรฐานของวันนี้ฉันจะถามพวกเขาว่าทำไมพวกเขาถึงใช้ IE เลย
TheBuzzSaw

ดูเหมือนว่าจะเป็นทางออกที่ดีที่สุดในตอนนี้เนื่องจาก JQuery 2.1.1 ไม่ทำงานกับ IE8 ดังนั้นจึงไม่สามารถใช้ตรวจจับ IE8 ได้!
Dave

27

document.documentModeไม่ได้กำหนดไว้หากเบราว์เซอร์ไม่ใช่ IE8

จะคืนค่า 8 สำหรับโหมดมาตรฐานและ 7 สำหรับ 'เข้ากันได้กับ IE7'

หากรันเป็น IE7 จะมีฟีเจอร์ css และ dom จำนวนมากที่ไม่รองรับ


9
โปรดทราบว่า IE9 ส่งกลับ 9. ซึ่งควรเป็นคำตอบที่ได้รับการโหวตสูงกว่า แต่ตอนนี้ $ .browser ไม่ใช่ทางออกที่ดีอีกต่อไป ลอง:if ((document.documentMode || 100) < 9) { // IE8
Don McCurdy

if (document.documentMode! == undefined && document.documentMode == 8) {... }
jpprade

สำหรับแอปพลิเคชันบางตัวที่ IE8 ยังคงใช้งานอยู่มากนั่นคือวิธีการของ @ Don McCurdy ในสหรัฐอเมริกานั้นง่ายและมีประสิทธิภาพ ควบคู่กับ Modernizr มันใช้งานได้ดี
cbmtrx

ตอบโจทย์มาก! สิ่งนี้จะส่งคืนหมายเลขเวอร์ชันสำหรับ IE8 ถึง IE11 (เทียบกับ IE5 ถึง IE9 สำหรับความคิดเห็นแบบมีเงื่อนไขหากใครยังต้องการตรวจหา IE7 หรือ IE6 ของแท้ด้วยคุณจะต้องใช้ความคิดเห็นแบบมีเงื่อนไข) โปรดทราบว่าตามเอกสารดังกล่าวอาจส่งคืน0ในขณะที่หน้ากำลังโหลด - "พยายามกำหนดโหมดความเข้ากันได้ของเอกสารในภายหลัง" (เช่นหลังจากเอกสารพร้อม)
user56reinstatemonica8

15

สมมติว่า ...

  • ... นั่นคือเอ็นจิ้นการเรนเดอร์ของ IE เวอร์ชันเก่าที่คุณสนใจในการตรวจจับเพื่อทำให้สไตล์ดูถูกต้องใน IE รุ่นเก่า (มิฉะนั้นให้ใช้การตรวจจับคุณสมบัติ)
  • ... คุณไม่สามารถเพิ่มความคิดเห็นแบบมีเงื่อนไขลงใน HTML ได้เช่นปลั๊กอิน JS ที่สามารถนำไปใช้กับหน้าใดก็ได้ (มิฉะนั้นเพียงแค่ใช้เคล็ดลับของคลาสเงื่อนไขบน<body>หรือ<html>)

... นี่อาจเป็นเคล็ดลับที่ดีที่สุด (ขึ้นอยู่กับตัวแปรที่ไม่ใช่ jQuery ซึ่งมีความยืดหยุ่นน้อยกว่าเล็กน้อย ) จากนั้นจะสร้างการทดสอบเพื่อลบความคิดเห็นตามเงื่อนไขที่เหมาะสม

(ความคิดเห็นแบบมีเงื่อนไขจะถูกละเว้นใน 'โหมดมาตรฐาน' ของ IE10 + - แต่ก็น่าจะใช้ได้เนื่องจาก IE10 + 'โหมดมาตรฐาน' ไม่มีเอ็นจิ้นการเรนเดอร์ที่บ้าคลั่ง!)

วางฟังก์ชั่นนี้:

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;
}

จากนั้นใช้ดังนี้:

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... */ }

ฉันขอแนะนำให้แคชผลลัพธ์ของฟังก์ชันนี้เพื่อที่คุณจะได้ไม่ต้องทำซ้ำ ตัวอย่างเช่นคุณสามารถใช้สตริง(comparison||'')+' IE '+(version||'')เป็นคีย์ในการจัดเก็บและตรวจสอบผลลัพธ์ของการทดสอบนี้ในวัตถุที่ไหนสักแห่ง


9

บันทึก:

1) $ .browser ดูเหมือนจะลดลงใน jQuery 1.9+ (ตามที่ Mandeep Jain ระบุ) มันเป็นเรื่องที่แนะนำให้ใช้.supportแทน

2) $ .browser.versionสามารถคืนค่า "7" ใน IE> 7 เมื่อเบราว์เซอร์อยู่ในโหมด "ความเข้ากันได้"

3) สำหรับ IE 10 ความคิดเห็นตามเงื่อนไขจะไม่ทำงานอีกต่อไป

4) jQuery 2.0+ จะยกเลิกการรองรับ IE 6/7/8

5) document.documentMode ดูเหมือนจะกำหนดเฉพาะในเบราว์เซอร์ Internet Explorer 8 ขึ้นไป ค่าที่ส่งกลับจะบอกคุณในโหมด "ความเข้ากันได้" ที่ Internet Explorer กำลังทำงานอยู่ ยังไม่ใช่ทางออกที่ดีแม้ว่า

ฉันลองใช้ตัวเลือก. support () มากมาย แต่ปรากฏว่าเมื่อเบราว์เซอร์ IE (9+) อยู่ในโหมดความเข้ากันได้มันจะทำงานเหมือน IE 7 ... :(

จนถึงตอนนี้ฉันพบว่ามันใช้งานได้ (kind-a):

(หากไม่ได้กำหนด documentMode ไว้และไม่รองรับ htmlSerialize และ opacity แสดงว่าคุณกำลังดู IE <8 ... )

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

5

หากคุณใช้เบราว์เซอร์เวอร์ชันเบราว์เซอร์จะทำให้ไม่ดีบ่อยนัก คุณไม่ต้องการดำเนินการด้วยตัวเอง แต่คุณสามารถModernizrสร้างโดย Paul Irish และคนฉลาดคนอื่น ๆ มันจะตรวจจับสิ่งที่เบราว์เซอร์สามารถทำได้จริงและใส่คลาสที่ไม่เหมาะสมไว้ใน<html>องค์ประกอบ อย่างไรก็ตามด้วยModernizrคุณสามารถทดสอบเวอร์ชัน IE ได้ดังนี้:

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

Similary คุณสามารถใช้.lt-ie8และ.lt-ie7.


3

คุณควรดูjQuery.supportด้วย การตรวจจับคุณลักษณะมีความน่าเชื่อถือมากกว่าการตรวจจับเบราว์เซอร์สำหรับการเข้ารหัสฟังก์ชันการทำงานของคุณ (เว้นแต่คุณจะพยายามบันทึกเวอร์ชันของเบราว์เซอร์)


3
คุณจะใช้ jQuery.support เพื่อตรวจหา IE8 ได้อย่างไร
BishopZ

หาก AJAX คือสิ่งที่คุณกำลังมองหาคุณสามารถใช้ jQuery.support.ajax ซึ่งจะคืนค่าจริงหากเบราว์เซอร์รองรับ AJAX
Jonathan Lin

คำตอบนี้น่าจะช่วยได้: stackoverflow.com/questions/1944169/…
helgatheviking

3

คุณสามารถตรวจจับประเภทและเวอร์ชันของเบราว์เซอร์ได้อย่างง่ายดายโดยใช้ jquery นี้

$(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');
 }
});

1

ที่นี่คือปลั๊กอินตรวจจับเบราว์เซอร์ Jquery เพื่อระบุการตรวจจับเบราว์เซอร์ / ระบบปฏิบัติการ

คุณสามารถใช้สิ่งนี้เพื่อการจัดแต่งทรงผมหลังจากรวมปลั๊กอินแล้ว

$("html").addClass($.os.name);
$("body").addClass($.browser.className);
$("body").addClass($.browser.name);

0

คุณสามารถใช้ $ .browser เพื่อตรวจหาชื่อเบราว์เซอร์ ค่าที่เป็นไปได้คือ:

  • webkit (ณ jQuery 1.4)
  • ซาฟารี (เลิกใช้แล้ว)
  • โอเปร่า
  • msie
  • โมซิลลา

หรือรับแฟล็กบูลีน: $ .browser.msie จะเป็นจริงหากเบราว์เซอร์เป็น MSIE

สำหรับหมายเลขเวอร์ชันหากคุณสนใจเฉพาะหมายเลขรุ่นหลัก - คุณสามารถใช้ parseInt ($. browser.version, 10) ไม่จำเป็นต้องแยกวิเคราะห์สตริง $ .browser.version ด้วยตัวคุณเอง

อย่างไรก็ตามคุณสมบัติ $ .support มีให้สำหรับการตรวจจับการสนับสนุนสำหรับคุณสมบัติเฉพาะแทนที่จะใช้ $ .browser

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