ตามค่าเริ่มต้น IE8 จะบังคับให้เว็บไซต์อินทราเน็ตเข้าสู่โหมดที่เข้ากันได้ ฉันลองเปลี่ยนเมตาดาต้าเป็น IE8 แต่ไม่ยอมรับเมตาดาต้าส่วนหัวและใช้การตั้งค่าเบราว์เซอร์ ไม่มีใครรู้วิธีปิดการใช้งานนี้
ตามค่าเริ่มต้น IE8 จะบังคับให้เว็บไซต์อินทราเน็ตเข้าสู่โหมดที่เข้ากันได้ ฉันลองเปลี่ยนเมตาดาต้าเป็น IE8 แต่ไม่ยอมรับเมตาดาต้าส่วนหัวและใช้การตั้งค่าเบราว์เซอร์ ไม่มีใครรู้วิธีปิดการใช้งานนี้
คำตอบ:
เป็นไปได้ที่จะแทนที่โหมดความเข้ากันได้ในอินทราเน็ต
สำหรับ IIS เพียงเพิ่มโค้ดด้านล่างลงใน web.config ทำงานให้ฉันด้วย IE9
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=edge" />
</customHeaders>
</httpProtocol>
</system.webServer>
เทียบเท่ากับ Apache:
Header set X-UA-Compatible: IE=Edge
และสำหรับ nginx:
add_header "X-UA-Compatible" "IE=Edge";
และสำหรับ express.js:
res.set('X-UA-Compatible', 'IE=Edge')
Michael Irigoyen ถูกต้อง แต่มันซับซ้อนกว่าเล็กน้อย ...
หากคุณกำลังใช้งานหม้อไอน้ำที่ยอดเยี่ยมโดย Paul Irish คุณจะมีสิ่งต่อไปนี้: -
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
สิ่งนี้จะไม่ทำงานอย่างที่คาดไว้และบังคับให้ IE เข้าสู่โหมดความเข้ากันได้ในสภาพแวดล้อมของอินทราเน็ตหากคุณได้เลือก "แสดงเว็บไซต์อินทราเน็ตในมุมมองที่เข้ากันได้" คุณต้องลบข้อคิดเห็น IE แบบมีเงื่อนไขเพื่อป้องกันโหมดความเข้ากันได้ของอินทราเน็ต
ดังนั้นรหัสต่อไปนี้จะใช้งานได้:
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
โดยทั่วไปหากคุณทริกเกอร์การแสดงความคิดเห็นตามเงื่อนไข IE ก่อนที่จะ<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
แถลงการณ์คุณจะถูกบังคับให้เข้าสู่โหมดความเข้ากันได้ในสภาพแวดล้อมอินทราเน็ตหากคุณใช้ IE9 ด้วยการตั้งค่าเริ่มต้น
อัปเดต - ข้อมูลเพิ่มเติม: แต่โปรดทราบว่ามีเคล็ดลับที่จะทำให้การต้ม HTML5 ทำงาน:
เพิ่มความคิดเห็นแบบมีเงื่อนไข emtpy ต่อหน้า DOCTYPE และทราบเป็นอย่างดีว่าเมื่อคุณทำว่าแล้วคุณสามารถยังเพิ่มเงื่อนไขความเห็นรอบX-UA-Compatible
สั่งทำให้หน้า HTML5 ถูกต้องเช่นกัน ตัวอย่างเช่น:
<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
บล็อกโพสต์ที่ได้รับแรงบันดาลใจจากส่วนแรกของคำตอบนี้มีรายละเอียดมากขึ้น และโดยวิธีการ:ตามที่ระบุไว้ในโพสต์บล็อกที่หนึ่งยังสามารถเปลี่ยนความคิดเห็นเงื่อนไขก่อน DOCTYPE ที่มีเงื่อนไขกึ่งแสดงความคิดเห็นกับไม่มีเงื่อนไข<!--[]-->
: ดังนั้นเช่น:
<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
แต่โปรดทราบว่าตัวแปรหลัง ( <--[]--><!DOCTYPE html>
) จะตามที่อธิบายไว้เช่นโดยคำตอบของคำถามอื่นนี้ให้เปิดใช้งานปัญหาที่ทราบดีว่า - สำหรับรุ่น IE ดั้งเดิมโดยไม่รองรับX-UA-Compatioble
(อ่าน: สำหรับ IE7 และ IE6) - นำเบราว์เซอร์เข้ามา นิสัยใจคอโหมด
หากคุณดึงเมนู "เครื่องมือ" และเลือก "การตั้งค่ามุมมองที่เข้ากันได้" ในกล่องโต้ตอบที่ด้านล่างคือการตั้งค่า "แสดงอินทราเน็ตไซต์ในโหมดความเข้ากันได้" หากคุณไม่เลือกตัวเลือกนี้ควรแก้ไขปัญหาและ IE จะใช้โหมดตาม DOCTYPE
มีความสับสนจำนวนหนึ่งในคำตอบของคำถามนี้
คำตอบยอดนิยมในปัจจุบันคือโซลูชันฝั่งเซิร์ฟเวอร์ซึ่งตั้งค่าสถานะในส่วนหัว http และความคิดเห็นบางส่วนระบุว่าโซลูชันที่ใช้เมตาแท็กไม่ทำงาน
ฉันคิดว่ารายการบล็อกนี้ให้ภาพรวมที่ดีเกี่ยวกับวิธีการใช้ข้อมูลเมตาที่เข้ากันได้และจากประสบการณ์ของฉันทำงานตามที่อธิบายไว้: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- UA-เข้ากันได้เพื่อสร้างคงทนองค์กรเว็บ applications.aspx
ประเด็นหลัก:
จุดสำคัญอย่างหนึ่ง (และฉันคิดว่าความสับสนมากมายมาจากจุดนี้) คือ IE มี "คลาส" สองโหมด:
โหมดเอกสารจะกำหนดเอ็นจิ้นการเรนเดอร์ (แสดงหน้าเว็บอย่างไร)
โหมดเบราว์เซอร์จะกำหนดว่าสตริงของ User-Agent (UA) ที่ IE ส่งไปยังเซิร์ฟเวอร์คืออะไรโหมดเอกสาร IE เป็นค่าเริ่มต้นและวิธีที่ IE ประเมินความคิดเห็นตามเงื่อนไข
ข้อมูลเพิ่มเติมเกี่ยวกับโหมดเอกสารและโหมดเบราว์เซอร์สามารถพบได้ในบทความนี้: http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for- เว็บไซต์ developers.aspx? เปลี่ยนเส้นทาง = true
จากประสบการณ์ของฉันข้อมูลเมตาความเข้ากันได้จะมีผลเฉพาะกับโหมดเอกสารเท่านั้น ดังนั้นหากคุณใช้การตรวจจับเบราว์เซอร์สิ่งนี้จะไม่ช่วยคุณ แต่ถ้าคุณใช้การตรวจจับคุณสมบัตินี้ควรเป็นวิธีที่จะไป
ดังนั้นฉันขอแนะนำให้ใช้เมตาแท็ก (ในหน้า html) โดยใช้ไวยากรณ์นี้:
<meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta>
ประกาศ: ให้รายการโหมดเบราว์เซอร์ที่คุณทดสอบ
โพสต์บล็อกยังให้คำแนะนำต่อการใช้ EmulateIEX นี่คือคำพูด:
อย่างที่บอกไปแล้วสิ่งหนึ่งที่ฉันแปลก ๆ คือเมื่อแอปพลิเคชันร้องขอ EmulateIE7 หรือ EmulateIE8 โหมดจำลองเหล่านี้เป็นการตัดสินใจด้วยตนเอง ดังนั้นแทนที่จะเจาะจงเจาะจงเกี่ยวกับสิ่งที่คุณต้องการคุณกำลังขอหนึ่งในสองสิ่งแล้วกำหนดว่าของสองสิ่งนั้นโดยดูที่อื่นในรหัสสำหรับ DOCTYPE (และพยายามทำความเข้าใจว่า DOCTYPE จะให้มาตรฐานคุณหรือไม่ หรือนิสัยใจคอที่ขึ้นอยู่กับเนื้อหา - บางครั้งก็เป็นงานที่สับสน) แทนที่จะทำอย่างนั้นฉันคิดว่ามันสมเหตุสมผลมากกว่าที่จะระบุสิ่งที่คุณต้องการโดยตรงแทนที่จะให้คำตอบที่เป็นคำถาม หากคุณต้องการมาตรฐาน IE7 ให้ใช้ IE = 7 มากกว่า IE = EmulateIE7 (โปรดทราบว่านี่ไม่ได้หมายความว่าคุณไม่ควรใช้ DOCTYPE - คุณควรทำ)
ลองเมตาแท็กนี้:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
ควรบังคับให้ IE8 แสดงผลเป็นโหมดมาตรฐาน IE8 แม้ว่าจะมีการทำเครื่องหมาย "แสดงเว็บไซต์อินทราเน็ตในมุมมองที่เข้ากันได้" [สำหรับอินทราเน็ตหรือเว็บไซต์ทั้งหมด] ฉันลองด้วยตัวเองบน IE 8.0.6
ผู้ดูแลระบบของเราแก้ไขปัญหานี้โดยยกเลิกการเลือกช่องทำเครื่องหมายทั่วโลกสำหรับองค์กรของเรา ผู้ใช้ไม่จำเป็นต้องออกจากระบบด้วยซ้ำ
ฉันพบคำตอบที่ใช้งานได้ซึ่งอนุญาตให้แทนที่มุมมองความเข้ากันได้ของอินทราเน็ตที่เลือก เพียงเพิ่มเหตุการณ์ OnInit ของหน้าเว็บของคุณในบรรทัดนี้ (ไม่ต้องใช้ meta หรือ web.config customHeader ที่ต้องการ):
Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
ลองใส่ต่อไปนี้ในส่วนหัว:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
หม้อต้ม HTML5 ของมารยาทพอลไอริช (แต่ทำงานใน XHTML Transitional ด้วย)
ฉันสามารถแทนที่โหมดความเข้ากันได้โดยระบุเมตาแท็กเป็นแท็กแรกในส่วนหัวไม่ใช่เฉพาะเมตาแท็กแรก แต่เป็นและเป็นแท็กแรกเท่านั้น
ขอบคุณ @ stefan.s ที่ให้ฉันตอบคำถามยอดเยี่ยมของคุณ ก่อนที่จะอ่านว่าฉันมี:
สิ่งนี้ไม่ทำงาน
<head>
<link rel="stylesheet" type="text/css" href="https://stackoverflow.com/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >
ย้ายแท็กลิงก์ออกไปและใช้งานได้
งานนี้ :
<head><meta http-equiv="x-ua-compatible" content="IE=9" >
ดังนั้นไคลเอนต์ IE8 ที่ตั้งค่าให้ใช้ความเข้ากันได้จะแสดงผลหน้าเป็นโหมดมาตรฐาน IE8 - content = 'IE = 9' หมายถึงใช้มาตรฐานสูงสุดที่มีให้จนถึงและรวมถึง IE9
นี่ไม่ใช่ทางออก แต่ฉันรู้สึกว่ามันดีที่สุด ในเว็บไซต์อินทราเน็ตของเราเราบอกผู้คนว่า Firefox สามารถเข้าถึงได้เท่านั้นเราไม่ได้รับความกรุณาจากผู้ใช้ IE ในบริเวณนี้ ตรวจสอบตัวแทนผู้ใช้บนเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์และปฏิเสธการเข้าถึงจาก IE และฉันเป็น. NET โปรแกรมเมอร์
ฉันต่อสู้กับปัญหานี้แล้วและต้องการช่วยเสนอวิธีแก้ไขปัญหาและข้อมูลเชิงลึกที่ไม่ซ้ำใคร
เฟรมเวิร์กที่ใช้ AJAX บางตัวจะฉีดจาวาสคริปต์และสไตล์ชีทไว้ที่จุดเริ่มต้น<head>
และทำสิ่งนี้ดูเหมือนว่าจะป้องกันเมตาแท็กที่มีชื่อเสียงที่ใช้งานได้ดี ในกรณีนี้ฉันพบว่าการแทรกลงในส่วนหัวการตอบกลับ HTTP โดยตรงเช่นเดียวกับคำตอบของ Andras Csehi จะแก้ปัญหาได้
อย่างไรก็ตามสำหรับพวกเราที่ใช้ Java Servlets วิธีที่ดีในการแก้ไขปัญหานี้คือการใช้ ServletFilter
public class EmulateFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletResponse response = ((HttpServletResponse)arg1);
response.addHeader("X-UA-Compatible", "IE=8");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
เราสามารถแก้ไขปัญหานี้ได้ในสภาพแวดล้อม Spring-Apache-tomcat โดยเพิ่มหนึ่งบรรทัดเดียวในเมธอด RequestInterceptor -
//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
// Some logic
// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8");
return true;
}
อ้างอิงจาก - วิธีสร้างตัวกรองและแก้ไขส่วนหัวการตอบกลับซึ่งครอบคลุมถึงวิธีที่เราสามารถแก้ไขปัญหานี้ได้ผ่านทาง RequestInterceptor (Spring)
หากคุณต้องการให้เว็บไซต์ของคุณบังคับใช้โหมดมาตรฐาน IE 8 ให้ใช้เมตาแท็กนี้พร้อมกับ DOCTYPE ที่ถูกต้อง:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
สังเกตค่า "EmulateIE8" แทน "IE8" แบบธรรมดา
ตาม IE devs สิ่งนี้ควร "แสดง DOCTYPE มาตรฐานในโหมดมาตรฐาน IE8; แสดง Quirks DOCTYPEs ในโหมด Quirks ใช้แท็กนี้เพื่อแทนที่มุมมองที่เข้ากันได้กับเครื่องไคลเอนต์และบังคับมาตรฐานให้เป็นมาตรฐาน IE8"
ข้อมูลเพิ่มเติมเกี่ยวกับโพสต์บล็อก IE นี้: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx
คำถามนี้เป็นคำถามซ้ำกับกองทัพ "Internet Explorer 8 โหมด" เบราว์เซอร์ในอินทราเน็ต
ตอบมีแสดงให้เห็นว่ามันเป็นไปไม่ได้ที่จะปิดการใช้มุมมองการทำงานร่วมกัน (ในฝั่งเซิร์ฟเวอร์) - https://stackoverflow.com/a/4130343/24267 ดูเหมือนจะเป็นอย่างนั้นเพราะไม่มีคำแนะนำใด ๆ ที่ฉันได้ลองทำ ใน IE8 "โหมดเบราว์เซอร์" ได้รับการตั้งค่าเป็นมุมมองที่เข้ากันได้ของ Internet Explorer 8 ไม่ว่าจะเป็นส่วนหัว X-UA-Compatible ที่คุณส่ง
ฉันต้องทำการจัดการพิเศษสำหรับ IE7 และโหมดความเข้ากันได้ซึ่งทำให้เบราว์เซอร์แสดงผลโดยใช้ IE8 แต่รายงานว่าเป็น IE7 ทำให้รหัสของฉันพัง นี่คือวิธีที่ฉันแก้ไขรหัสของฉัน (ฉันรู้ว่านี่เป็นแฮ็คที่น่ากลัวและฉันควรทดสอบคุณลักษณะที่ไม่ใช่เวอร์ชันของเบราว์เซอร์):
isIE8 = navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 8; if (! isIE8 && navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 7 && navigator.appVersion.indexOf ("ตรีศูล") ! = -1) { // โกหกนี่คือ IE8 ในโหมดที่เข้ากันได้ isIE8 = จริง; }
มีปัญหาเดียวกัน มันทำงานโดยใช้
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
เพิ่มสิ่งนี้ในแท็กส่วนหัวของหน้าเว็บของคุณ (กำหนดเป้าหมายเวอร์ชัน IE ที่คุณต้องการ):
<meta http-equiv="X-UA-Compatible" content="IE=8" />
หมายเหตุสิ่งนี้จะไม่เปลี่ยนความจริงที่เบราว์เซอร์แจ้งว่าอยู่ในโหมดความเข้ากันได้ (เรียกว่าโหมดเบราว์เซอร์) แต่หน้าจะแสดงผลในโหมดมาตรฐาน IE8 หากยังไม่แสดงผลตามที่คุณต้องการอาจเป็นเพราะคุณมีจาวาสคริปต์ที่ตรวจสอบเวอร์ชัน IE อย่างผิดพลาด ดูโพสต์บล็อกต่อไปนี้เพื่อตรวจสอบคุณสมบัติที่คุณควรจะออกจาก keying เพราะแม้ว่าคุณจะตั้งเมตาแท็ก X-UA-รองรับสตริงตัวแทนผู้ใช้จะยังคงพูด MSIE 7.0
ในกรณีของฉันสำหรับการแก้ไขฉันต้องเพิ่มการตรวจสอบโหมดความเข้ากันได้ของ IE7 ฉันใช้รหัส javascript ง่ายๆ
//IE8 and later will have the word 'trident' in its user agent string.
if (navigator.userAgent.indexOf("Trident")>-1) { //do something }
สำหรับผู้อื่นที่กำลังอ่านข้อความนี้เพื่อปิดใช้งานสิ่งนี้ผ่าน GPO สำหรับผู้ใช้ทั้งหมดนี่คือการตั้งค่า:
การกำหนดค่าคอมพิวเตอร์ / แม่แบบการดูแลระบบ / ส่วนประกอบ Windows / Internet Explorer / มุมมองที่เข้ากันได้ / เปิดโหมดมาตรฐาน Internet Explorer สำหรับ Local Intranet
แม้ว่า web.config จะแก้ไขให้ฉันด้วย
เปลี่ยนส่วนหัวใน. htaccess
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
พบวิธีแก้ปัญหานี้ที่นี่: https://github.com/h5bp/html5-boilerplate/issues/378
ความคิดเห็นของ Stefan S เกี่ยวกับโหมดเอกสารเมื่อเทียบกับโหมดเบราว์เซอร์นั้นเกี่ยวข้องกับปัญหาของฉันมาก
ผมมีข้อมูล meta X-UA-เนื้อหาในหน้า navigator.appVersion
แต่ผมฝั่งไคลเอ็นต์ทดสอบรุ่นเบราว์เซอร์ผ่านทาง การทดสอบนี้ไม่ได้สะท้อนข้อมูลเมตาเพราะมันให้โหมดเบราว์เซอร์ไม่ใช่โหมดเอกสาร
คำตอบสำหรับฉันคือการทดสอบdocument.documentMode
สิ่งที่ชอบ:
function IsIE(n)
{
if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
var sDocMode = document.documentMode;
return (isFinite(sDocMode) && sDocMode==n);
}
ตอนนี้เมตาแท็ก X-UA-Content ของฉันสะท้อนในการทดสอบเบราว์เซอร์ของฉัน
ทำไมฉันถึงทำสิ่งที่ขมวดคิ้วอย่างเช่นทดสอบเบราว์เซอร์ ความเร็ว. jQuery Add-in ต่างๆของฉันเช่น tablesorter นั้นช้าเกินไปใน IE6 / 7 และฉันต้องการที่จะปิดมัน ฉันไม่แน่ใจว่าการทดสอบคุณลักษณะของเบราว์เซอร์สามารถช่วยฉันแก้ปัญหานี้เป็นอย่างอื่นได้หรือไม่